构造函数
1、与类名同名;
2、不具有任何类型,无返回值;
3、可以重载。
功能:一般用于初始化对象成员变量。
构造函数初始化成员变量:
1、this->成员变量 = 值;
2、初始化列表
-
一、普通构造函数
1、调用:Stu stu1;
Stu stu1(10);
2、声明:Stu();
Stu(int size);
..........
-
二、拷贝构造函数
1、调用:Stu stu2(stu1); //将对象stu1的内容复制给stu2
Stu stu2 = stu1;
2、声明:Stu(const Stu& obj); //obj=stu1(引用类型取别名)
3、作用:特殊的构造函数,通常用于复制一个对象的内容给另一个对象。
4、分类:浅拷贝构造函数、深拷贝构造函数
浅拷贝构造函数:当成员变量存在指针时,两个指针会指向同一片空间。
深拷贝构造函数:指针会指向新开辟的空间存放拷贝内容。
5、注意:拷贝构造函数只能存在一个
-
三、移动构造函数
1、调用:Stu stu2 = Stu(10);
2、声明:Stu(Stu&& obj);
3、作用:用于临时对象时,指针可直接指向临时对象的空间使用。
4、过程:先普通构造创建临时对象,再通过移动构造拷贝临时对象内容(实际上是浅拷贝),最后释放临时对象。
存在移动构造:普通构造->移动构造
无移动构造:普通构造->拷贝构造
-
示例
/*===============================================
2 * 文件名称:1.cpp
3 * 创 建 者:
4 * 创建日期:2024年02月17日
5 * 描 述:
6 ================================================*/
7 #include <iostream>
8 #include <cstring>
9 #include <string>
10 using namespace std;
11
12 class Stu{
13 public:
14 Stu(int size = 0)
15 {
16 this->p = new int[size]; //普通构造函数
17 this->len = size;
18 }
19 #if 0 //浅拷贝、深拷贝只会存在一个
20 Stu(const Stu& obj)
21 {
22 this->p = obj.p; //浅拷贝构造函数,指针指向同一片空间
23 this->len = obj.len;
24 }
25 #else
26 Stu(const Stu& obj)
27 {
28 this->p = new int[obj.len]; //深拷贝构造函数,拷贝内容到自己的空间
29 for(int i = 0;i < obj.len;i++)
30 {
31 this->p[i] = obj.p[i];
32 }
33 this->len = obj.len;
34 }
35 #endif
36 Stu(Stu&& obj)
37 {
38 this->p = obj.p; //移动构造,使用临时对象的空间
39 this->len = obj.len;
40
41 obj.p = nullptr;
42 }
43 private:
44 int *p;
45 int len;
46 };
47
48
49 int main()
50 {
51 Stu S; //普通构造
52 Stu A(2); //普通构造
53 Stu B(A); //拷贝构造
54 Stu C = B; //拷贝构造
55 Stu D = Stu(3); //移动构造(普通构造构造临时对象,再拷贝构造拷贝临时对象,最后释放临时对象)
56
57 return 0;
58 }