析构函数
概念:
析构函数执行与构造函数相反的操作:构造函数初始化对象的非static的数据成员,析构函数则是释放对象所用的资源,并销毁对象的非static数据成员。
特征:
析构函数的名字是由波浪线接类名构成,他没有返回值,也不接受参数,所以析构函数不能被重载。
注意:
析构函数和构造函数相同,构造函数有一个函数体和初始化部分,析构函数也有一个函数体和析构部分。在构造函数中,成员的初始化是在函数体执行之前进行,成员的初始化顺序是按照成员在类中出现的次序所决定的,而在析构函数中正好相反,是先执行函数体再执行析构部分,成员的销毁顺序与初始化顺序相反。
析构函数的调用是在对象最后一次被使用之后。
析构函数的析构部分是隐式的,函数体并不直接销毁成员。
销毁类类型的成员需执行成员自己的析构函数。
内置类型没有析构函数,因此销毁内置类型成员什么也不需要做。
隐式的销毁一个内置指针类型成员不会delete它所指向对象。
当指向一个对象的引用或指针离开作用域时,析构函数不会被执行。
合成析构函数:
当一个类未定义自己的析构函数时,编译器会为他定义一个合成析构函数,在合成析构函数执行后,成员会被自动销毁。
代码实现
<span style="font-size:14px;">class Complex
{
private:
double _real;
double _image;
public:
Complex() {}
Complex(double x, double y) :_real(x), _image(y) {}
Complex(const Complex &a)
{
_real = a._real;
_image = a._image;
}
Complex &operator=(const Complex &a)//赋值拷贝函数(运算符重载)
{
if (this == &a)
{
return *this;
}
this->_real = a._real;
this->_image = a._image;
return *this;
}
void Print()//打印对象
{
cout << _real << _image << endl;
}
~Complex(){}//析构函数
};
int main()
{
Complex C1;
Complex C3(2.0, 1.2);
C1 = C3;
Complex C2(C3);
C3.Print();
C2.Print();
C1.Print();
}</span>