六、C++复习——构造与析构函数
1 构造函数
-
在对象创建时自动调用,完成初始化相关工作。如果定义相关数组,则需要手动调用构造函数。
-
无返回值,与类名同,默认无参,可以重载,可默认参数。
-
一经实现,默认构造函数就不复存在。
2 析构函数
-
对象销毁时,自动调用。完成销毁后的善后工作。
-
无返回值,与类名相同。无参数。不可以重载与默认参数。
3 拷贝构造和重载赋值运算符
该部分实验代码文件:/assets/CPlusPlus/06_copy_construction/06_copy_construction.cpp
拷贝构造和重载赋值运算符的最大区别就是:赋值运算符的左侧对象不是新生成的对象,而拷贝构造函数左则是新生成的对象进行初始化。
我的理解是:拷贝构造是给你一个新对象,因为新对象的某个成员指针指向的内存是空。而赋值运算符的时候,该成员指针指向的内存并不是空的,不需要创建,而是可以直接赋值。
以下是拷贝构造函数使用场景:
-
一个对象由另一个对象初始化。
A a; /* 使用默认构造函数创建一个对象a */ A a1 = a; /* 使用a初始化a1 */ A a2(a); /* 这个情况也是等于上面情况的 */
-
对象作为函数参数。
void f (A a1) { return; } /* main函数中 */ f (a); /* 其实等于上面 A a1 = a; 情况 */
以下是重载赋值运算符使用场景:
-
先创建该对象,
再赋值。而不是创建的时候直接初始化。
A a(100); A a1; a1 = a;
-
先创建该对象
,再使用函数返回值赋值。而不是创建的时候直接初始化。
A a; a = f1();
匿名对象转正:
-
对象作为函数返回值。以下情况只会调用一次默认构造函数,而且两个变量是同一个地址。所以是匿名对象转正,那个局部变量并没有被析构。
A f1 () { A p; return p; /* 函数返回值 */ } /* main函数中 */ A p3 = f1 (); /* 这也是PDF教程中所说的,匿名对象转正 */