命名空间
在一个给定作用域中定义的标识符必须是唯一的,对于多人协作开发的庞大而复杂的程序中难免发生名称冲突,在C语言中并不能提供语法层面上的解决方案,只能依靠人为的命名规范,例如使用特殊的命名前缀来解决这一困境,但这样会导致变量名称过长,不利于程序员编写和阅读程序,但C++提供了语法层面的解决方案,那就是使用命名空间来解决命名空间污染的问题。
-
命名空间的定义:
以关键字namespace开始,后接命名空间的名字,在名字后面接着是一对花括号,花括号扩住一块声明和定义,花括号中放入出现在全局作用域的任意声明:如类,全局变量(以及他们的初始化),函数(以及他们的定义),模版以及其它命名空间。注意:命名空间不能以分号结尾。例:
例如:namespace mynamespace { int nNum = .....; class CStu { ....}; }
-
命名空间的定义可以不连续:
作用域必须要连续,而命名空间可以分开在几个部分中定义,一个命名空间可以分散在多个源文件中,它门合起来构成一个完整的命名空间。 -
在命名空间的外部引用命名空间
方法1:使用 “命名空间名称::成员名” 引用命名空间成员,例如: mynamespace::nNum = 3; 方法2:使用using声明后,直接访问,例如: using namespace mynamespace; nNum =3; 这种方式虽然方便,但是当以这种方式引用的其它名称空间中有同名变量时就会发生歧义。 -
全局命名空间:
定义在全局作用域中的名字是定义在全局命名空间中的,全局命名空间是隐式的,它没有名字,可以显式指定使用全局命名空间中的成员:“::标识符”,例如:一个C++类中有一个名称 为A的函数,全局定义中也有一个名称为A的函数,此时要想在类的其他成员函数中使用全局的函数,则需要在A前加上域运算符即可表示使用的是全局中的函数A -
未命名的名称空间:
未命名的名称空间在定义时没有给出名称,未命名的名称空间以关键字namespace开头,后面没有名字,直接跟着一对花括号扩住的声明块,未命名的名称空间不可以跨文件定义和使用,可以在当前文件中不连续定义,引用未命名的名称空间的成员可以直接使用。C++语法提供这一特征主要是想取代在C语言时代中的静态声明,凡是使用static关键字的声明的文件作用域变量和函数都可以使用未命名的名称空间。 -
命名空间别名:
也可以为命名空间起别名,例如:namespace mystd = std;int main(){ mystd::string str = "xxx"; return 0;}
但是不能用typedef为命名空间取别名
C++中的作用域类型
- 局部作用域
- 全局作用域
- 类域
- 命名空间