一:命名空间的特点
用途:解决命名冲突问题
1.命名空间下可以放函数、常量、变量、结构体、类
namespace A{
int a = 10; //定义了变量
const int c = 2; //定义了常量
void b(){ //定义了函数
}
struct test_struct { //定义了结构体
};
class Person{ //定义了类
};
}
2.命名
空间必须定义在全局的作用域下
3.命名空间可以嵌套命名空间
namespace A{
namespace B{ //嵌套的命名空间
}
}
4.命名空间可以进行别名设置
namespace A{
namespace B{ //嵌套的命名空间
int a = 10;
}
}
namespace C = A::B;
/*这个情况下A::B::a==C::a;
5.命名空间是开放的,随时可以往原先的命名空间中添加内容
namespace A{
int c = 10;
}
往之前的命名空间中添加内容时无需找到之前的命名空间后再添加内容,
只需要重写一个同名的命名空间并往其中添加内容即可。
6.可以申请没有命名的名称空间
namespace {
int d=10;
int e=20;
}
相当于定义了
static int d=10;
static int e=20;
两个静态的全局变量
提到了命名空间我们就不得不说using这个指令。
1.using在c++中有俩种机制,using声明和using 编译指令,他们的共同特点是可以简化对于名称空间中名称的使用。
2.不同点在于using声明使特定的标识符可以使用,而using编译指令使得整个名称空间可用。
namespace A{
int a;
namespace B{
int b;
int c;
}
}
first()//在first函数中使用的是using编译指令,使得在这个函数中可以直接使用
{ //A名称空间中的任意成员。
using namespace A;//常见的using namespace std;就是使用了c++的std名称空间;
a=10;
c=20;
}
second()
{
using A::B::b;//此处使用的是using声明方法,他表示该函数中的b都是这个
b=20; //空间位置中的b。
A::B::c=15;//使用作用域解析运算符::也可以来使用特定的名称空间变量。没有产生相应的作用域
int c=25; //但是::只是使用一次,后续可以声明一个相同名字的变量。不会产生二性
}
如何更好使用名称空间?
六个要点要记牢
-
使用在已命名的名称空间中声明的变量,而不是使用外部全局变量和静态全局变量。
-
如果开发 一个函数库或者类库,将其放在一个名称空间中。
-
仅将编译指令using作为一种将旧代码转换为使用名称空间的权宜之计。
-
不要在有文件中使用using编译指令,这样会掩盖了让哪些名称可用。如果一定要用,也要放在所有预编译命令之后。
-
导入名称时,首选作用域解析符::或者uing声明的方法。
-
另外,对于using声明,将其最好设置为局部而不是全局。对于单个简单的c++程序,例如hello world。使用using编译指令也并非大逆不道的行为。