C++名称空间学习笔记
三个重要概念:
- 声明区域:可以在其中进行声明(变量、函数等)的区域。
- 潜在作用区域:从声明点开始,至其声明区域的结尾。
- 作用域:变量对程序而言的可见的范围。
举个例子:函数中的某个变量可能会被这个函数中的某个代码块中的同名变量隐藏。
作用:一个名称空间中的名称不会与另一个名称空间中的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。
注意:
- 名称空间可以全局,也可以嵌套,但不能位于代码块中。
- 对于全局名称空间中的某个变量或者函数,可以使用
::
来指定,::
前没有此名称空间的名称:char fetch; int main(){ cin >> ::fetch; return 0; }
。- 两个术语:
- 未限定的名称:未使用
::
限定的名称。- 限定的名称:与上面的定义相反。
- 两个关键知识点:
- using声明:例子:
using std::cout;
- using编译指令:例子:
using namespace std;
前者可以使指定的标识符可用,后者使整个名称空间可用。
两者都增加了名称冲突的可能性。
using编译指令不同于using声明的地方是:前者导入的名称可能会被后面定义的“局部名称”所隐藏,这种情况与 “局部变量 隐藏 全局变量” 的方式类似,使用::
可以解决这个问题。
补充:
名称空间的名称可以被省略(未命名的名称空间),这种名称空间中的名称不能在其所属文件之外被引用。
/**
* 用于测试未命名的名称空间
* 目的是知道如何使用其中的变量
* */
#include <iostream>
// using 声明
using std::cout;
using std::endl;
// 未命名的名称空间
namespace {
int unnamedNameSpace = 10;
}
int main(){
// 访问 未命名的名称空间 中的变量,并尝试修改
cout << "unnamedNameSpace: " << unnamedNameSpace << endl;
unnamedNameSpace = 20;
cout << "unnamedNameSpace: " << unnamedNameSpace << endl;
// 下面的变量将会把上面 未命名的名称空间 中的变量“隐藏”
int unnamedNameSpace = 15;
cout << "unnamedNameSpace: " << unnamedNameSpace << endl;
return 0;
}
$ g++ namespace_test.cpp -o exe && ./exe
unnamedNameSpace: 10
unnamedNameSpace: 20
unnamedNameSpace: 15