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 ...
随机推荐
- java spring属性注入
一.创建对象时候,向类里面属性设置值:一般有三个方式 1) .有参构造, 2). set**** 3).接口注入 二. 在spring框架里面,支持前面两种方式: 1).有参构造方法 用constr ...
- super和this的区别
this.:this加点指此时代表当前对象,能操作当前类里面的所有属性及方法以及父类继承而来能被访问修饰符允许的属性和方法.super.:此时指代当前对象类的父类对象部分,不能操作到本类的属性和方法, ...
- Maven入门项目创建
项目构建 1.新建maven项目 2.跳过骨架选择,如果不跳过骨架选择创建出的项目目录是不全的(骨架其实就是项目的模板) 3.Group Id,Artifact Id,Version称为项目的坐标,当 ...
- windows下flazr对rtmp视频流进行压力测试(批量直播测试)
flazr-0.7-RC2下载地址:百度网盘 提取码:nu05 简述:通过推流软件推送摄像头视频流到nginx流媒体服务器,获取nginx流媒体服务器上的视频流,在windows下使用flazr软件进 ...
- [转] Understanding Convolutional Neural Networks for NLP
http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/ 讲CNN以及其在NLP的应用,非常 ...
- Leetcode - 309. Best Time to Buy and Sell Stock with Cooldown
Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...
- Faster_RCNN 3.模型准备(下)
总结自论文:Faster_RCNN,与Pytorch代码: 本文主要介绍代码第二部分:model/ , 首先分析一些主要理论操作,然后在代码分析里详细介绍其具体实现. 首先在参考文章的基础上进一步详细 ...
- shutil.copy()、os.walk()、os.rename()实例
#!/usr/bin/python # -*- coding: UTF-8 -*- import os import shutil Path = "panel/" PNPath = ...
- 解决“错误 D8016 “/ZI”和“/Gy-”命令行选项不兼容 ”问题
在Visual Studio 2017中调试VC++6.0代码,出现该问题,解决方案如下:(1)[项目]—>[属性]—>[C/C++]—> [常规]—>[调试信息格式]—> ...
- 四重解法---P1047 校门外的树
题目描述 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,--,L,都种 ...