1.我们既可以用 using 声明整个空间,也可以声明部分名字。

using namespace std;
using std::cout;

2.头文件不应包含 using 声明,因为头文件会拷贝到所引用它的文件中去,所以每个使用了该头文件的文件就都会有这个声明。

3.命名空间可以是不连续的。

4.模板特例化必须定义在原始模板所属的命名空间中,和其它命名空间名字类似,只要我们在命名空间中声明了特例化,就能在命名空间外部定义它了。

namespace myspace
{
template <typename T>
void test(const T& t) {}
} template <>
void myspace::test<int>(const int &t) {}

5.全局作用域中定义的名字也就是定义在全局命名空间中,全局命名空间以隐式的方式声明,并且在所有程序中都存在。

int i = ;
::i;

6.嵌套的命名空间中,内层命名空间声明的名字将隐藏外层命名空间声明的同名成员。外层命名空间中无法直接访问内层中的名字。

7.C++11新标准引入了内联命名空间,内联命名空间中的名字可以被外层命名空间直接使用。关键字inline必须出现在命名空间第一次定义的地方,后续再打开命名空间的时候可以写inline也可以不写。

namespace test
{
inline namespace testex
{
int i;
} int j = i; // 正确
}

8.未命名的命名空间中定义的变量拥有静态生命周期,它们在第一次使用前创建,并且直到程序结束才销毁。一个未命名的命名空间可以在某个给定的文件内部连续,但是不能跨越多个文件。每个文件定义自己的未命名的命名空间,而且相互无关。未命名的命名空间中的名字不能与全局作用域的名字重复,也不能使用作用域运算符。如果未命名的命名空间嵌套在其他命名空间中,则可以被外层直接访问。

int i;
namespace
{
int i,j;
} i = ; // 二义性错误
::j; // 错误

9.一个命名空间可以有好几个同义词或别名,而且互相之间是等价的。

10.一条using声明语句一次只引入命名空间的一个成员,可以出现在全局作用域,局部作用域,命名空间作用域以及类的作用域中,在类的作用域中,这样的声明语句只能指向基类成员。using指示和using声明类似的地方是,我们可以使用命名空间名字的简写形式,不同的是,我们无法控制哪些名字是可见的,因为所以名字都是可见的。using指示也不能出现在类的作用域中。

using std::cout;        // using 声明
using namespace std; // using 指示

11.通常情况下,命名空间中会含有一些不能出现在局部作用域中的定义,因此,using指示一般被看作是出现在最近的外层作用域中。但是这也可能会与外层作用域的名字产生冲突,这种冲突时允许存在的。

int j;
namespace myspace
{
int i, j;
} void test()
{
using namespace myspace; // 把myspace::i注入到全局作用域中
int i; // 覆盖了全局作用域的i
j = ; // 二义性
::j = ; // 全局作用域的j
myspace::j = ; // myspace的j
}

12.实参相关的查找与类类型形参。

std::string str;
operator >> (std::cin, str);

上述代码中,operator>> 函数定义在标准库string中,string又定义咋命名空间 std 中。但是我们不用std:: 限定符和using 声明就可以调用operator>>。
原因是,当我们给函数传递一个类类型的对象时,除了在常规的作用域查找外还会查找实参类所属的命名空间。这一例外对于传递类的引用或指针的调用同样有效。

13.友元声明与实参相关的查找。当类声明了一个友元时,该友元声明并没有使得友元本身可见。

namespace A
{
class test
{
friend void func(); // 除非另有声明,否则不会被找到
friend void func1(const test &t); // 根据实参相关的查找规则可以被找到
};
} int main()
{
A::test t;
func(); // 错误,func没有被声明
func1(t); // 正确,通过在A::test中的友元声明找到A::func1
return ;
}

14.uisng声明语句声明的是一个名字,而非一个特定的函数,当我们为函数书写using声明时,该函数的所有版本都被引入到当前作用域中。如果using声明出现在局部作用域中,则引入的名字将隐藏外层作用域的相关声明,如果using所在的作用域中已经有一个函数与新引入的函数同名且形参列表相同,将引发错误。

namespace A
{
void test(int);
} using A::test(int); // 错误
using A::test; // 正确

15.与using声明不同的是,对于using指示来说,引入一个与已有函数形参列表完全相同的函数并不会产生错误。此时只要我们指明调用的是命名空间中的函数版本还是当前作用域的版本即可。

namespace A
{
void test(int) {}
} using A::test; void test(int) {} // 错误
namespace A
{
void test(int) {}
} using namespace A; void test(int) {} // 正确

