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