1 构造函数

  1. 在对象创建时自动调用,完成初始化相关工作。如果定义相关数组,则需要手动调用构造函数。

  2. 无返回值,与类名同,默认无参,可以重载,可默认参数。

  3. 一经实现,默认构造函数就不复存在。

2 析构函数

  1. 对象销毁时,自动调用。完成销毁后的善后工作。

  2. 无返回值,与类名相同。无参数。不可以重载与默认参数。

3 拷贝构造和重载赋值运算符

该部分实验代码文件:/assets/CPlusPlus/06_copy_construction/06_copy_construction.cpp

拷贝构造和重载赋值运算符的最大区别就是:赋值运算符的左侧对象不是新生成的对象,而拷贝构造函数左则是新生成的对象进行初始化。

我的理解是:拷贝构造是给你一个新对象,因为新对象的某个成员指针指向的内存是空。而赋值运算符的时候,该成员指针指向的内存并不是空的,不需要创建,而是可以直接赋值。

以下是拷贝构造函数使用场景:

  1. 一个对象由另一个对象初始化。

     A a; /* 使用默认构造函数创建一个对象a */
     A a1 = a; /* 使用a初始化a1  */
     A a2(a); /* 这个情况也是等于上面情况的 */
    
  2. 对象作为函数参数。

     void 
     f (A a1) {
       return;
     }
    
     /* main函数中 */
     f (a); /* 其实等于上面 A a1 = a; 情况 */
    

以下是重载赋值运算符使用场景:

  1. 先创建该对象,

    再赋值。而不是创建的时候直接初始化。

     A a(100);
     A a1;
     a1 = a;
    
  2. 先创建该对象

    ,再使用函数返回值赋值。而不是创建的时候直接初始化。

     A a;
     a = f1();
    

匿名对象转正:

  1. 对象作为函数返回值。以下情况只会调用一次默认构造函数,而且两个变量是同一个地址。所以是匿名对象转正,那个局部变量并没有被析构。

     A f1 () {
       A p; 
       return p; /* 函数返回值 */
     }
    
    
     /* main函数中 */
     A p3 = f1 (); /* 这也是PDF教程中所说的,匿名对象转正 */
    

参考

参考1:C++ 拷贝构造函数和重载赋值运算符的区别