1.命名空间定义以关键字namespace开始,后接命名空间的名字。

2.命名空间可以在全局作用域或其他作用域内部定义,但不能在函数或类内部定义。

3.定义在命名空间中的实体称为命名空间的成员。像任意作用域的情况一样,命名空间中的每个名字必须引用该命名空间的唯一实体。

4.与其他作用域不同,命名空间可以在几个部分中定义。命名空间由它的分离定义部分的总和构成,命名空间是累积的。一个命名空间的分离可以分散在多个文件中,在不同文本文件中的命名空间定义也是累积的。

5.在命名空间的内部定义的函数可以使用同一命名空间中定义的名字的简写形式。也可以在命名空间定义的外部定义命名空间成员,用类似于在类外部定义类成员的方式:名字的命名空间声明必须在作用域中,并且定义必须指定该名字所属的命名空间。

6.虽然可以在命名空间定义的外部定义命名空间成员,对这个定义可以出现的地方仍有些限制,只有包围成员声明的命名空间可以包含成员的定义。

7.定义在全局作用域的名字是定义在全局命名空间中的。全局命名空间是隐式声明的,存在于每个程序中。因为全局命名空间是隐含的,它没有名字,所以记号::member_name引用全局命名空间的成员。

8.一个嵌套命名空间即是一个嵌套作用域——其作用域嵌套在包含它的命名空间的内部。嵌套命名空间中的名字遵循常规规则:

(1)外围命名空间中声明的名字被嵌套命名空间中同一名字的声明所屏蔽;

(2)嵌套命名空间内部定义的名字局部于该命名空间;

(3)外围命名空间之外的代码只能通过限定名引用嵌套命名空间中的名字。

9.命名空间可以是未命名的,未命名的命名空间在定义时没有给定名字。未命名的命名空间以关键字namespace开头,接在关键字namespace后面的是由花括号定界的声明块。

10.未命名的命名空间与其他命名空间不同,未命名空间的命名空间的定义局部于特定文件,从不跨越多个文本文件。每个文件有自己的未命名的命名空间。

11.未命名的命名空间用于声明局部于文件的实体。在未命名的命名空间中定义的变量在程序开始时创建,在程序结束之前一直存在。

12.未命名的命名空间中定义的名字可以直接使用,毕竟,没有命名空间名字来限定它们。不能使用作用域操作符来引用未命名的命名空间的成员。

13.未命名的命名空间中定义的名字只在包含该命名空间的文件中可见。如果另一个文件包含一个未命名的命名空间,两个命名空间不相关。两个命名空间可以定义相同的名字,而这些定义将引用不同的实体。

14.未命名的命名空间中定义的名字可以在定义该命名空间所在的作用域中找到。如果在文件的最外层作用域中定义未命名的命名空间,那么未命名的命名空间中的名字必须与全局作用域中定义的名字不同:

inti;
namespace{
int i;
};
//error:ambiguousdefined globally and in an unnested,unnamed namespace
i =10;

15.未命名的命名空间也可以嵌套在另一命名空间内部。如果未命名的命名空间是嵌套的,其中的名字按常规方法使用外围命名空间名字访问:

namespace local{
namespace{
int i;
}
}
local::i= 42;

16.如果头文件中定义了未命名 的命名空间,那么,在每个包含该头文件的文件中,该命名空间中的名字将定义不同的局部实体。

17.一个using声明一次只引入一个命名空间成员,它使得无论程序中使用哪些名字,都能够非常明确。

using std::map;
using std::pair;
using std::size_t;
using std::string;

18.using声明中引入的名字遵循常规作用域规则。从using声明开始,直到包含该using声明的作用域的末尾,名字都是可见的。外部作用域中定义的同名实体被屏蔽。

简写名字只能在声明它的作用域及其嵌套作用域中使用,一旦该作用域结束了,就必须使用完全限定名。

using声明可以出现在全局作用域、局部作用域或者命名空间作用域中。类作用域中的using声明限于被定义类的基类中定义的名字。

19.可用命名空间的别名将较短的同义词与命名空间名字相关联:

namespace cplusplus_primer { /*.....*/ }
namespace primer = cplusplus_primer;

命名空间别名声明以关键字namespace开头,接命名空间的别名,再接=,再接原来的命名空间的名字和分号。如果原来的命名空间名字是未定义的,就会出错。一个命名空间可以有许多别名,所有别名以及原来的命名空间名字都可以互换使用。

20.using指示使我们能够使用命名空间名字的简写形式。与using声明不同,using指示无法控制使得哪些名字可见——它们都是可见的。

21.using指示以关键字using开头,后接关键字namespace,再接命名空间名字。using指示使得特定命名空间的所有名字可见,没有限制。

22.当类包在命名空间中的时候,发生相同的查找:首先在成员总找,然后在类(包括基类)中找,再在外围作用域中找,外围作用域中的一个或多个可以是命名空间:

namespace A{
int i;
int k;
class C1{
public:
C1( ):i(0),j(0) { }
int f1()
{
return k; //return A::k
}
int f2()
{
return h; //error:h is not defined
}
int f3();
private:
int i; //hides A::i within C1
int j;
};
int h = i; // initialized from A::i
} intA::C1::f3()
{
return h; //OK:return A::h
}

