命名空间

来源:互联网 发布:信令流量与数据流量 编辑:程序博客网 时间:2024/06/14 05:25

命名空间:分割全局命名空间形成独立的作用域

namespace 名字{    //类,变量,函数,模板声明    :://定义}//不要分号

1.不可定义在函数或类的内部
2.可以被同一空间内的成员直接访问;在空间外的代码需要指出作用域。
3.命名空间可以分成不同的部分。当

namespace 名字{    …}

第二次出现时表示为命名空间添加新成员。

4.将命名空间成员的实现和接口分开存放。
例如在类A 的头文件A.h中

namespace AStuff{    //只存放声明    class A{…};}

在A.cc中,

#include "A.h"//一般不放在命名空间内部//在声明后重新打开命名空间AStuffnamespace AStuff{    //只存放定义    class A{…};}

可以在命名空间的外层空间定义命名空间的成员。

AStuff::AAStuff::operator+(const A& a1,                  const A& a2){      …}

在使用文件user.cc中

#include "A.h"int main(){    using AStuff::A;    A a1;}

查找规则:

  • 由内向外查找
  • 只能查找使用前所声明的名字(除了类的成员函数的定义)
  • 给函数传递的对象为类(包括引用和指针)时,编译器还会查找类所在的命名空间。
  • 程序定义了与标准库同名的函数后,
  • 不同的作用域无法重载函数名CP210
  • 名字查找先于类型检查CP211

5.全局命名空间以隐式的方式命名。直接使用 ::访问外部作用域的成员
6.内层命名空间会隐藏外层命名空间的同名成员,外层空间的代码需要使用::访问内层的成员。
7.内联命名空间

inline namespace FifthA{//inline第一次必须出现   …}

常用于不同版本的代码。
例如上述代码位于FifthA.h中,另外还有FourthA.h

namespace FourthA{   …}
namespace AStuff{#include "FifthA.h"#include "FourthA.h"…}

在命名空间AStuff中可以直接使用FifthA的成员,但是需要通过FourthA::来访问FourthA的成员。

8.unnamed namespace(未命名的命名空间)

  • 该命名空间的变量具有静态的生存周期(在定义后直到程序结束后销毁)。使用unnamed namespace进行静态声明。
  • 不同文件的unnamed namespace相互独立。
  • 该成员的作用域等于该空间所在的作用域。当unnamed namespace位于最外层作用域时,unnamed namespace的名字必须和最外层命名空间不同。

9.别名

namespace A1=A;
  • 在定义后声明别名
  • 可以有多个别名

10.using声明

using wage;
  • 在其声明的作用域内,自声明开始到结束一直有效。
  • 外层作用域的同名实体将被掩藏
  • 在类的作用域中只能指向基类成员

    11.using指示

using namespace A;
  • 不能出现在类的作用域中
  • 使A中所有的名字都在其外层声明作用域都可见
  • 有效范围和using声明一致。但using声明每次只能作用于1个名字
  • 允许和外层作用域的名字相冲突,但使用A中的成员需要指出其作用域。
  • 必须谨慎的使用以防造成命名空间污染,且二义性冲突只有到使用的时候才会被发现。
    在A.cc中,
namespace AStuff{    using namespace AStuff;?    //只存放定义    class A{…};}

translation unit(编译单元):单一目标的源码文件和其所含的头文件
分离式编译:将程序划分成多个文件。当一个文件需要通过declaration(声明用extern关键字)使用别处定义的名字。CP41

extern int i;
原创粉丝点击