1.析构函数
构造函数:当对象被创建时,自动调用构造函数进行初始化,如果没有自定义的构造函数,那么系统会自动提供一个缺省构造函数
析构函数: 当对象被销毁时,自动调用析构函数进行资源的回收,
如果没有自定义析构函数,那么系统会自动提供一个缺省析构函数
1.1格式
class 类名{
~类名(void)//不需要任何参数
{
析构函数体;
}//说明析构函数没有重载
};
构造函数和析构函数 又叫做:析构器,构造器
注意:
(1)析构函数用于回收资源,对于栈区的普通对象来说,当生命周期结束的时候自动调用析构函数,而对于堆区中的对象,当delete时调用析构函数(见代码 01destruct.cpp)
1.2 缺省析构函数
(1)如果一个类中没有提供析构函数,那么系统会自动提供一个缺省析构函数,该析构函数会调用成员变量以及基类的析构函数(见代码 02destruct.cpp)(2)系统提供的缺省析构函数不能释放动态内存资源,此时需要自定义析构函数来释放资源,当然释放的资源不仅仅是动态内存,还可以进行文件的关闭,socket的关闭等(见代码 03destruct.cpp)
2.拷贝构造函数
2.1 格式
class 类名{
类名(const 类名& 变量名)//必须要加引用,否则实参到形参发生拷贝即开始不断的调用自身
{
拷贝构造函数体;
}
};如: Student::Student(const Student&)//拷贝构造函数
注意:
a.一个类中没有自定义拷贝构造函数时,系统会自动提供一个缺少拷贝构造函数,功能就是进行字节的复制从而拷贝一个与拷贝源一模一样的副本(见代码04copyStruct.cpp)
b.缺省拷贝构造函数的字节复制往往不能事项对象之间的深拷贝,这时需要我们自定义拷贝构造函数以获得真正意义上的副本(见代码05copyStruct.cpp)
2.2 拷贝构造的时机
(1)用同类型的对象初始化另外一个新对象
(2)函数调用时传递对象作为参数(传递的不是对象的引用的时候)
(3)函数返回对象(受编译器优化的影响)
2.3 拷贝赋值函数(见代码 07copyAssign.cpp)
(1)格式
class 类名{
类名& operator=/*整体为函数名*/(const 类名& 对象名)
{
//拷贝赋值函数体
}
};
(2)注意:
a.一个类中没有自定义拷贝赋值函数时,系统会自动提供一个缺省拷贝赋值函数,功能就是进行字节的复制从而对源对象进行赋值b.当类中有动态内存时需要自定义拷贝赋值函数
(3)自定义拷贝赋值函数注意
a.先释放已有的资源之后再从拷贝源中拷贝数据b.防止自赋值
c.返回自引用,支持连续赋值