一、Cpp中的构造函数有哪些
构造函数主要分为三类:
默认构造函数(无参构造函数)、有参构造函数、拷贝构造函数(包括了拷贝赋值运算符,移动构造函数,移动赋值运算符)
二、成员列表
三、编译器为我们声明的构造函数
编译器可以为我们生成六种构造函数,但不是所有的都会生成
1. 对于默认构造函数:只要出现其他构造函数,编译器就不会为我们声明默认构造函数。例子:
2. 拷贝构造函数:只有用户没有定义 移动构造函数和 移动赋值运算符 ,编译器偷偷为我们声明;一旦出现了 移动构造函数或移动赋值运算符,编译器就不会声明这些。
3. 拷贝赋值运算符:只有用户没有定义 移动构造函数和 移动赋值运算符 ,编译器偷偷为我们声明;一旦出现了 移动构造函数或移动赋值运算符,编译器就不会声明这些。
通常:拷贝构造函数和拷贝赋值运算符 会同时出现或者消失
4. 析构函数。
5. 移动构造函数:只有用户没有定义 拷贝构造函数, 拷贝赋值运算符, 析构函数 和 移动赋值运算符时,才会生成。只要出现其中一个就不会生成。
6. 移动赋值运算符:只有用户没有定义 拷贝构造函数, 拷贝赋值运算符, 析构函数 和 移动构造函数时,才会生成。只要出现其中一个就不会生成。
三、default、delete、noncopyable
1. default:
类A中自己定义构造函数之后,编译器不会为我们声明默认构造函数了 ----> 实例化A时,若使用到了默认构造函数实例化,则会编译器报错 ---->解决方法1:只能自己显示声明一个默认构造函数,但是效率不高 ----> 解决方法2:C++11中,提供 ”=default“ ,放在显示声明的默认构造函数之后,让编译器生成自己的默认构造函数.实例化A时,若使用到了默认构造函数实例化,则会调用编译器提供的默认构造函数 。
2. delete:
C++11中,当我们定义一个类的成员函数时,如果后面使用"=delete"去修饰,那么就表示这个函数被定义为deleted,也就意味着这个成员函数不能再被调用,否则就会出错。
作用:防止自己不希望调用的函数调用,如:
1.防止隐式转换转换
2.防止类实例对象的拷贝赋值
#include <cstdio>
class TestClass
{
public:
void func(int data) { printf("data: %d\n", data); }
void func(double data)=delete; ///防止隐式转换
};
int main(void)
{
TestClass obj;
obj.func(100);
obj.func(100.0);
return 0;
}
四、拷贝构造函数
深浅拷贝