命名空间
来源:互联网 发布:信令流量与数据流量 编辑:程序博客网 时间: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;
阅读全文
0 0
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- 命名空间
- The meaning of true love
- 23种设计模式(11)-组合模式
- Linux命令sort详解
- OpenCV三种立体匹配求视差图算法总结
- linux查询命令(find、locate和whereis)
- 命名空间
- 窗体部件之QTabWidget
- 简单的Zip压缩与解压
- kali linux web渗透测试中用到的一些重要的工具
- 求平均成绩
- bzoj 1036 树链剖分 解题报告
- java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
- 一个view如何同时响应onTouch和onClick事件
- 5-12 两个数的简单计算器 (10分)