除了成员定义例外,总是向上查找作用域:名字在使用之前必须声明。因此,f2中的return语句将不能编译,它试图引用命名空间A中的名字h,但h还没有定义。如果使A中的名字在C1的定义之前定义,h的使用就是合法的。类似的,f3内部对h的使用时正确的,因为f3定义在已经定义了A::h之后。

C++ Primer 有感(命名空间)的更多相关文章

  1. C++ Primer 笔记——命名空间

    1.我们既可以用 using 声明整个空间,也可以声明部分名字. using namespace std; using std::cout; 2.头文件不应包含 using 声明,因为头文件会拷贝到所 ...

  2. 漫长的旅途--C++primer学习-命名空间以及类的自动转换和强制转换

    C++用名称空间来控制名称的作用域: 1不同命名空间的同名变量可以同时存在,不会发生冲突 2命名空间不能出现在代码块中 3我们用作用域运算符::,使用空间名来限定名称,最常用的std::cout 4u ...

  3. C++ Primer 有感(异常处理)

    1.异常是通过抛出对象而引发的.该对象的类型决定应该激活哪个处理代码.被选中的处理代码是调用链中与该对象类型匹配且离抛出异常位置最近的那个. 2.执行throw的时候,不会执行跟在throw后面的语句 ...

  4. C++ Primer 有感(管理类的指针成员)

    C++类的指针成员与其他成员有所不同,指针成员指向一个内存地址,该地址的内存需要我没管理. 我现在分析一下为什么要管理指针成员. 有如下Student类,Student.h如下: [cpp] view ...

  5. C++ Primer 有感(标准库set类型)

    set容器只是单纯的键的集合,键必须为一.set容器不支持下标操作,而且没有定义maped_type类型.在set容器中,value_type不是pair类型,而是与key_type类型相同的类型. ...

  6. C++ Primer 有感(标准库pair)

    与关联容器相关的模板类型,包含两个数据成员,在utility头文件中定义. pair类型提供的操作: pair<T1,T2> p1; pair<T1,T2> p1(v1,v2) ...

  7. C++ Primer 有感(标准库vector及迭代器)

    vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存.引入头文件 #include<vector> 1.vecto ...

  8. C++ Primer 有感(标准库map类型)

    map是键-值对的集合.map类型通常可以理解为关联数组:可以使用键作为下标获取一个值,正如内置数组一样.而关联的本质在于元素的值于某个特定的键相关联,而并非通过元素在数组中的位置获取. 1.map对 ...

  9. C++ Primer 有感(异常处理)(四)

    查看普通函数的声明的时候,不可能知道该函数会抛出什么异常,但是在捕获异常的时候要知道一个函数会抛出什么样的异常,以便捕获异常. 异常说明:指定,如果函数抛出异常,抛出的异常将是包含在该说明中的一种,或 ...

随机推荐

  1. Intellij IDEA自动编译问题

    对IDEA的界面很有爱,但是感到他的项目启动速度太慢了.所以查了资料做了优化. 1:开启自动测试 File->setting->compiler 勾选上上面的,     2修改run/de ...

  2. Linux 下的JDK环境的搭建

    配置jdk环境遇到的问题: 在使用cp指令复制文件夹时,出现错误如下:~/programs/qt$ cp p20_gotocelldialog ./p22_gotocelldialogcp: 略过目录 ...

  3. NOIP2017D2T3 列队—Treap

    NOIP2017列队 Description Sylvia 是一个热爱学习的女孩子.  前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia所在的方阵中有n × m ...

  4. MongoDB 监控

    在你已经安装部署并允许MongoDB服务后,你必须要了解MongoDB的运行情况,并查看MongoDB的性能.这样在大流量得情况下可以很好的应对并保证MongoDB正常运作. MongoDB中提供了m ...

  5. PHP 实例 AJAX RSS 阅读器

    RSS 是一种描述和同步网站内容的格式,是目前使用最广泛的XML应用. RSS 搭建了信息迅速传播的一个技术平台,使得每个人都成为潜在的信息提供者. RSS 阅读器用于阅读 RSS Feed. AJA ...

  6. Docker镜像的实现原理

    Docker 镜像是怎么实现增量的修改和维护的? 每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去. 通常 Union FS 有两个用途, 一方面可以实 ...

  7. Bootstrap3 代码-代码块

    多行代码可以使用 <pre> 标签.为了正确的展示代码,注意将尖括号做转义处理. <p>Sample text here...</p> <pre>< ...

  8. 在ubuntu上搭建交叉编译环境---arm-none-eabi-gcc

    最近要开始搞新项目,基于arm的高通方案的项目. 那么,如何在ubuntu上搭建这个编译环境呢? 1.找到相关的安装包:http://download.csdn.net/download/storea ...

  9. RAP在线接口管理统计部署

    文档: https://github.com/thx/RAP/wiki/home_cn centos上部署 参考:https://github.com/thx/RAP/wiki/deploy_on_c ...

  10. 改进版getpass库

    编程伊始 正式实施 改进版 源码 以数字显示 以自定义分隔符delimiter显示 如何使用 下载及安装 在您的代码中使用 源码下载 总结 用过Linux的都知道,尤其是进行使用包管理软件类似于apt ...