- 最初C++标准中并没有名字空间,要求程序中全局作用域中声明的变量、函数、类型等必须具有唯一的名字
- 如果在同一个程序中有两个名字相同的全局变量将产生命名冲突(和C语言一样)
- 如果程序中引入第三方库就必须保证程序中定义的全局名都不能与所用库中的名字相同,否则就会产生冲突,这就是所谓的全局名字空间污染问题,该问题在大型程序中处理起来非常困难。
- 为此引入了名字空间。在一个名字空间中,可以定义许多不同对象,并将这些对象的有效范围局限在名字空间内。不同名字空间中,可以定义相同名称的对象,只要两个同名对象不在同一名字空间中,就不会引起冲突
名字空间的定义
- 语法格式
namespacexxx_name{members;}- 举例
namespaceABC{intnum;structstu{intage;char*name;};doubleadd(inta,intb){return(double)a+b;}intMin(inta,intb){returna>b?a:b;}}如果使用cout或cin必须有using namespace std;
名字空间成员的访问
- 名字空间成员的访问有主要有三种方法:
通过作用域限定符(::)
#include<iostream>usingnamespacestd;namespacens1{voidfunc(void){cout<<"ns1 func"<<endl;}}namespacens2{voidfunc(void){cout<<"ns2 func"<<endl;}}intmain(void){ns2::func();ns1::func();return0;}using引用名字空间单个成员
#include<iostream>usingnamespacestd;namespacens1{voidfunc(void){cout<<"ns1 func"<<endl;}}namespacens2{voidfunc(void){cout<<"ns2 func"<<endl;}}intmain(void){usingns1::func;ns2::func();//ns1::func();func();return0;}using引用名字空间全部成员
#include<iostream>usingnamespacestd;namespacens1{voidfunc(void){cout<<"ns1 func"<<endl;}inta=100;}namespacens2{inta=200;voidfunc(void){cout<<"ns2 func"<<endl;}}intmain(void){usingnamespacens1;ns2::func();//ns1::func();func();cout<<a<<endl;return0;}无名名字空间
- 未命名的名字空间称作无名名字空间
#include<iostream>//using namespace std;namespacens1{voidfunc(void){std::cout<<"ns1 func"<<std::endl;}inta=100;}namespacens2{inta=200;voidfunc(void){std::cout<<"ns2 func"<<std::endl;}}namespace{//无名名字空间inta=300;}intmain(void){//using namespace ns1;ns2::func();ns1::func();std::cout<<ns1::a<<std::endl;std::cout<<::a<<std::endl;//无名名字空间成员的引用return0;}名字空间嵌套
- 指定义在其他名字空中的名字空间
#include<iostream>usingnamespacestd;namespacens1{voidfunc(void){std::cout<<"ns1 func"<<std::endl;}inta=100;namespacens2{intb=111;}}intmain(void){cout<<ns1::ns2::b<<endl;return0;}