命名空间

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

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

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

namespace 名字{
    …
}

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

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

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

在A.cc中,

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

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

AStuff::A
AStuff::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;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值