一.命名空间概念及应用
//参考c++面向对象程序设计
在c++中,我们在使用多文件多人合作完成项目时,同一作用域的每个实体必须拥有唯一的名字,如果不同文件中定义了相同名字的变量或者函数,或者变量名与库函数中的函数或者关键字起了命名冲突,就会报错我们不得不注意这些,然而这样很费时间精力,于是在c++中引用了一个概念:命名空间,即将同一部分的变量和函数划分到一个区域,形成一个新的作用域,而且由于C++大量存在的标识符(变量、函数和类的名称),并且这些标识符处于全局作用域中,为避免命名冲突或命名污染,namespace
对这些标识符的名称进行了本地化,使编译器在全局作用域中不直接检索到这些标识符。这样在不同的命名空间中就可以使用相同的名字,同样可以募集一群具有一定属性意义的变量函数的集合。
作用:
1.解决全局名字冲突的问题
2.将逻辑上相关的一组定义或声明组织在一起,实现模块化的程序设计
二.命名空间的定义及使用
二-1-命名空间的定义
命名空间通常使用namespace关键字定义,如图定义一个名字为universe的命名空间,其中可包含函数与变量,语法形式如下:
命名空间中声明的实体被称为命名空间的成员,成员的名字会自动由命名空间的名字限定,例如universe命名空间的两个成员名字分别为universe::a,universe::rand。不同用户可以声明各自的命名空间,不同命名空间中的成员可以有相同的名字。如:
命名空间的开放性
即可以多次使用同一个标识符来定义命名空间,这些定义会被累积起来。例如:
命名空间的嵌套定义
匿名命名空间
每个源文件中都可以包含一个匿名的命名空间,在这个源文件中,匿名命名空间的成员可以不加限定名使用,例如:
模块化程序设计
在头文件中将一组相关的声明放在同一个命名空间中,以表示他们逻辑的关联,在其中放相关的声明,在源文件中实现定义。
二-2-命名空间成员的使用
1.命名空间别名
namespace 别名 = 命名空间名;
2.using 声明
using声明将一个命名空间的成员引入特定作用域中,在此声明后,该成员可以不加前缀在作用域中使用。语法形式为:
using 命名空间名::成员名
3.using指令
using指令可以将一个命名空间的所有成员引入到特定作用域,这些成员都可以不加前缀使用。
using namespace 命名空间名;
三-标准命名空间std
c++标准库中的所有内容都是在一个名为std的命名空间中声明和定义的。使用标准库要包含相应的头文件,格式为:
#include <header>
例如使用标准I/O流库的程序
#include <iostream>
int main()
{
cout << "Hello ,World"<<endl;
}
但是这段代码不能通过编译,因为cout和endl都是标准命名空间std的成员,所以要加std前缀限定:
std::cout << "Hello,World"<<std :: stdl;
这个错误还可以通过using指令或using声明来修正:
使用namespace 是为了避免全局名字冲突,所以不要将using指令放在头文件中,以避免因为头文件包含而引起的新的全局名字的冲突。因此这种写法也很常见:
using指令只在main函数中起作用