当前位置: 首页 > 科技观察

第三篇

时间:2023-03-18 19:02:40 科技观察

C++教程适合C语言基础上一篇教程强调了构造函数和析构函数的概念,这也是C++中两个非常重要的概念之一。在今天的教程中,笔者将继续讲述C++与C语言的区别,并对命名空间、静态成员、友元函数、运算符重载等知识点进行详细的讲述。C++namespace命名空间的存在是为了区分不同库中相同的函数名。一个简单的例子可以说明这个问题,在Windows文件系统中,同名的文件可以存在于不同的文件夹中。因为相同的文件在不同的作用域中,在C++中,它们在不同的命名空间中。文件系统结构图:文件系统框图定义namespace命名空间定义使用关键字namespace,后接命名空间名称,如下:namespacenamespace_name{//codedeclaration}为了调用带有命名空间的函数或变量前面需要加上命名空间的名称,如下所示:name::code//code可以是变量或函数示例下面用一个例子来说明命名空间的概念。首先,我们有两个类,一个是Dog,一个是Person,此时有两个同名的函数,它们都输出不同的信息。这时候就需要用到命名空间的概念了。首先,我们在dog.h中定义一个dog类,代码如下:);};voidprintVersion(void);}#endif然后我们看dog.cpp中的内容。代码如下:#include"dog.h"namespaceC{voidDog::setName(char*name){this->name=name;}intDog::setAge(intage){if(age<0||age>20){this->age=0;return-1;}this->age=age;return0;}voidDog::printInfo(void){printf("name=%s,age=%d\n",name,age);}voidprintersion(void){printf("Dogv1");}}OK,看完Dog的代码,我们再来看Person的代码,代码如下:#ifndef__PERSON_H__#define__PERSON_H__namespaceA{classPerson{private:char*name;intage;char*work;public:voidsetName(char*name);intsetAge(intage);voidprintInfo(void);};voidprintfVersion(void);}#endif后面是Person.cpp的代码,具体代码如下:namespaceA{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);}voidprintVersion(void){printf("Personv1\n");}}以上就是定义的两个类,我们看main.cpp的代码:intmain(intargc,char**argv){A::Personper;per.setName("zhangsan");per.setAge(16);per.printInfo();C::Dogdog;dog.setName("wangcai");dog.setAge(1);dog.printInfo();A::printVersion();C::printVersion();return0}在倒数第二行和倒数第二行,我们可以看到如果此时没有命名空间,那么就完全无法区分printVersion函数,加上命名空间后,可以区分静态成员在上面代码的基础上,我们在main函数中定义了几个变量,代码如下:#includeintmain(intargc,char**argv){Personper1;Personper2;Personper3;Personper4;Person*per5=newPerson[10];}那我们怎么知道我们定义了多少个Person对象呢?我们做得到。我们创建一个cnt变量,然后在每次构造函数执行的时候给cnt加一。代码如下:#include#include#includeclassPerson{private:intcnt;char*name;intage;char*work;public:Person(){name=NULL;work=NULL;cnt++;}Person(char*name){this->name=newchar[strlen(name)+1];strcpy(this->name,name);this->work=NULL;cnt++;}Person(char*name,intage,char*work="none"){this->name=newchar[strlen(name)+1];strcpy(this->name,name);this->work=newchar[strlen(work)+1];strcpy(this->work,work);cnt++;}~Person(){if(this->name){cout<<"nameis:"<name;}if(this->work){cout<<"workis:"<work;}}};但是这样写的话就有一个问题,就是我们要实现的功能是看到有几个实例化的Person对象,那么计数cnt应该属于Person类,具体关系如下图所示:但是在上面的代码中,cnt属于Person类的实例化对象,那么如何让cnt属于Person类的实例化对象呢?这时候,我们需要将cnt定义为一个静态类。这样,cnt就属于Person类。定义代码如下:classPerson{private:char*name;intage;char*work;staticintcnt;};那么我们要如何获取cnt的值呢?你可以写一个函数,但是同样的,如果我们写的函数属于整个Person类,那怎么办呢?同样的,我们在前面加上static,代码如下:#include#includeclassPerson{private:char*name;intage;char*work;staticintcnt;public:staticintgetcount(void){returnncnt;}};有了getcount函数,我们就可以调用它,然后打印出来,方法如下:#includeintmain(intargc,char*argv){Personper1;Personper2;Person*per5=newPerson[10];count<<"personnumber="<x=x;}voidsetY(inty){this->y=y;}intgetX(void){returnx;}intgetY(void){returny;}};Pointadd(Point&p1,Point&p2){Pointn;n.setX(p1.getX()+p2.getX());n.setY(p1.getY()+p2.getY());returnn;}intmain(intargc,char**argv){Pointp1(1,2);Pointp2(2,4);Pointresult=add(p1,p2);cout<<"theresultis:"<<"("<