C++ 类的引入,名字空间的意义
有一天,公司来了新人,我要对他的一些属性做些基本的记录。比如,我得知道他的姓名,年龄等。那么通过编程来记录他的这些属性,很明显,我得有一个保存姓名的数组,保存年龄的数组,但是随着记录越来越完善,那么我就得不断的添加数组,如果人不多还好,但是一旦人多了起来之后,每来一个人,都要重开一边数组记录他的基本信息,首先这样代码会变得又烂又长,而且,不便于开发者管理及开发程序。所以,为了解决这种具有同一属性的数据,我们将它们的同一属性封装成一种类型,这种类型在C语言中称为结构体。
当有了这种类型之后,我可以对这些类型进行操作,比如,输出某某的姓名,年龄等等。在C中,我只要调用printf函数,再通过结构题变量的访问方式就可以轻松输出我所想要的信息,那么既然我需要得到他的信息,为何不将这种输出函数一起封装在结构体中呢?不仅仅是输出函数,或者是别的一些对数据进行操作的函数也可以封装在结构体中。
于是,新诞生的C++语言就在C语言的基础上,对结构体进行了强化,就有了类这种数据类型。类这种数据类型是一种既有成员变量又有成员函数的新类型。(哦对了,顺便带一句,C++是一种面向对象的编程语言,而面向对象的三大特征就是:封装、继承、多态)。比如有一下代码:
#include<stdlib.h>#include<stdio.h>classPeople{public:char*name;intage;char*job;public:voidPrintInfo(void){printf("%10s%4d%10s\n",name,age,job);}};intmain(){Peopleperson;person.name="chentong";person.age=20;person.job="student";person.PrintInfo();return0;}
这段代码就是典型的使用类来定义的“人”的类型。
我们都知道,当去一家公司工作的时候,不可能让一个人完成所有代码,每个人都有各自的任务,然后将每个人写的代码放在一起成功运行,才是完成了一个项目。那么比如说,有两名员工A和B,A的任务是写一个关于“人”这个属性的代码,B的任务是写一个关于“狗”这个属性的代码。
那么,这个时候,A就需要将他的代码分为两个文件,一个.cpp,一个.h文件来实现。
如,A的代码:
头文件中的代码:
classPeople{private:char*name;charage;char*job;public:voidSetName(char*name);intSetAge(charage);voidSetJob(char*job);voidPrintInfo(void);};
CPP文件中的代码:
#include<stdio.h>#include<stdlib.h>#include"person.h"#include<iostream>usingnamespacestd;voidPeople::SetName(char*name){this->name=name;}intPeople::SetAge(charage){if(age<0||age>150){this->age=0;return-1;}this->age=age;return0;}voidPeople::SetJob(char*job){this->job=job;}voidPeople::PrintInfo(void){printf("%10s%4d%10s\n",this->name,this->age,this->job);}
B的代码:
头文件中的代码:
classDog{private:char*name;charage;public:voidSetName(char*name);intSetAge(charage);voidDisplayInfo(void);};
CPP文件中的代码:
#include<stdlib.h>#include<stdio.h>#include"dog.h"#include<iostream>usingnamespacestd;voidDog::SetName(char*name){this->name=name;}intDog::SetAge(charage){if(age<0||age>150){this->age=0;return-1;}this->age=age;return0;}voidDog::DisplayInfo(void){printf("%10s%4d\n",this->name,this->age);}
这样以来就分别完成了各自的任务。现在,有第三个员工C,他的任务是在主函数中实现他们两人的代码功能。于是,C的工作代码如下:
#include<stdio.h>#include<stdlib.h>#include<iostream>#include"person.h"#include"dog.h"usingnamespacestd;intmain(intargc,char**argv){Peopleperson;Dogdog;person.SetName("chentong");person.SetAge(20);person.SetJob("student");person.PrintInfo();dog.SetName("hashiqi");dog.SetAge(4);dog.DisplayInfo();system("pause");return0;}
到这里为止,只要三名员工就能完成这个项目。那么,如果这个项目非常复杂,需要1000个人合作完成,大家你写你的,我写我的,可能就会出现,定义了相同的变量名或者是定义了相同的函数名的情况。这样一来,在主函数中使用这些函数时,编译器就无法分清,调用的到底是谁写的函数,毕竟,函数名相同。所以,C++为了解决这样的一个问题,就引入了名字空间这样一个概念,把自己的工作任务需要写的代码,放在自己定义的名字空间中,这样,在主函数中使用时,只要指明是哪个名字空间中的就可以了。比如,A的工作代码,放在了名为P的名字空间中,
namespaceP{voidPeople::SetName(char*name){this->name=name;}intPeople::SetAge(charage){if(age<0||age>150){this->age=0;return-1;}this->age=age;return0;}voidPeople::PrintInfo(void){printf("%10s%4d\n",this->name,this->age);}voidPrintVersion(void){printf("chentongisaperson\n");}}
namespaceP{classPeople{private:char*name;charage;public:voidSetName(char*name);intSetAge(charage);voidPrintInfo(void);};voidPrintVersion(void);}
这样一来,在主函数中使用时,只要指明是哪个名字空间中的,就不会出现,函数名同名,使用时报错的现象了。(名字空间
当多个人同时进行大型项目的程序开发时,可能会出现大家定义的函数名相同的情况,那么,为了解决命名冲突的问题。如果把相同名字的函数放在不同的名字空间内,不会报错,因为互不影响。
)
解决了如何避免多人同时工作,定义的函数名同名的问题。
接下来,又面临了一个新的问题。如何在主函数中,不出任何问题的使用这些定义在各自空间中的类。首先讲第一种,直接在想要使用的类前加上该类的名字空间,比如:
P::Peopleperson;D::Dogdog;
这样以来,就说明了,我使用的是名字空间P中的People类;名字空间D中的Dog类。
当然,也可以不这么用,如果你想,像普通类一样使用,那么你可以在global namespace中定义,
usingP::People;//把People放入globalnamespace,以后可以直接使用People来代替P::PeopleusingD::Dog;//把Dog放入globalnamespace,以后可以直接使用Dog来代替D::Dog
这是第二种使用方式。
当然还有第三种,就是,直接在global namespace中定义
usingnamesapceP;usingnamespaceD;
基本上,到这里为止就差不多把C++中的名字空间给讲清楚了。当然,还有类的使用。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。