C++作为一门面向对象的编程语言,在使用过程中,绝对会经常使用到类的构造函数及析构函数,本文主要总结了构造函数及析构函数的用法。

1、构造函数

   在对某类进行实例化时,一定会调用该类的构造函数,构造函数主要完成的是类成员变量的初始化(静态变量除外,它是在全局数据区进行初始化的)或者内存分配工作。构造函数无返回值,可重载。

  •  1. 默认构造函数:默认构造函数是无参构造函数,声明形式为: 类名();任何类都有一个默认构造函数,在没有显示创建构造函数的时候,系统会默认为我们创建一个默认构造函数,但它是一个空函数,即什么都不做,但若类中存在其他构造函数时,默认构造函数将不会被定义。当然,我们可以显式的去定义它。

  •  2. 默认拷贝构造函数:默认拷贝构造函数的声明格式如下: 类名(类名 & 形参);当我们调用函数进行传参(非引用传参)时,或者将一个类对象直接初始化另一个类对象时,会自动调用该类的默认拷贝函数。有三点需要注意:(1)默认拷贝构造函数的传入参数是引用传递,且不是常引用,因此,可以在自定义的默认拷贝构造函数中对源对象进行修改。(2)在使用赋值语句时,必须保证对象1是未创建的,否则将不是调用默认拷贝构造函数,而是调用运算符‘=’的重载函数。(3)在使用默认拷贝构造函数时,若源对象内存在指针,则不能再使用系统为我们提供的默认拷贝构造函数,甚至连运算符‘=’也不能直接使用,因为这样将导致两个对象内的指针成员变量指向同一块地址,释放时将会发生异常,所以这时我们需要显示去重新定义它,且在函数体内将指针变量单独特殊赋值。

  •  3.  若子类继承于父类,定义子类的初始化列表时候时,没有显式的调用父类,则父类的默认构造函数(无参的)会被先默认调用,之后才会调用子类的构造函数,若想要调用父类的其他带参构造函数,则需要在定义子类的初始化列表时,显示调用父类的构造函数,格式如下:SubClass::SubClass(...):BsaeClass(...)。若是多继承,则根据继承时声明父类的先后顺序调用,若多个父类都是继承于同一个类,即菱形继承,则在子类实例化时,父类的父类的构造函数将被调用多次,为了避免这种情况,我们在父类声明继承时,要采用虚继承的方式,即加上virtual,这样只会调用父类的父类构造函数一次。

  •  4. 若类中成员变量包含其他类,则创建该类对象时,会首先调用成员变量类的构造函数,再调用该类的构造函数。


2、析构函数

类的析构函数一般是在对象的生命周期结束时被调用, 它的主要功能是对对象的一些资源进行回收,例如释放内存等。

 1. 虚构函数在以下三种情况时,会被调用:(1)实例化对象的生命周期结束销毁时。(2)delete指向对象的指针时。(3)对象A是对象B的成员,B的析构函数被调用时,对象A的析构函数也被调用。
 2. 虚函数的调用顺序是子类先调用,父类后调用,多继承时,后继承的先调用。
 3. 如果父类的析构函数不加virtual关键字 :子类继承父类,父类的指针指向子类时,delete掉父类的指针,只调动父类的析构函数,而不调动子类的析构函数。 如果父类的析构函数加virtual关键字 :子类继承父类,父类的指针指向子类时,delete掉父类的指针,先调动子类的析构函数,再调动父类的析构函数。
 4. 若类中存在成员变量类时,会先调用该类的的析构函数,然后再接着调用成员变量类的析构函数。