C++ 命名空间

C++命名空间html

假设这样一种状况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,咱们在使用名字以外,不得不使用一些额外的信息,好比他们的家庭住址,或者他们父母的名字等等。ios

一样的状况也出如今 C++ 应用程序中。例如,您可能会写一个名为 xyz() 的函数,在另外一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就没法判断您所使用的是哪个 xyz() 函数。ide

所以,引入了命名空间这个概念,专门用于解决上面的问题,它可做为附加信息来区分不一样库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。函数

定义命名空间spa

命名空间的定义使用关键字namespace,后跟命名空间的名称,以下所示:code

namespacenamespace_name{// 代码声明} htm

为了调用带有命名空间的函数或变量,须要在前面加上命名空间的名称,以下所示:教程

name::code;  // code 能够是变量或函数 get

让咱们来看看命名空间如何为变量或函数等实体定义范围:编译器

实例#include<iostream>usingnamespacestd;// 第一个命名空间namespacefirst_space{voidfunc(){cout<<"Inside first_space"<<endl;   }}// 第二个命名空间namespacesecond_space{voidfunc(){cout<<"Inside second_space"<<endl;   }}intmain(){// 调用第一个命名空间中的函数first_space::func();      // 调用第二个命名空间中的函数second_space::func();     return0;}

当上面的代码被编译和执行时,它会产生下列结果:

Insidefirst_spaceInsidesecond_spaceusing 指令

您可使用using namespace指令,这样在使用命名空间时就能够不用在前面加上命名空间的名称。这个指令会告诉编译器,后续的代码将使用指定的命名空间中的名称。

实例#include<iostream>usingnamespacestd;// 第一个命名空间namespacefirst_space{voidfunc(){cout<<"Inside first_space"<<endl;   }}// 第二个命名空间namespacesecond_space{voidfunc(){cout<<"Inside second_space"<<endl;   }}usingnamespacefirst_space;intmain(){// 调用第一个命名空间中的函数func();      return0;}

当上面的代码被编译和执行时,它会产生下列结果:

Insidefirst_space

using 指令也能够用来指定命名空间中的特定项目。例如,若是您只打算使用 std 命名空间中的 cout 部分,您可使用以下的语句:

usingstd::cout;

随后的代码中,在使用 cout 时就能够不用加上命名空间名称做为前缀,可是std命名空间中的其余项目仍然须要加上命名空间名称做为前缀,以下所示:

实例#include<iostream>usingstd::cout;intmain(){cout<<"std::endl is used with std!"<<std::endl;      return0;}

当上面的代码被编译和执行时,它会产生下列结果:

std::endlisusedwithstd!

using指令引入的名称遵循正常的范围规则。名称从使用using指令开始是可见的,直到该范围结束。此时,在范围之外定义的同名实体是隐藏的。

不连续的命名空间

命名空间能够定义在几个不一样的部分中,所以命名空间是由几个单独定义的部分组成的。一个命名空间的各个组成部分能够分散在多个文件中。

因此,若是命名空间中的某个组成部分须要请求定义在另外一个文件中的名称,则仍然须要声明该名称。下面的命名空间定义能够是定义一个新的命名空间,也能够是为已有的命名空间增长新的元素:

namespacenamespace_name{// 代码声明}

嵌套的命名空间

命名空间能够嵌套,您能够在一个命名空间中定义另外一个命名空间,以下所示:

namespacenamespace_name1{// 代码声明namespacenamespace_name2{// 代码声明}}

您能够经过使用 :: 运算符来访问嵌套的命名空间中的成员:

// 访问 namespace_name2 中的成员usingnamespacenamespace_name1::namespace_name2;// 访问 namespace:name1 中的成员usingnamespacenamespace_name1;

在上面的语句中,若是使用的是 namespace_name1,那么在该范围内 namespace_name2 中的元素也是可用的,以下所示:

实例#include<iostream>usingnamespacestd;// 第一个命名空间namespacefirst_space{voidfunc(){cout<<"Inside first_space"<<endl;   }// 第二个命名空间namespacesecond_space{voidfunc(){cout<<"Inside second_space"<<endl;      }}}usingnamespacefirst_space::second_space;intmain(){// 调用第二个命名空间中的函数func();      return0;}

当上面的代码被编译和执行时,它会产生下列结果:

转自 菜鸟教程
地址http://www.runoob.com/cplusplus/cpp-namespaces.html