简介C语言一般被认为是面向过程的语言,因为自身的特点,写面向过程的代码比较容易,当然也不排除使用C语言编写面向过程Linux的代码,如Linux和国内流行的物联网操作系统RT-Thread的源代码,都是在内核中使用C语言实现的面向对象代码来实现的。与C语言相比,C++更能实现面向对象程序设计,比C语言有更多的特点。让我们假设有这样的需求。现在需要描述两个人的信息,姓名,职业,年龄,产量。我们首先使用C语言的设计思想来实现这个功能。C语言描述如果用C语言来描述上面的问题,大部分人都会想到用一个结构体来完成这个需求,写出的程序会是这样:#includestructperson{char*name;整合;char*work;};intmain(intargc,char**aggv){structpersonpersons[]={{"wenzi",24,"programer"},{"jiao",22,"teacher"},};chari;for(i=0;i<2;i++){printf("nameis:%s,ageis:%d,workis:%s\n",persons[i].name,persons[i].age,persons[i].work);}}以上是比较初级的写法。如果对C语言比较了解的人来写这个程序,他会使用函数指针来把代码写得更巧妙。代码如下示例:#includestructperson{char*name;intage;char*work;void(*printInfo)(structperson*per);};voidprintInfo(structperson*per){printf("Thepeople'snameis:%s,ageis:%d,workis:%s\n",per->name,per->age,per->work);}intmain(intargc,char**argv){structpersonper[2];per[0]={"wenzi",18,"programer",printInfo};per[1]={"jiaojiao",18,"teacher",printInfo};per[0].printInfo(&per[0]);per[1].printInfo(&per[1]);}使用函数指针的方式来写这个程序,程序变得更加简洁,并且在main函数中少了for循环除了引入ringC++,有没有更好的写法?这时候就必须引入C++的特性了。上面的代码中,在函数执行的时候传入了参数,那怎么能把上面提到的参数也省略呢,看下面的代码#includestructperson{char*name;intage;char*work;voidprinfInfo(void){printf("Thepeople'snameis:%s,ageis:%d,workis:%s\n",name,age,work);}};intmain(intargc,char**argv){structpersonpersons[]={{"wenzi",18,"program"},{"jiao",18,"teacher"},};persons[0].prinfInfo();persons[1].prinfInfo();return0;}上面的代码利用了C++的特点,在结构体中定义了函数,然后也可以直接调用函数。与上面C语言的代码相比,它没有实际参数,代码看起来比C语言更简洁。其实在C++中,它有自己独特的机制来实现上面的代码,就是要说明的类。上课后,我们可以这样写代码:#includeclassperson{public:char*name;intage;char*work;voidprintInfo(void){printf("Thepeople'snameis:%s,ageis:%d,workis:%s\n",name,age,work);}}intmain(intargc,char**argv){personpersons[]={{"wenzi",18,"program"},{"jiao",18,"teacher"},};persons[0].prinfInfo();persons[1].prinfInfo();return0;}以上是C++的简单介绍过程。C++的数据访问控制但是为了能够改变类中的数据,同时也让改变不越界,避免随意改变,我们可以这样定义这个类:#include#includeclassPerson{private:char*name;intage;char*work;public:voidPrintInfo(void){cout<<"nameis:"<#includeusingnamespacestd;classPerson{private:char*name;intage;char*work;public:voidPrintInfo(void){cout<<"nameis:"<150){age=0;return0;}age=a;}};这样定义完类后,就可以访问私有成员了,比如:intmain(intargc,char**argv){Personper;per.setName("wenzi");per.setAge(24);per.PrintInfo();return0;}上面的代码添加了私有访问控制字符。通过在类中定义成员函数,可以读写私有成员。这两个函数,形参都写成char*n和inta,不太直观。例如,如果写成char*name和char*age,成员函数准备如下。voidsetName(char*name){name=name;}intsetAge(intage){if(age<0||age>150){age=0;return0;}age=age;}上面的代码也很容易看出问题,根据C语言的就近原则,name=name是没有意义的,此时需要引入this指针。引入这个指针后的代码如下:#include#includeusingnamespacestd;classPerson{private:char*name;intage;char*work;public:voidsetName(char*name){this->name=name;}intsetAge(intage){if(age<0||age>150){this->age=0;return-1;}this->age=age;return0;}voidprintInfo(void){cout<<"name="<classPerson{private:char*name;intage;char*work;public:voidSetName(char*name);intSetAge(intage;)voidPrintInfo(void);}voidPerson::SetName(char*name){this->name=name;}voidPerson::SetAge(intage){this->age=age;}voidPerson::PrintInfo(void){cout<<"name="<#include"person.h"intmain(intargc,char**argv){Personper;//per.name="zhangsan";per.setName("zhangsan");per.setAge(200);per.printInfo();return0;}可以看到上面的main.cpp中包含了#include"person.h"头文件。实际上,person类是在person.h文件中定义的。person.h文件内容如下:#ifndef__PERSON_H__#define__PERSON_H__classPerson{private:char*name;intage;char*work;public:voidsetName(char*name);intsetAge(intage);voidprintInfo(void);};#endif然后在person.cpp中定义了一个成员函数:#include#include"person.h"voidPerson::setName(char*name){this->name=name;}intPerson::setAge(intage){if(age<0||age>150){this->age=0;return-1;}this->age=age;return0;}voidPerson::printInfo(void){printf("name=%s,age=%d,work=%s\n",name,age,work);}有了以上三个文件后,如何编译呢,这时候需要写一个Makefile,然后简单介绍一下Makefile的语法。总的来说,Makefile规则的核心如下:target...:prerequisitescommand...target是一个目标文件,可以是ObjectFile,也可以是可执行文件。它也可以是一个标签prerequisites是生成目标所需的文件或者目标命令是make要执行的命令(任何shell)。说到核心的东西,我们来看一下我们目前正在编写的Makefile。Makefile如下Show:person:main.person.og++-o$@$^%.o:%.cppg++-c-o$@$链接->执行,这三个过程才能运行。编译就是将源文件编译成中间代码。UNIX中的这个中间代码是.o文件,然后将大量的.o文件合成为可执行文件。这个过程就是链接,最后,执行我们链接的可执行文件。我们看上面的Makefile,person是最终的可执行文件,然后,要生成这个可执行文件,需要main.o文件和person.o文件,然后需要第二个命令来执行这个操作,g++-o$@$^,其中$@表示目标文件,$^表示所有依赖文件。然后,看第三篇,%.o:%.cpp,这里是通配符,表示所有.o文件和所有.cpp文件,表示所有要生成的.o文件都依赖于.cpp文件,则执行的命令为g++-c-o$@$<代表第一个依赖文件。最后,我们需要明确一点,编译过程中会产生一些中间文件和可执行文件。如果我们要清除当前生成的文件,只需要执行makeclean清除生成的.o文件和person文件即可。.函数重载C++不允许变量名重名,但是对于函数来说,重载是允许的,只要函数的参数不同,就完成了函数重载,我们直接看一段关于函数重载的代码:#includeusingnamespacestd;intadd(inta,intb){cout<<"addint+int"<usingnamespacestd;intmain(intargc,char**argv){intm;m=10;int&n=m;int*p=&m;int*p1=&n;cout<<"n="<usingnamespacestd;intadd_one(inta){a=a+1;returna;}intadd_one(int*a){*a=*a+1;return*a;}intadd_one_ref(int&b){b=b+1;returnb;}intmain(intargc,char**argv){inta=99;int&c=a;cout<