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. 一个蒟蒻对FFT的理解(蒟蒻也能看懂的FFT)

    建议同学们先自学一下"复数(虚数)"的性质.运算等知识,不然看这篇文章有很大概率看不懂. 前言 作为一个典型的蒟蒻,别人的博客都看不懂,只好自己写一篇了. 膜拜机房大佬 HY 一. ...

  2. Python中如何将二维列表转换成一维列表

    已知:a = [(4,2,3), (5, 9, 1), (7,8,9)]希望将二维列表转换成一维列表:["4,2,3", "5, 9, 1", "7, ...

  3. ng-book札记——HTTP

    Angular拥有自己的HTTP库,可以用于调用外部API. 在JavaScript世界里有三种方式可以实现异步请求,Callback,Promise与Observable.Angular倾向于使用O ...

  4. Go 语言基础语法

    Go 标记 Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号.如以下 GO 语句由 6 个标记组成: fmt.Println("Hello, World!") ...

  5. jQuery – AJAX load() 方法

    jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 语法: $(selector). ...

  6. PHP 5 Array 函数

    PHP Array 简介 PHP Array 函数允许您访问并操作数组. 支持简单的数组和多维数组. 安装 PHP Array 函数是 PHP 核心的组成部分.无需安装即可使用这些函数. PHP 5 ...

  7. Java中的Lock锁

    Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...

  8. HDFS基本原理及数据存取实战

    ---------------------------------------------------------------------------------------------------- ...

  9. Swift:消除Null值

    由于在现代编程语言中这个无所不在的概念,许多程序猿可能倾向于相信null值是一个必须存在的瑕疵,创建一个没有它的编程语言是不可能的.他们可能会惊奇那些许多没有null值活的也很好的语言,这带来的结果就 ...

  10. Android样式(style)和主题(theme)

    样式和主题 样式是指为 View 或窗口指定外观和格式的属性集合.样式可以指定高度.填充.字体颜色.字号.背景色等许多属性. 样式是在与指定布局的 XML 不同的 XML 资源中进行定义. Andro ...