C++析构函数、拷贝构造与拷贝赋值
一、C++析构函数介绍
1、使用语法
class 类名{
~类名(void){
}
};
其主要负责清理对象生命周期中的动态资源,使用时应注意:
(1)函数名必须是"~类名";
(2)没有返回类型,也没有参数;
(3)不能被重载,一个类只能有一个析构函数。
2、对象被销毁时,该类的析构函数自动被调用,栈对象离开所在作用域时,被“}”调用其析构函数,堆对象的析构函数在delete时自动被调用。
3、如果一个类没有显式定义析构函数,那么编译器会为该类提供一个缺省的析构函数,对于基本类型的成员变量,什么也不做,而对于类类型的成员变量(成员子对象),将会自动调用相应类的析构函数。
4、对象创建和销毁的过程
创建:
(1)分配内存;
(2)构造成员子对象(按声明顺序);
(3)执行构造函数代码;
销毁:
(1)执行析构函数代码;
(2)析构成员子对象(按声明逆序);
(3)释放内存。
二、拷贝构造和拷贝赋值
1、浅拷贝和深拷贝
(1)如果类中包含指针形式的成员变量,缺省的拷贝构造只是复制了指针变量本身,没有复制指针所指向的内容,这样拷贝方式称为浅拷贝。
(2)浅拷贝将导致不同对象的数据共享,如果数据在堆区,可能会在析构时引发“double free”的异常,所以就必须自己定义支持复制指针所指向内容的拷贝构造函数,即深拷贝。
2、拷贝赋值
(1)当两个自定义类型的对象进行赋值操作时,比如“i3=i2”,编译器会将其处理成"i3.operator=(i2)"成员函数调用形式,其中“operator=”被称为拷贝赋值操作符函数,其函数返回结果就是赋值操作表达式的结果。
(2)但是编译器缺省的拷贝赋值函数和缺省拷贝构造类似,也是浅拷贝,只是赋值了指针变量本身,有double free和内存泄漏的问题,为了得到深拷贝的效果,则必须自己定义深拷贝赋值函数.
举例说明:写一个字符串类String,包含构造函数、析构函数、拷贝函数、拷贝赋值函数,如下图所示。