目录
1 让自己习惯C++
01 视c++为一个语言联邦
c++由四个次语言组成:C, Objective-oriented c++, Template c++, STL
02 尽量以const, enum, inline替换 #define
减轻预处理器的的工作
未完
03 尽可能使用const
常量指针和指针常量
常量指针:const int * a 指的对象值不变,是常量
指针常量:int *const a 指针本身地址是常量,值可以变
对与container::iterator,前面加const,相当于指针常量,不能it++;想用常量指针要用container::const_iterator关键字
函数返回值,参数,成员函数
返回值前加const是为了保证返回的值不再被修改(一不小心)
举例:
Rational a, b, c;
...
(a * b) = c; // 在a*b的结果上调用operator=,这肯定是我们不期望的行为,加上const就可以避免结果被修改
const成员函数:使得该成员函数能够被const对象调用,const对象不能调用非const成员函数
04 确定对象被使用前已先被初始化
对于构造函数:总是使用成员初值列,并且最好以其声明次序来初始化
对于non-local static对象:当你跨编译单元(跨文件)调用函数时,如果你调用的对象还没初始化,就会出事,主要原因是C++不知道不同编译单元的初始化顺序。解决方案:将non-local static 转化为local static对象,具体做法为,使用一个reference-returning函数返回该static变量的引用,这样能保证调用之前一定初始化了。从以前的tfs.numDisks()变成了tfs().numDisks()。
2 构造/析构/赋值运算
05 了解C++默默编写并调用哪些函数
编译器会自动构造default构造函数,复制构造函数,=operator以及析构函数
最好自己来定义
06 若不想使用编译器自动生成的函数,就应该明确拒绝
为驳回编译器自动提供的函数,可以主动将对应的函数声明为private并且不予实现。一种方法,定义一个Uncopyable,在这个类中实现上述操作,然后原来的类继承自这个Uncopyable,这是为了避免private被其他的成员函数或者友元函数不小心调用了。
07 为多态基类声明virtual析构函数
20 宁以pass-by-reference-to-const替换pass-by-value
采用const引用传参(尤其是class),可以避免class的copy,节省构造和析构的开销,const是为了保证原数据不被修改。同时还可以避免切割问题(slicing problem)
切割问题:如果采用值传参,参数是父类,传的是子类,会被解析成父类,子类的重载函数也会执行父类的原函数,子类的特性被切割了。采用const引用传参,传的是啥就是啥,不会被切割。
但是对于内置类型(c++自带的int啥的)和STL的迭代器和函数对象,往往pass-by-value更有效
比较好的参考链接:
https://blog.csdn.net/qq_43763344/article/details/95447843
https://normaluhr.github.io/2020/12/31/Effective-C++/