C++ Primer 笔记——命名空间的更多相关文章

  1. C++ Primer笔记

    C++ Primer笔记 ch2 变量和基本类型 声明 extern int i; extern int i = 3.14;//定义 左值引用(绑定零一变量初始值,别名) 不能定义引用的引用:引用必须 ...

  2. c++ primer 笔记 (一)

    昨天开始看的<C++ Primer>,确实不错.希望这周抓紧看完,每天做下笔记,以便以后复习. main函数返回一个值给操作系统   操作系统通过main函数返回的值来确定程序是否成功执行 ...

  3. C++ Primer 笔记(1)基础中的战斗机 输入输出 对输入不定数据处理

    今天打算再重新好好的看一遍C++ Primer这本很经典的书籍,笔记开始: 1.每个C++程序都包含一个或者多个函数,其中必须有一个main,操作系统通过调用main入手运行程序: 2.函数包括:返回 ...

  4. C++Primer笔记(3)

    标准库类型string表示可变长的字符序列,使用前先包含string头文件.(哈哈,终于可以逃脱C语言中的str函数系列了.)因为是标准库的一部分,所以string被定义在命名空间std中.所以你懂该 ...

  5. C++ Primer 笔记 第一章

    C++ Primer 学习笔记 第一章 快速入门 1.1 main函数 系统通过调用main函数来执行程序,并通过main函数的返回值确定程序是否成功执行完毕.通常返回0值表明程序成功执行完毕: ma ...

  6. C++primer笔记之顺序容器

    最近又重新拾起C++primer,发现每一次看都会有不同的体验,但每一次看后因为不常用,忘记得很快,所以记笔记是很关键的一环,咋一看是浪费时间,实际上是节省了很多时间.下面就把这一节的内容做一个简单的 ...

  7. C++ Primer笔记(1)——连续读取数据、类型对应的尺寸、类型转换、字符串分行写法

    这次要看看C++ Primer,这本基本上就是必读书籍了.下面的内容就是一些之前没有学过的知识的笔记. 读取数量不定的输入数据 虽然很简单,但是还是记一下: #include <iostream ...

  8. C++Primer笔记一

    作为一名半路出家的JAVA程序员,又要开始学半路中放弃的C++了,因为真的很重要. 先来看一段代码,  #include <iostream> using namespace std; i ...

  9. C++ Primer笔记(一):字符串、向量和数组

    3.1 命名空间 using namespace::name; using namespace::std using std::cin -- 头文件不应该包含using 3.2 类型string ge ...

随机推荐

  1. 【Convex Optimization (by Boyd) 学习笔记】Chapter 1 - Mathematical Optimization

    以下笔记参考自Boyd老师的教材[Convex Optimization]. I. Mathematical Optimization 1.1 定义 数学优化问题(Mathematical Optim ...

  2. TensorFlow学习笔记之--[compute_gradients和apply_gradients原理浅析]

    I optimizer.minimize(loss, var_list) 我们都知道,TensorFlow为我们提供了丰富的优化函数,例如GradientDescentOptimizer.这个方法会自 ...

  3. openstack Q版部署-----Cinder云存储服务(10)

    一.cinder介绍 一般 cinder-api 和 cinder-scheduler 安装在控制节点上, cinder-volume 安装在存储节点上. 二.数据库配置 # 在任意控制节点创建数据库 ...

  4. mybatis resultType resultMap 区别

    resultType 就是返回的类型 resultMap 返回的是一个结果集,这个结果集一般是用过resultMap节点来配置的,相应的type一般是一个Model. https://blog.csd ...

  5. Java中通过脚本引擎调用js函数

    import java.io.*; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.scri ...

  6. [Docker]CentOS7通过rpm包安装Docker

    前几天写过一篇文章:[Docker]CentOS7下Docker安装教程,直接使用yum命令下载Docker即可.但是前提是你需要***,所以这篇文章来讲讲,如果不会***,该如何安装Docker. ...

  7. ppp 完全理解(二)【转】

    转自:https://blog.csdn.net/tianruxishui/article/details/44057717 ppp 完全理解(二) pppd 协议及代码分析 作者:李圳均 日期:20 ...

  8. mac使用pytesseract

    import locale locale.setlocale(locale.LC_ALL, 'C') import pytesseract import pathlib import tracebac ...

  9. async_mongo_helper

    # -*- coding: utf-8 -*- # @Time : 2019/1/7 2:11 PM # @Author : cxa # @File : motortesdt.py # @Softwa ...

  10. 使用jsencrypt(rsa加密方式)给js加密防被刷

    加密步骤 1.需要加密的参数 * * ).toISOString().replace(/T/g, }Z/, ''); //使用本地时间,然后转换格式 2.js中引用jsencrypt.js文件,然后实 ...