命名空间概述在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突 。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的 。
举个例子:
#include <stdio.h>#include <stdlib.h>int rand = 10;int main(){ printf("%d", rand); return 0;}程序编译的结果显示rand重定义了,为什么会这样呢?因为在stdlib.h这个头文件中已经定义了rand这样一个函数,这样就导致了编译器不知道这是一个函数还是一个变量,C语言中无法应对这种冲突,只能通过改名字来避免 。
文章插图
而C++为了解决这个问题,引入了命名空间的概念 。
命名空间的定义定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员 。
//命名空间//A就是命名空间的名字namespace A{ int a; void func() {}}注意事项:
- 命名空间只能写在全局
- 命名空间可以嵌套命名空间
- 命名空间是开放的,随时可以加入新的成员,但是新加入的成员只能在加入后使用
- 匿名命名空间就类似于static
- 命名空间可以取别名
- 分文件编写的时候,如果头文件有两个命名空间,但是里面的成员函数或者成员变量同名的时候,在cpp重实现函数需要加上命名空间
#include<iostream> //引入头文件#include<string>//C++中的字符串using namespace std; //标准命名空间//A就是命名空间的名字namespace A{ //命名空间内既可以定义变量也可以定义函数 int rand = 10; int Sub(int x, int y) {return x + y; } struct ListNode {int data;struct ListNode* next; };}//命名空间的嵌套定义namespace B{ int rand; namespace C {int rand; }}//命名空间是开放的,随时可以加入新成员,但是新成员只能在加入后使用namespace B{ int c;//此时c会合并到命名空间B中,实际上就是个合并的过程}//匿名命名空间namespace{ int d = 5;//命名空间没有名字,就类似于static int d = 50,是个静态全局变量,别的文件无法使用}int main(){ //命名空间的使用 //1.::作用域限定符 //访问A空间的Sub函数 cout << A::Sub(10, 20) << endl; //2.访问嵌套空间 //访问B空间的C空间的rand变量 B::C::rand = 5; cout << B::C::rand << endl; system("pause"); return EXIT_SUCCESS;}using关键字引入using关键字之后,命名空间的使用又变得不一样
- 用using将命名空间的成员引入
1.使用using声明,就不会每次写A::a了,直接用a就可以
2.using A::a声明的意思就是把变量a又在test函数中定义了一次,此时如果在test内部再定义一个int a;就会出错
- 用using namespace 命名空间名称引入
经验总结扩展阅读
- 手机怎么把QQ空间说说一次性全删掉(qq如何恢复删掉的说说)
- 怎么一次性删掉QQ空间里的全部说说(翻看以前qq空间的说说)
- 怎么把空间说说全部清空(qq空间一键清空所有说说)
- 手机QQ空间怎么一次性删除说说求解(怎么一键删除qq说说)
- qq空间说说怎么全部删除(怎样一键清空qq空间)
- 小户型卧室如何设计 小户型卧室空间布局设计
- 恋梦空间郭蓉和谁在一起了?
- 空间站是静止的还是运动的
- 如何注销空间 1980717Z空间
- qq空间说说怎么全部删除(qq空间说说一键恢复)