一、std标准命名空间
c++标准库中的函数或对象都在命名空间std中定义,比如说编程中常使用的cin、cout、endl等,都需要在std中定义。
当调用c++标准库中的东西时,需要在标准函数库中的函数或对象前写上“std: :”。
#include <iostream>
int main(){
int a = 100;
//没有提前声明命名空间时,需要在标准库对象或函数前加上“std::”
std::cout << a << std::endl;//输出100
return 0;
}
而如果事先定义好using namespace std,这样就不需要在待使用的c++标准库的函数或对象前加“std::”,如下:
#include <iostream>
//增加对标准命名空间的声明
using namespace std;
int main(){
int a = 100;
cout << a << endl;
return 0;
}
这里面“: :”符号起到了限定特定的命名空间的作用,而对该符号的作用讲解在下文有具体阐述。
二、自定义命名空间的使用
1. 自定义命名空间可以根据需要自行命名,可自行对命名空间中的变量或函数进行声明。
#include <iostream>
using namespace std;
namespace name1{
int a;
void print(){
printf("今天是%d号\n",10);
}
}
namespace name2{
int a;
}
namespace name3{
int a;
}
int main() {
name1::a = 20;
name1::print(); //这里输出“今天是10号”
name2::a = 30;
name3::a = 40;
cout << name1::a << name2::a << name3::a << endl;//输出 203040
return 0;
}
通过上面的代码可以发现,命名空间name1、name2、name3中都有对变量a的定义,虽然同名,但事实上这指的是三个不同的变量,可以有效增加标识符的使用率,也能有效避免统一代码不同的编辑者所定义的变量出现重复定义的问题。
2. 命名空间可以嵌套定义,能够嵌套访问。
#include <iostream>
using namespace std;
namespace name{
namespace name1{
void print(){
printf("这里是name%d\n",1);
}
}
namespace name2{
void print(){
printf("这里是name%d\n",2);
}
}
}
int main() {
name::name1::print();
name::name2::print();
/*输出:
这里是name1
这里是name2
*/
return 0;
}
3. 命名空间存在从上至下的覆盖关系,书写不当易导致二义性。
由于代码“using namespace”表示的是将某个命名空间中的所有定义“展开”到当前作用域中,所以这里要注意到不同的命名空间在using的过程中会出现相互覆盖的影响,实际使用应该规避,下图是我对这种影响的解释图:

在主函数中,第一个a只存在于命名空间name1的作用域里,而第二个a同时存在于命名空间name1和name2的作用域里,这也叫做“变量的二义性”。
三、作用域解析运算符“: :”
1. 可以通过该符号进行【命名空间名称的限定】
2. 类成员访问
3. 单个“: :”表示全局作用域。
#include <iostream>
using namespace std;
int a;
namespace name1{
int a;
}
int main() {
a = 100;
name1::a = 200;
cout << ::a << endl; //输出 100
cout << name1::a << endl; //输出 200
}
1042

被折叠的 条评论
为什么被折叠?



