1、指针和引用的使用场景
确定变量永远不会为空且不会作为其他变量的代表时用引用;变量有可能会为空或者在不同的时间会指向不同的对象时用指针。
2、类型装换最好使用C++转型操作符
static_cast 基本类型之间的转换
const_cast 常量转非常量(去除常量属性)
dynamic_cast 继承体系中父类与子类之间的安全转型,失败返回NULL
reinterpret_cast 任意类型之间的转换 常用于转换函数指针类型。
3、不以多态方式处理数组。
4、非必要不提供默认构造函数
会导致class对象内的成员变量没有初始化值。
5、最好不用 定制的类型转换函数 (operator type()),如有需要,直接写一个专门转型的函数。
6、区别前置后置的++,--,重载时后置++最好返回const,带一个不被使用的参数和前置++区别。
7、不重载&& || , 3个操作符。
8、operator new和new operator是不一样的
operator new分配内存并调用构造,new operator 只分配内存。
9、函数参数和异常参数的区别:
a>catch子句一定会发生复制行为且比较慢
b>调用函数正常情况下控制权在调用端,抛出异常后控制权不再属于抛出端。
c>throw; throw e; 尽量使用throw; 后者抛出的是参数的副本,如果参数有继承体系,可能会改变抛出的类型。
d>函数调用时不允许传递临时对象的引用,但是抛出异常可以。
e>隐式类型转换只发生于函数中,异常并不会有隐式的类型转换,如double类型的catch子句不会捕捉int类型的异常,异常有两种转换:继承架构中的类转换和有型指针到无型指针的转换。
异常会使得程序代码量增加并且效率下降,故异常一定要在必要的地方使用,不滥用,抛出真正的异常。
mutable 关键字 修饰的变量可以在任何成员函数内被修改,即使是常成员函数
10、缓式评估 类似于string的写时拷贝
11、超急评估 使用局部缓存将昂贵的动作 如“数据库查询”转换成“内存数据结构查询”。
18、分期摊还所需要的计算成本,类似于计算机在读取vector时的缓存,提前加载先前读取过位置附近的数据。
19、临时对象的来源
a>函数形参实参类型不吻合,如传入char数组,形参为string,在传参过程中会产生临时对象,非常引用参数不允许产生临时参数
b>函数返回对象,很多时候不能避免
21、适当利用函数重载避免隐式类型转换
22、复合类型操作符比独身操作符效率高,因为不产生临时对象的构造和析构 如+=好于+
23、含有虚函数的类的每个对象都有一个虚函数指针,虚函数不能是内联函数