C++ Primer 笔记——命名空间
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 笔记——命名空间的更多相关文章
- C++ Primer笔记
C++ Primer笔记 ch2 变量和基本类型 声明 extern int i; extern int i = 3.14;//定义 左值引用(绑定零一变量初始值,别名) 不能定义引用的引用:引用必须 ...
- c++ primer 笔记 (一)
昨天开始看的<C++ Primer>,确实不错.希望这周抓紧看完,每天做下笔记,以便以后复习. main函数返回一个值给操作系统 操作系统通过main函数返回的值来确定程序是否成功执行 ...
- C++ Primer 笔记(1)基础中的战斗机 输入输出 对输入不定数据处理
今天打算再重新好好的看一遍C++ Primer这本很经典的书籍,笔记开始: 1.每个C++程序都包含一个或者多个函数,其中必须有一个main,操作系统通过调用main入手运行程序: 2.函数包括:返回 ...
- C++Primer笔记(3)
标准库类型string表示可变长的字符序列,使用前先包含string头文件.(哈哈,终于可以逃脱C语言中的str函数系列了.)因为是标准库的一部分,所以string被定义在命名空间std中.所以你懂该 ...
- C++ Primer 笔记 第一章
C++ Primer 学习笔记 第一章 快速入门 1.1 main函数 系统通过调用main函数来执行程序,并通过main函数的返回值确定程序是否成功执行完毕.通常返回0值表明程序成功执行完毕: ma ...
- C++primer笔记之顺序容器
最近又重新拾起C++primer,发现每一次看都会有不同的体验,但每一次看后因为不常用,忘记得很快,所以记笔记是很关键的一环,咋一看是浪费时间,实际上是节省了很多时间.下面就把这一节的内容做一个简单的 ...
- C++ Primer笔记(1)——连续读取数据、类型对应的尺寸、类型转换、字符串分行写法
这次要看看C++ Primer,这本基本上就是必读书籍了.下面的内容就是一些之前没有学过的知识的笔记. 读取数量不定的输入数据 虽然很简单,但是还是记一下: #include <iostream ...
- C++Primer笔记一
作为一名半路出家的JAVA程序员,又要开始学半路中放弃的C++了,因为真的很重要. 先来看一段代码, #include <iostream> using namespace std; i ...
- C++ Primer笔记(一):字符串、向量和数组
3.1 命名空间 using namespace::name; using namespace::std using std::cin -- 头文件不应该包含using 3.2 类型string ge ...
随机推荐
- openstack Q版部署-----环境搭建(1)
浏览器建议全程使用火狐或者谷歌,不然VNC可能会有问题 一.环境准备 系统:centos7.2 x86_64 controller 2c+8g+40g 10.1.80.110 可以nat上网 comp ...
- Debian 为firefox安装flash插件 以及 音频驱动
1. flash下载地址:http://get.adobe.com/cn/flashplayer/ lv@lv:~/Downloads$ tar -zxvf flash_player_npapi_li ...
- Django 的系统时区设置 RPC
PRC Deprecated +08:00 +08:00 Link to Asia/Shanghai settings.py 文件的设置项: TIME_ZONE = 'PRC' 来源 ...
- mac使用技巧之截图
1.选定区域截图 command+shift+3 选定区域按住control,可以直接截图到剪切板, 按option可以进行比例缩放. 按住shift可以选定区域 按住空格键可以进入窗口截图模式. 2 ...
- DNS解析出现错误故障解决
当DNS解析出现错误,例如把一个域名解析成一个错误的IP地址,或者根本不知道某个域名对应的IP地址是什么时,就无法通过域名访问相应的站点了,这就是DNS解析故障.出现DNS解析故障最大的症状就是访问站 ...
- 关于session,cookie,Cache
昨天看了<ASP.NET 页面之间传值的几种方式>之后,对session,cookie,Cache有了更近一步的了解,以下是相关的内容 一.Session 1.Session基本操作 a. ...
- EF 常见异常总结
问题:System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invoca ...
- 鸟哥Linux私房菜基础学习篇学习笔记1
鸟哥Linux私房菜基础学习篇学习笔记1 第三章 主导分区(MBR),当系统在开机的时候会主动去读取这个区块的内容,必须对硬盘进行分区,这样硬盘才能被有效地使用. 所谓的分区只是针对64Bytes的分 ...
- 用Cordova打包Vue-vux项目
技术搭建:vue + vux 首先推荐阅读这篇文章,写的已经很详细了:https://www.jianshu.com/p/25d797b983cd 此处记录下我按照这篇文章打包的时候报的一些错误,方便 ...
- lua 中随机数产生
需要用到两个函数: (1)math.randomseed(N): 接收一个整数N作为随机序列种子 (2)math.random([n, [m]]): 这个函数有三种用法,分别是不跟参数,此时产生(0 ...