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. RabbitMQ环境安装

    1.安装erlang 语言环境 安装依赖 yum install ncurses-devel (如果没安装GCC,执行 yum install gcc或者:yum groupinstall " ...

  2. VLAN之间单臂路由通信

    实验目的 理解单臂路由的应用场景 掌握路由器子接口的配置方法 掌握子接口封装VLAN的配置方法 理解单臂路由的工作原理 实验原理 单臂路由解决用户需要跨越VLAN实现通信的情况. 原理:通过一台路由器 ...

  3. Sublime Text3时间戳查看转换插件的开发

    平常配置表中,经常需要用到时间配置,比如活动开始结束.从可读性上,我们喜欢2017-04-27 17:00:00,从程序角度,我们喜欢用1493283600.前者是包含时区概念的,而后者市区无关,所以 ...

  4. 使用FFMPEG在windows平台下推rtmp流

    使用FFMPEG在windows平台下推rtmp流 工作中习惯在Linux下面使用FFmpeg模拟推rtmp流,无奈家中的电脑都是windows系统,需要利用家中的带宽来测试流媒体服务器的性能.所以研 ...

  5. Jmeter(二十)_Mock接口

    首先解释一下什么是mock接口. Mock通常是指,在测试一个对象时,我们构造一些假的对象来模拟与其交互.而这些Mock对象的行为是我们事先设定且符合预期.通过这些Mock对象来测试对象在正常逻辑,异 ...

  6. Openstack: aborted: Block Device Mapping is Invalid

    Issue: When you create an instance, you may encounter following exception: aborted: Block Device Map ...

  7. 基于AOP的iOS用户操作引导框架设计

    背景 有一种现象,App设计者觉得理所当然的操作方式,却常常被用户所忽视,为了防止这种现象发生,就要为App设计一个帮助,一种低成本的方案是将帮助文档写成HTML然后展示给用户,这样的方式常常不能带来 ...

  8. [CSDN_Markdown] 使用LaTeX写矩阵

    简介 LaTeX 的公式功能非常强大,一次性讲全不是件容易的事情.将LaTeX 的这些功能分成较小的相互独立的部分来讲,一方面方便大家单独查阅:另一方面,所有[CSDN_Markdown]相关的文章都 ...

  9. Objective-C基础之简析深浅copy

    一.从面向对象到Objective-C概览copy 1.面向对象: In object-oriented programming, object copying is creating a copy ...

  10. Linux 高性能服务器编程——高性能服务器程序框架

    问题聚焦:     核心章节.     服务器一般分为如下三个主要模块:I/O处理单元(四种I/O模型,两种高效事件处理模块),逻辑单元(两种高效并发模式,有效状态机)和存储单元(不讨论). 服务器模 ...