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. Java开发环境配置(4)--Maven安装 环境变量配置,本地仓库配置---插件安装

    说明在前:本人用过的 luna  mars 等,都已经自带maven插件的了,以下有些文章是很老的,讲到maven插件的安装都可以忽略掉. maven安装eclipse在线配置maven搞定所有插件_ ...

  2. java语言什么时候诞生的?

    java语言什么时候诞生的?创始人是谁?何时发布的? Java编程语言是sun Microsystems公司JamesGosling在1990年创建的1995年公布于世

  3. 30个极大提高开发效率的vscode插件

    参考链接:https://blog.fundebug.com/2018/07/24/vs-extensions/

  4. code forces 805B (水)

    #include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#inc ...

  5. cartographer 分析

    原文链接:http://blog.csdn.net/zyh821351004/article/details/52421005 cartographer与karto的比较 1. 两者采取的都是图优化框 ...

  6. HDFS-put: unexpected URISyntaxException

    目的:将某zip上传到HDFS某目录 [hdfs@mr1 jars]$ hadoop fs -put "20180720_155245 label.zip" /user/File/ ...

  7. shell 在手分析服务器日志【转】

    自己的小网站跑在阿里云的 ECS 上面, 偶尔也去分析分析自己网站服务器日志,看看网站的访问量.看看有没有黑阔搞破坏!于是收集,整理一些服务器日志分析命令,大家可以试试! awk '{print $1 ...

  8. 使用html2canvas生成一张图片

    注意事项: 1.图片生成问题,生成图片测试机正常传到正式机,无法生成!!====>>原因是正式机中,使用的是CDN加载,导致图片跨域,而canvas不支持图片跨域!!!==>> ...

  9. python3+requests库框架设计02-封装日志类

    首先我们先来实现日志的功能,日志可以使用python3自带logging模块,不会的可以百度一下相关文章,也可以看我另外一篇文章Python3学习笔记24-logging模块 在封装日志类前,我们需要 ...

  10. boost 随机数发生器

    Random     随机数 在很多应用中都需要使用随机数.本库力求提供一个高效的,通用的随机数库.boost库有多种随机数生成方式.先熟悉一下各种随机数生成器的概念. 数字生成器(Number Ge ...