《More Effective C++》读书笔记
操作符
条款5 : 对定制的“类型转换函数”保持警觉
理解: 先说原因,类型转换函数在未预期的情况下被调用,导致结果可能不正确、不直观,很难调试。这种转换有两种,分别是隐式类型转换操作符和单自变量constructor:
- 隐式类型转换操作符: 示例如下:
当类中定义该类型转换函数后,该类在使用中会被编译器调用而发生错误。 处理办法是用operator double() const;
asDouble()
这类函数代替operator double函数。 - 单自变量constructor: 单自变量构造函数是指构造函数只有一个参数或有很多参数但除第一个参数外其他参数都有默认值。
处理办法有两种(1)用
explicit
关键字声明单自变量构造函数,使得该函数不能发生隐式类型转换;(2)使用代理类来构建自变量构造函数。
条款6 : 区别increment/decrement操作符的前置(prefix)和后置(postfix)形式
理解: i++
和++i
的区别,给出实现代码即可看出区别
// 前置式,先累加后取出,返回一个reference
UPInt& UPInt::operator++()
{
*this += 1;
return *this;
}
// 后置式,取出后再累加,返回一个const对象
const UPInt UPint::operator++(int)
{
UPInt oldValue = *this;
++(*this); // 这里调用前置++运算符
return oldValue;
}
条款7 : 千万不要重载&&,||和,操作符
理解:
&&
和||
有骤死式语义,重载后会被函数调用语义替代,造成不可预期的效果。其中骤死式语义是指再一旦表达式的真假值确定,即使表达式中还有部分尚未校验,整个评估工作仍然直接结束。而函数调用语义下所有表达式均要执行。- 表达式中若含有
,
, 则逗号左侧会被先评估,然后是逗号右侧,最后表达式的结果以右侧的返回值为代表,而重载逗号时无法实现该语义。
条款8 : 了解各种不同含义的new和delete
理解:
new operator
,operator new
和placement new
:new operator
在堆上生产对象,分配内存并且调用构造函数;operator new
只分配内存(不一定在堆上),不调用构造函数;placement new
在分配好的内存上调用构造函数。
delete operator
和operator delete
:delete operator
析构并且释放内存;operator delete
仅释放内存。
- 针对数组的
new operator
和delete operator
:与单一对象相比,对数组中的每一个对象进行new
和delete
操作。