【读书笔记】《More Effective C++》- 操作符

《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 newplacement new :
    • new operator在堆上生产对象,分配内存并且调用构造函数;
    • operator new只分配内存(不一定在堆上),不调用构造函数;
    • placement new在分配好的内存上调用构造函数。
  • delete operatoroperator delete:
    • delete operator析构并且释放内存;
    • operator delete仅释放内存。
  • 针对数组的new operatordelete operator:与单一对象相比,对数组中的每一个对象进行newdelete操作。