命名空间【C++】
一、概念及意义
在C++中,名称(name)可以是符号常量、变量、函数、类和对象等等,而这些名称都是大量存在的,这些名称可能会存在于全局作用域中,为避免程序员在使用各种各样的C++库时,与这些标识符产生冲突。所以,C++引入了关键字namespace(命名空间),来更好的控制标识符的作用域。因此使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染。
我们在编写程序的时候,或多或少遇到过这样的情况:你在编写一些xxx()函数的过程中,并且有些可能用到的库,在这些库中,它也有命名为xxx()的函数。然后编译器在编译的时候不知道你引用的是哪个xxx()函数。命名空间就是用来解决这种类似的问题的。
二、命名空间的定义
namespace 命名空间 {
声明序列(可选)
}
命名空间的成员是定义的命名空间的花括号里面声明的名称。
内部定义:在命名空间的定义内,声明并定义命名空间的成员。
外部定义:只在命名空间的定义内声明成员,而在命名空间的定义之外,定义命名空间的成员。外部定义的格式:命名空间名 :: 成员名......
Example:
namespace name1 { // 命名空间name1的定义
int i; // 命名空间name1的成员i的内部定义
void f() { //命名空间name1的成员f()的内部定义
i++;
}
void g(); // 命名空间name1的成员g()的声明
namespace name2 { // 子命名空间name2的内部定义(命名空间的嵌套)
int i; // 命名空间name2的成员i的内部定义
void f() { // 命名空间name2的成员f()的内部定义
i++; }
void g(); // 命名空间name2的成员g()的声明
}
}
void name1::g() { // 命名空间name1的成员g()的外部定义
i--;
}
void name1::name2::g() { // 命名空间Inner的成员g()的外部定义
i--;
}
注意:
(1)不能在命名空间的定义中声明字命名空间,只能定义字命名空间(即嵌套);
(2)不能在外部定义字命名空间;
(3)不能在外面直接使用“命名空间名::成员名......”来添加新成员,必须在命名空间里先声明才能用外部定义的方法来定义;
(4)可以通过【多次声明和定义同一命名空间,每次添加新成员】的方法来添加新成员。
三、命名空间的使用
1、作用域限定符(::)
对命名空间里的成员的使用需要利用作用域限定符(::),因为命名空间里的成员相当与有一个域的包装。
#include <iostream>
using namespace std;
namespace name1 {
int a = 1;
int b = 2;
int add(int x, int y) {
return x + y;
}
}
int main() {
cout << name1::a << endl << name1::b << endl;
cout << name1::add(1,2) << endl;
}
/*输出结果为:
1
2
3
*/
2、using声明(部分展开)
此方法只会展开命名空间里的部分成员。格式为:using 命名空间名 :: 成员名;
#include <iostream>
using namespace std;
namespace name1 {
int a = 1;
int b = 2;
int add(int x, int y) {
return x + y;
}
}
using name1::a;
int main() {
cout << a << endl;
cout << name1::b << endl;
}
/*输出结果为:
1
2
*/
3、using namespce(全部展开)
此方法展开命名空间里的全部成员。格式为:using namespace 命名空间名;
#include <iostream>
using namespace std;
namespace name1 {
int a = 1;
int b = 2;
int add(int x, int y) {
return x + y;
}
}
using namespace name1;
int main() {
cout << a << endl;
cout << b << endl;
cout << add(1, 2) << endl;
}
/*输出结果为:
1
2
3
*/
四、命名空间取别名
C++引入命名空间,主要是为了避免成员的名称冲突。如果用户都给自己的命名空间取简短的名称,那么这些命名空间本身,也可能发生名称冲突。如果为了避免冲突,而为命名空间取很长的名称,则使用起来就会不方便。这是一个典型的两难问题。
C++为此提供了一种解决方案 —— 命名空间别名,格式为:namespace 别名 = 命名空间名;
参考链接: