P54 extern关键字
如果想在多个文件之间共享const对象,必须在变量的定义之前添加extern关键字。
P55 初始化和对const的引用
引用的类型必须与其所引用的对象类型一致,但是有两个例外。第一种例外情况就是在初始化常量引用时允许用任意表达式作为初始值,只要该表达式的结果能转换成引用的类型即可。尤其,允许为一个常量引用绑定非常量的对象、字面值,甚至一个表达式。
P57 顶层const和底层const
更一般的,顶层const可以表示任意的对象是常量,这一点对任何数据类型都适用,如算术类型、类、指针等。底层const则与指针和引用等复合类型的基本类型有关。
当执行对象拷贝操作时,顶层const不受什么影响,考入和考出的对象是否常量都没什么影响。
另一方面,底层const的限制却不能忽视。当执行对象的拷贝操作时,考入和考出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换。一般来说非常量可以转换为常量,反之则不行。
总结
常量、非常量在初始化、拷贝时的讨论
初始化时等号左右两侧可以有顶层const、底层const、非常量三种情况(9种)
int *const i = nullptr;//顶层const
const int *j = nullptr;//底层const
int *k = nullptr; //非常量
int *const x1 = i; //顶层const = 顶层const(正确)
int *const x2 = j; //顶层const = 底层const(不正确)
int *const x3 = k; //顶层const = 非常量(正确)
const int *y1 = i; //底层const = 顶层const (正确)
const int *y2 = j; //底层const = 底层const(正确)
const int *y3 = k; //底层const = 非常量(正确)
int *z1 = i; //非常量 = 顶层const(正确)
int *z2 = j; //非常量 = 底层const(不正确)
int *z3 = k; //非常量 = 非常量(正确)
//—————————————————
int ii = 1; //用于给引用绑定的非常量
const int &jj = ii; //底层const
int &kk = ii; //非常量
const int &yy1 = jj; //底层const = 底层const(正确)
const int &yy2 = kk; //底层const = 非常量(正确)
int &zz1 = jj; //非常量 = 底层const(不正确)
int &zz2 = kk; //非常量 = 非常量(正确)
拷贝时由于左侧不能为右值故只有6种情况
int *const i = nullptr;//顶层const
const int *j = nullptr;//底层const
int *k = nullptr; //非常量
int *z1, *z2, *z3;
const int *y1, *y2, *y3;
int *const x1 = nullptr, *const x2 = nullptr, *const x3 = nullptr;
y1 = i; //底层const = 顶层const (正确)
y2 = j; //底层const = 底层const(正确)
y3 = k; //底层const = 非常量(正确)
z1 = i; //非常量 = 顶层const(正确)
z2 = j; //非常量 = 底层const(不正确)
z3 = k; //非常量 = 非常量(正确)
//—————————————————
int ii = 1;
int &ss = ii; //用于给引用绑定的非常量
const int &jj = 1; //底层const
ss = ii; //非常量
ss = jj; //非常量 = 底层const(正确)
ss = kk; //非常量 = 非常量(正确)
P62 auto忽略顶层const
其次,auto一般会忽略掉顶层const,同时底层const则会保留下来,比如当初始值是一个指向常量的指针时:
const int ci = i, &cr = ci;
auto b = ci; // b is an int (top-level const in ci is dropped)
auto c = cr; // c is an int (cr is an alias for ci whose const is top-level)
auto d = &i; // d is an int*(& of an int object is int*)
auto e = &ci; // e is const int*(& of a const object is low-level const)
P79 string::size_type
s.size()函数返回的是一个string::size_type类型的值
P99 迭代器失效1
P100 difference_type
迭代器类型的差值类型
P103 size_t
数组下标类型
P105 decltype 转换不会发生
P107 ptrdiff_t
指针差值类型
P108 下标和指针
P114 auto &
P169 迭代器失效2
P207 函数的重载
不允许两个函数除了返回值类型外其他所有的要素都相同。
P221 函数的类型
函数的类型由它的返回值类型和形参类型共同决定,与函数名无关。
P239 某些类不能依赖于合成版本
P270 static关键字不能重复
当在类外部定义静态成员时,不能重复static关键字。
P271 静态数据成员可以是它所属的类类型
P279 继承机制
简单的说,继承机制使我们可以声明一个特定的类继承自另一个类。我们通常可以将一个派生类(继承类)对象当做其基类(所继承的类)对象来使用。
P295 通用容器所提供操作的特例
C c(b,e); 构造c,将迭代器b和e指定的范围内的元素拷贝到c(array不支持)
c1={a,b,c…}; 将c1中的元素替换为列表中的元素(不适用于array)
c.size(); c中元素的数目(不支持forward_list)
P296 迭代器的算术运算所支持的容器
表3.7(P99)列出了迭代器所支持的算术运算,这些运算只能应用于string、vector、deque和array的迭代器。我们不能将他们用于其他任何容器类型的迭代器。
P301 只有顺序容器的构造函数才接受大小参数,关联容器并不支持
P301 内置数组与array
值得注意的是,虽然我们不能对内置数组类型进行拷贝或对象赋值操作,但array并无此限制。
P308 如果我们传递给insert一对迭代器,它们不能指向添加元素的目标容器
distance 和advance函数
distance主要是用来求两个迭代器之间的元素个数。
template
typename iterator_traits::difference_type
distance (InputIterator first, InputIterator last);
Return distance between iterators
Calculates the number of elements between first and last.
If i is a Random Access Iterator, the function uses operator- to calculate this. Otherwise, the function uses the increase operator (operator++) repeatedly.
advance函数增加迭代器。
template
Visual Studio快捷键
项目相关的快捷键
Ctrl + Shift + B = 生成项目
Ctrl + Alt + L = 显示Solution Explorer(解决方案资源管理器)
Shift + Alt+ C = 添加新类
Shift + Alt + A = 添加新项目到项目
编辑相关的键盘快捷键
Ctrl + Enter = 在当前行插入空行
Ctrl + Shift + Enter = 在当前行下方插入空行
Ctrl +空格键 = 使用IntelliSense(智能感知)自动完成
Alt + Shift +箭头键(←,↑,↓,→) = 选择代码的自定义部分
Ctrl + } = 匹配大括号、括号
Ctrl + Shift +} = 在匹配的括号、括号内选择文本
Ctrl + Shift + S = 保存所有文件和项目
Ctrl + K,Ctrl + C = 注释选定行
Ctrl + K,Ctrl + U = 取消选定行的注释
Ctrl + K,Ctrl + D = 正确对齐所有代码
Shift + End = 从头到尾选择整行
Shift + Home = 从尾到头选择整行
Ctrl + Delete = 删除光标右侧的所有字
导航相关的键盘快捷键
Ctrl +Up/Down = 滚动窗口但不移动光标
Ctrl + - = 让光标移动到它先前的位置
Ctrl ++ = 让光标移动到下一个位置
F12 = 转到定义
调试相关的键盘快捷键
Ctrl + Alt + P = 附加到进程
F10 = 调试单步执行
F5 = 开始调试
Shift + F5 = 停止调试
Ctrl + Alt + Q = 添加快捷匹配
F9 = 设置或删除断点
搜索相关的键盘快捷键
Ctrl + K Ctrl + K = 将当前行添加书签
Ctrl + K Ctrl + N = 导航至下一个书签
Ctrl + . = 如果你键入一个类名如Collection,且命名空间导入不正确的话,那么这个快捷方式组合将自动插入导入
Ctrl + Shift + F = 在文件中查找
Shift + F12 = 查找所有引用
Ctrl + F = 显示查找对话框
Ctrl + H = 显示替换对话框
Ctrl + G = 跳转到行号或行
Ctrl + Shift + F = 查找所选条目在整个解决方案中的引用