C++从入门到放弃
名字空间
1. 名字空间作用
-
避免名字冲突
-
划分逻辑单元
一个大型的工程往往是由若干个人独立完成的,不同的人分别完成不同的部分,最后再组合成一个完整的程序。由于各个头文件是由不同的人设计的,有可能在不同的头文件中用了相同的名字来命名所定义的类或函数,这样在程序中就会出现名字冲突。不仅如此,有可能我们自己定义的名字会与C++库中的名字发生冲突。
名字冲突就是在同一个作用域中有两个或多个同名的实体,为了解决命名冲突 ,C++中引入了命名空间,所谓命名空间就是一个可以由用户自己定义的作用域,在不同的作用域中可以定义相同名字的变量,互不干扰,系统能够区分它们。
2. 定义名字空间
namespace 名字空间名{
名字空间成员1;
名字空间成员2;
....
}
//注:名字空间的成员可以是全局变量,全局函数,类,嵌套名字空间
3. 名字空间成员的使用
1> 作用域限定操作符"::"
::
是一个新符号,称为域解析操作符,在C++中用来指明要使用的命名空间
访问一个具体标识符的时候,可以使用如下形式:
space_name::identifier //名字空间名::要访问的成员;
std::cout //表示访问标准名字空间中的cout对象
std::endl //表示访问标准名字空间中的endl流控制符
2> 名字空间指令
名字空间指令使用形式
using namespace space_name;
using namespace std;
- 在该条指令以后的代码中,对于指定空间里的成员都可见,可以直接访问,省略"名字空间名::"
- 名字空间指令一般用于标准名字空间std
3> 名字空间声明
using space_name::identifier;//using 名字空间名::要访问的成员;
- 将名字空间中特定一个成员引入到声明所在的作用域中,在该作用域访问这个成员就如同访问自己的局部成员一样,可以直接访问,省略"名字空间名::"
- 局部优先原则
注意:"::num"显式访问全局作用域中的num
4. 不属于任何名字空间的成员(全局作用域)
-
没有放在任何名字空间的成员,属于全局作用域,一般可以直接访问;
-
如果全局作用域的成员和局部作用域成员名字一样,将优先访问局部的成员,这时如果还希望访问到全局作用域的成员,可以通过名字空间声明
::xx
来显示指明访问全局作用域的某个成员
#include <iostream>
int num = 100;
int main (void)
{
int num = 200;
cout << num << endl;//num = 200
cout << ::num <<endl;//num = 100;
return 0;
}
5. 无名名字空间
- 定义名字空间可以没有名字,即无名名字空间(匿名名字空间),无名空间中的成员和全局作用域成员类似,可以直接访问,但是将被限制在当前文件中(类似静态全局变量static的效果)
#include <iostream>
namespace {
int num = 100;
}
int main (void)
{
int num = 200;
cout << num << endl;//num = 200
cout << ::num <<endl;//num = 100;
return 0;
}
6. 名字空间的嵌套
- 定义名字空间可以没有名字,即
无名名字空间(匿名名字空间)
,无名空间
中的成员和全局作用域成员类似,可以直接访问,但是将被限制在当前文件中(类似静态全局变量static
的效果)
#include <iostream>
namespase ns1{
int i = 100;
namespase ns2{
int i = 200;
namespase ns3{
int i =300;
}
}
}
int main (void)
{
cout << nsd::i << endl;//100
cout << ns1::ns2::i <<endl;//200
cout << ns1::ns2::ns3::i <<enedl;//300
return 0;
}
7. 名字空间的合并
- 定义名字空间时,如果已存在的名字空间一样,会自动合并成同一个名字空间
//1.cpp
namespase std{...};
//2.cpp
namespase std{...};
2.cpp会自动和1.cpp中std合并成一个空间,名字空间中的成员不可以相同否者会有重定义错误