20200221

@ShiKaiWi

Plan

  • 60min: CPP

Notes

  1. default 关键字只能给具有合成版本的成员函数使用。
  2. 五个重要的拷贝控制操作成员函数: 拷贝构造函数(copy constructor)、拷贝赋值运算符(copy-assignment operator)、移动构造函数(move constructor)、移动赋值运算符(move-assignment operator)。
  3. 拷贝构造函数通常不需要被声明成 explicit 的,因为这样会阻止一些方便的隐式调用。
  4. 析构函数分为两个阶段: 析构函数体执行、隐含析构阶段(负责析构成员)。
  5. 三五法则之一: 需要自定义析构函数的时候,一般都需要自定义拷贝构造函数和拷贝赋值运算符。
  6. 三五法则之一: 需要自定义拷贝构造函数的时候,一般都需要自定义拷贝赋值运算符。
  7. delete 关键字可以用于任何成员函数,一般可以用来阻止拷贝,但是一般不用在析构函数上面。
  8. 拷贝构造函数和拷贝赋值运算符触发的区别是:
S s1;
S s2 = s1; // 触发拷贝构造函数
S s3;
s3 = s2; // 触发拷贝赋值运算符

练习:

#include <iostream>

struct S {
  int i;
  S(int i) : i(i) {}
  S(const S &s) {
    std::cout << "copy S(" << s.i << ")" << std::endl;
    i = s.i;
  }
  S &operator=(const S &s) {
    std::cout << "copy-assign S(" << s.i << ")" << std::endl;
    i = s.i;
    return *this;
  }
};

int main() {
  S s1 = 1;
  S s2(2);
  s2.i = 3;
  S s3(s2);
  s3.i = 4;
  S s4(4);
  s4 = s3;
  return 1;
}

More

构造函数、析构函数在继承场景下面的执行顺序?