命名空间
1.为什么要出现命名空间 namespace?
在C/C++中,变量名、函数名和类名都是大量存在的,这些名称都将作用在全局作用域中,可能会导致很多冲突。使用命名空间的目的就是对标识符的名称进行本地化,以避免明明冲突或名称污染,namespace 关键字的出现就是针对这种问题的。
2.命名空间的定义
命名空间的定义需要用到关键字 namespace + 命名空间的名字 再加一对大括号即可,大括号内的就是命名空间的成员。
//1.普通的命名空间
namespace N1 //N1为命名空间的名称
{
//命名空间内可以定义变量也可以定义函数
int a;
int add(int left, int right)
{
return left + right;
}
}
//2.命名空间可以嵌套
namespace N2
{
int a;
int b;
int add(int left, int right)
{
return left + right;
}
namespace N3
{
int c;
int d;
int sub(int left, int right)
{
return left - right;
}
}
}
//3. 同一工程中允许出现名字相同的命名空间
// 在编译过程中,编译器会自动合并名字相同的命名空间
namespace N1
{
int mul(int left, int right)
{
return left * right;
}
}
注意:一个命名空间就定义了一个新的作用域,命名空间中所有内容都局限于该命名空间中。
3.命名空间的使用
namespace N2
{
int a;
int b;
int add(int left, int right)
{
return left + right;
}
namespace N3
{
int c;
int d;
int sub(int left, int right)
{
return left - right;
}
}
}
int main(void)
{
std::cout << a; //编译到这里时会出错
return 0;
}
因为a在命名空间N2里。那么到底该怎么用呢?
命名空间的三种使用方式:
-
加命名空间名称及作用域限定符
int main(void) { std::cout << N2::a; return 0; }
-
使用using将命名空间中成员引入
using N2::b; int main(void) { std::cout << N2::a; std::cout << b; return 0; }
-
使用using namespace 命名空间名称引入
using namespace N2; int main(void) { std::cout << N2::a; std::cout << b; int sum = add(1, 5); return 0; }
**注意:**这里推荐使用第一种方式,第二种和第三种有可能会造成名称污染。如果命名空间的名字太长也 可以用第二种方式。不过最好还是第一种。第三种能不用就不用。