现代C++特殊成员函数
C++ 98有四个特殊成员函数:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符。C++11添加了两个函数:移动构造函数、移动赋值运算符。
学习重点: 有必要了解各个函数什么时候自动生成;自动生成的函数有没可能产生预期外的行为;
面试考点: 各个类别的特殊成员函数均有考点,语法使用细节非常关键
特殊成员函数(编译器自动生成)
共6个
- 构造函数
- 析构函数
- 拷贝构造函数
- 拷贝赋值运算符
- 移动构造函数
- 移动赋值运算符
默认构造函数:仅当类不存在用户声明的构造函数是才自动生成
拷贝构造函数:仅当类没有显式声明拷贝构造函数时才自动生成,并且如果用户声明了移动操作,编译器通常不会自动生成默认拷贝构造函数
拷贝赋值运算符:仅当类没有显式声明拷贝赋值运算符时才自动生成,并且如果用户声明了移动操作,编译器通常不会自动生成默认拷贝赋值运算符
移动操作:仅当类没有显式声明移动操作、拷贝操作和析构函数时才自动生成。
函数生成内容口诀:用户声明拷贝不会自动生成移动,用户声明移动不会自动生成拷贝。
C++98有四个特殊成员函数:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符。 注意 :这几个函数只有在需要的时候才会被生成,比如你在代码中使用了这几个函数但是类中没有明确声明。
C++11添加了两个函数:移动构造函数、移动赋值运算符。
- 两个拷贝函数(实现代码)是独立的。即:你只声明了其中的一个拷贝函数,但是在代码中有使用另一个拷贝函数,那编译器也会自动为你生成这个拷贝函数(逐成员拷贝);(c++98和c++11中都是这样的规则)
- 需要内存管理时,逐成员拷贝会出问题,如不同类对象指向同一个内存地址。
- 两个移动函数不是独立的。即:你只声明了其中的一个移动函数,编译器不管你在代码中是否有使用另一个,也不会再帮你生成了;
后面本专栏会针对各个特殊成员函数进行详细讲解。