20200221
Plan
- 60min: CPP
Notes
- default 关键字只能给具有合成版本的成员函数使用。
- 五个重要的拷贝控制操作成员函数: 拷贝构造函数(copy constructor)、拷贝赋值运算符(copy-assignment operator)、移动构造函数(move constructor)、移动赋值运算符(move-assignment operator)。
- 拷贝构造函数通常不需要被声明成 explicit 的,因为这样会阻止一些方便的隐式调用。
- 析构函数分为两个阶段: 析构函数体执行、隐含析构阶段(负责析构成员)。
- 三五法则之一: 需要自定义析构函数的时候,一般都需要自定义拷贝构造函数和拷贝赋值运算符。
- 三五法则之一: 需要自定义拷贝构造函数的时候,一般都需要自定义拷贝赋值运算符。
- delete 关键字可以用于任何成员函数,一般可以用来阻止拷贝,但是一般不用在析构函数上面。
- 拷贝构造函数和拷贝赋值运算符触发的区别是:
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
构造函数、析构函数在继承场景下面的执行顺序?