C++作为一门面向对象的编程语言,在使用过程中,绝对会经常使用到类的构造函数及析构函数,本文主要总结了构造函数及析构函数的用法。
一、构造函数
在对某类进行实例化时,一定会调用该类的构造函数,构造函数主要完成的是类成员变量的初始化(静态变量除外,它是在全局数据区进行初始化的)或者内存分配工作。构造函数无返回值,可重载。
构造函数调用顺序为:基类的静态变量->派生类的静态变量->基类的成员变量->基类构造函数->派生类的成员变量->派生类构造函数
1、默认构造函数
默认构造函数是无参构造函数,在没有显示创建任意构造函数的时候,编译器会默认为我们创建一个默认构造函数,但它是一个空函数,即什么都不做。
但若在类中声明了任何其他构造函数,编译器将不会再为我们创建默认构造函数,此时如果还想继续保留默认构造函数,则可以在类声明中加入以下代码:
Test() = default;
2、 默认拷贝构造函数
如果没有自定义拷贝构造函数,编译器会默认为我们创建一个默认拷贝构造函数,其内部实现仅仅是对象参数的浅拷贝。
当我们将一个已构造的类对象直接初始化构造另一个类对象时,会自动调用该类的默认拷贝函数。有三点需要注意:
- 默认拷贝构造函数的传入参数类型是常引用。
- 在使用赋值语句时,必须保证左边对象是未创建的,否则将不是调用拷贝构造函数,而是等号运算符重载函数。
- 在使用默认拷贝构造函数时,若源对象内,存在指针,则不能再使用系统为我们提供的默认拷贝构造函数,因为默认拷贝构造函数是浅拷贝,这样将导致两个对象内的指针成员变量指向同一块地址,释放时将会发生异常,所以这时需要我们使用深拷贝的方式去重新定义它。
3、等号运算符重载函数
如果没有自定义等号运算符重载函数,编译器会默认为我们创建一个默认等号运算符重载函数,其内部实现仅仅是对象参数的浅拷贝。
当我们将一个已构造的类对象使用另一个对象进行等号赋值时,会自动调用该类的等号运算符重载函数。有三点需要注意:
- 等号运算符重载函数的传入参数类型是常引用。
- 在使用赋值语句时,必须保证左边对象是已创建的,否则将不是调用等号运算符重载函数,而是拷贝构造函数。
- 在使用等号运算符重载函数时,若源对象内,存在指针,则不能再使用系统为我们提供的默认等号运算符重载函数,因为默认等号运算符重载函数是浅拷贝,这样将导致两个对象内的指针成员变量指向同一块地址,释放时将会发生异常,所以这时需要我们使用深拷贝的方式去重新定义它。
注意:若子类继承于父类,且父类无默认构造函数,则在定义子类的初始化列表时候时,必须显式的调用父类,否则将编译报错。
二、析构函数
析构函数是一个成员函数,该函数在对象超出范围或显示调用 delete函数时自动调用。 如果未定义析构函数,则编译器将提供一个默认析构函数 。
析构顺序与构造顺序刚好相反:自身的析构函数->成员变量的析构函数->父类的析构函数。
可以将析构函数声明为virtual,这样当子类继承父类,父类的指针指向子类时,delete掉父类的指针,先调动子类的析构函数,再调动父类的析构函数。
请注意,析构函数也可以声明为抽象类的纯虚函数。
本文详细介绍了C++中构造函数的默认构造、拷贝构造和等号运算符重载,以及析构函数的作用和调用顺序。重点讲解了如何处理深拷贝和浅拷贝的问题,以及为何在子类继承时需要注意初始化列表。
669

被折叠的 条评论
为什么被折叠?



