在c语言中,常有这么一个问题,一个正常运行的项目,当引入了一些外部库之后,会出现一些变量重命名的情况,c语言本身并没有很好的解决方案。只能靠人力去阅读代码并修改变量名。c++中引入了命名空间的概念来解决这个问题。
1:域作用限定符
:: ------域作用限定符。
在c++中两个冒号代表域作用限定符,可以通过使用域作用限定符来访问不同的域。
当没有::时,默认会先在当前函数的局部域中找,没有的话会在到全局域中找
当::前没有域名时,代表全局域
std::代表去std域中找
打个比方,当前函数的局部域就相当于是自家的菜地,种的西红柿;std相当于隔壁一个叔叔的菜地,种的茄子;全局域相当于爷爷奶奶的菜地,种的土豆;如果说我想吃西红柿,直接去地里摘(调用)即可,如果说我想吃土豆,可以给爷爷奶奶打个招呼(通过::调用全局变量),也可以直接地里摘(调用),如果说我想吃隔壁叔叔家的茄子,那必须先和隔壁叔叔打个招呼(std::)
在不同的域中定义变量,可以让同名变量存在
2:自定义域
代码与c语言的结构体有点相似,定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
namespace //域名
{
//域的内容,如int x=10;
}
定义后即可通过 域名:: 来访问域的内容
函数和结构体也是可以被定义在命名空间中的
定义函数
定义结构体
使用命名空间中的结构体的语法为 struct 域名:: 结构体名
当两个命名空间的名字相同时,会把两个命名空间中的元素合并,如果有相同的元素会报错
命名空间可嵌套使用
打个比方,隔壁张三,李四是铁哥们,经常把自己的东西分享给对方
03:展开命名空间
以std为例
部分展开
#include<iostream>
using std::cout;
using std::endl;
int main()
{
cout << "hello world" << endl;
return 0;
}
把std域中的cout和endl拿出来放到全局变量中,此时调用cout和endl时不需要使用std::
可以理解成隔壁张大爷茄子大丰收,他和爷爷是几十年的棋友,马上就给爷爷奶奶送了茄子,这样自己家也可以吃到茄子了
全部展开
#include<iostream>
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
此时把std中的全部变量展开到全局变量,之后调用std中的任何东西都不要需要再加std。这种写法在很多算法题里很常见。