namespace 命名空间
命名空间是什么?由来?
命名空间是一种域,叫命名空间域。是为了防止我们在项目中定义标识符时重名而产生冲突才出现的。可以将变量,函数,类等放在命名空间中。std就是c++标准库中定义的命名空间,cin, cout, 等就在其中,要使用它们就要指定std这个命名空间。
:: 域作用限定符
使用:
std::cout
即 域名::标识符
域作用限定符使用时放在标识符前,域之后,表示要使用那个域中的东西。
域作用限定符前也可以留空白,表示使用全局域(如全局变量)如:
int a = 6; //全局变量
int main()
{
int a = 1;
std::cout << a << '\n'; //不作限定优先使用局部域
std::cout << ::a << '\n'; //使用全局域
return 0;
}
输出结果为:
1 //局部变量的 a
6 //全局变量的 a
命名空间的使用
1. 使用::限定命名空间
每次要用到某个命名空间中定义的内容时在表示符前加上命名空间和域作用限定符,比如使用 cout:
std::cout
2. 使用 using
关键字
using 可以在全局域中使用,导入整个命名空间:
using namespace std;
注意这样操作是直接把整个命名空间展开到全局域,可能会与其他同名标识符产生冲突,不推荐使用
using 还可以只导入命名空间中的某个成员:
using std::cout; //此时 std 前不可加 namespace 关键字
这种用法非常方便,不用每次使用 cout 都加上域作用限定符了。
命名空间的定义
使用关键字namespace
后跟命名空间名称和代码声明,比如定义一个叫 sp 的命名空间:
namespace sp{
int a; //代码声明
} //最后不用加分号
命名空间可以嵌套定义
namespace sp{
int a;
namespace sp_2{ //在命名空间sp内再定义一个命名空间sp_2
int a;
}
}
可以这样访问 sp_2 中的 a : sp::sp_2::a
命名空间可以定义在几个不同的部分中
简单地理解就是如果定义了两个或以上同名的命名空间,那这些命名空间实际上会合并成一个,所以在这些命名空间中自然不能出现相同的标识符。命名空间的各个部分也能定义在不同的文件中。
即:
namespace sp
{
int a = 1;
}
namespace sp
{
int b = 2;
}
等价于:
namespace sp
{
int a = 1;
int b = 2;
}