c++ primer第5版 简单记录
第二章
- 要理解r的类型是什么,最简单的办法是从右向左阅读r的定义,离变量最近的符号对变量的类型有最直接的影响;
- typedef类型别名,using别名声明;
typedef char *pstring, pstring基本数据类型是指针,分析类型时不可拆
using SI = Sales_item
- constexpr常量表达式,是指值不会改变并且在编译过程就能得到计算结果的表达式;
- 用名词顶层const(top-level const)表示指针本身是一个常量,而用名词底层const(low-level const)表示指针所指的对象是一个常量;
- 如果表达式是解引用操作,则decltype得到的将是引用类型;
- decltype((variable))(注意是双层括号)的结果永远是引用,而decltype(variable)的结果只有当variable本身就是一个引用时才是引用;
第三章
- 头文件不应包含using声明;
- 使用了迭代器的循环体,不要向迭代器所属的容器中添加元素;
第四章
- 左值和右值,当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置);
- 除非必须,否则不用递增递减运算符的后置版本;
第六章
- 如果函数无须改变引用形参的值,最好将其声明为常量引用;
- 返回局部对象的引用时错误的(就像返回局部对象的指针一样);
- 尾置返回类型,再参数列表后面制定的返回类型;
第七章
- 如果我们使用struct关键字,则定义在第一个访问说明符之前的成员是public的;相反,如果我们使用class关键字,则这些成员是private的。
- 一般来说,最好在类定义开始或结束前的位置集中声明友元。
- 一个可变数据成员(mutable data member)永远不会是const,即使它是const对象的成员。(mutable关键字)
- 委托构造函数
第十三章
- 拷贝构造函数的参数必须为引用类型;
- 如果需要自定义析构函数,那么也需要自定义拷贝构造和重载拷贝赋值运算符(比如防止double delete);
- 如果有一个类的数据成员不能默认构造、拷贝、复制或销毁,则对应的成员函数将被定义为删除的;
- 一般而言,一个左值表达式表示的是对象的身份,一个右值表达式表示的是对象的值;
- 引用限定符可以是&或&&,分别指出this可以指向一个左值或右值,必须同时出现在函数的声明和定义处;
- 左值有持久的状态,而右值要么是字面常量,要么是在表达式求值过程中创建的临时对象;
第十四章
- C++语言中有几种可调用的对象:函数、函数指针、lambda表达式、bind创建的对象以及重载了函数调用运算符的类。
第十五章
- 基类通常都应该定义一个虚析构函数,即使该函数不执行任何实际操作也是如此。
- 除非我们特别指出,否则派生类对象的基类部分会像数据成员一样执行默认初始化,首先初始化基类的部分,然后按照声明的顺序依次初始化派生类的成员。
- C++11新标准提供了一种防止继承发生的方法,即在类名后跟一个关键字final