为何提出命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字 污染,namespace关键字的出现就是针对这种问题的。
希望通过命名空间解决命名的冲突与污染问题
命名空间提出前,这些名称将都存在于全局作用域中。
问题也出现于此
通过对命名作用域的划分,使得本来都是命名在全局作用域中的名称,被命名空间所分割开
所有名称都有了自己的所处的命名空间
命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名 空间的成员。
namespace name {
声明与定义
}
命名空间的三个特性
1.命名空间中可以定义变量/函数/类型
2.命名空间可以嵌套
3.同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
命名空间的使用
加命名空间名称及作用域限定符
通过作用域限定符,告知编译器该名称是哪个作用域中的
int main()
{
printf("%d\n", N::a);
return 0;
}
使用using将命名空间中某个成员引入
using N::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
return 0;
}
使用using namespace 命名空间名称 引入
using namespce N;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b);
Add(10, 20);
return 0;
}
命名空间与std(标准命名空间)
c++98时,引入了命名空间以解决命名的冲突与污染问题。
但在c++98之前,已经
有一些库函数存在,例如:<iostream.h>、<fstream.h>等
C++标准第一个版本,绝大多数编译器都支持,得到了国际标准化组织(ISO)和美国标准化 协会认可,以模板方式重写C++标准库,引入了STL(标准模板库)
讲所有的库(包括c语言的库)进行了重新编写,所有存在标准命名空间的库,是不以.h为文件后缀的
重写过后的库中,所有的名称是命名于std此命名空间中的,在调用标准库中的名称时,要标明该名称所在的命名空间