c++名称空间
1.声明区域和潜在作用域
i>声明区域
声明区域就是可以进行声明的区域:
- 函数外(全局)
- 函数内(代码块)
ii>潜在作用域
潜在作用域:从声明处开始到声明区域结束
“潜在”的含义:主要是因为同名局部变量可以隐藏全局变量,注意,仅仅是隐藏,我们仍然可以使用。
int b = 3;
int main() {
int b = 1;
cout << ::b << endl;// ::为域解析符号
}
输出:
3
2.名称空间的声明
一个特殊的名称空间:全局名称空间(文件级的声明区域)
在哪里声明?
代码块之外,另一个名称空间之内(名称空间的嵌套)
namespace <名称空间名> {
...
}
名称空间中可声明:变量,函数,结构, 另一个名称空间(名称空间可嵌套)
函数原型于函数定义可以分别在两个文件中的同名名称空间声明
头文件
/* xxx.h */
namespace <名称空间名> {
...//其他变量,结构等
void f();
void g();
}
cpp文件
/* xxx.cpp */
namespace <名称空间名> {
void f(){
...
}
void g(){
...
}
}
全局名称空间的名称,可以通过::限定
还是这个例子
int b = 3;
int main() {
int b = 1;
cout << ::b << endl;// ::为域解析符号
}
输出:
3
3.使用名称空间
首先,若在头文件中声明,首先要包含头文件
i>通过 :: 域解析符直接使用
由于名称空间声明在代码块之外(这里不考虑嵌套),所以,名称空间具有文件作用域
因此,可以使用 名称空间名 :: 名称 来使用名称空间内的名称
namespace name {
int a = 3;
}
int main() {
cout << name::a << endl;
return 0;
}
ii>通过using声明——使特定名称具有代码块作用域/文件作用域
1.局部声明,有代码块作用域
namespace name {
int a = 3;
}
int a = 1;
int main() {
using name::a;
cout << a << endl;//这里的a有局部特性,隐藏全局命名空间的a(值为1的a)
//cout << ::a << endl;为输出全局命名空间的a(值为1)
return 0;
}
输出:
3
using声明所具有的局部特性:
- 在using声名的代码块内部(对应上面的例子就是main()中),不得有同名的局部变量,否则会冲突报错
- 会隐藏全局变量,如上例所示
2.全局声明,文件作用域
#include <iostream>
namespace name {
int a = 3;
}
using name::a;
int main() {
using std::cout;
using std::endl;
int a = 1;
cout << a << endl;
return 0;
}
输出:
1
可见,全局使用具有全局特性
iii>通过using编译指令——保留全局特性,隐式的域解析运算
namespace name {
int a = 3;
}
int main() {
using namespace name;
cout << a << endl;
return 0;
}
using编译指令所在的区域,可以直接使用名称,相当于加了域解析运算
全局特性:
namespace name {
int a = 3;
}
int main() {
using namespace name;
int a = 1;
cout << a << endl;
return 0;
}
输出:
1
可以看到,局部变量隐藏了全局,所以,使用using编译指令,名称空间中的名称具有全局特性