楔子
本人因为对代码的刨根问底能力有待加强,每逢碰见一个项目,总是急于上手,而忽视了技术上的很多细节。事后总会因为没有仔细的分析技术细节而后悔惋惜,但行动力始终不足。 恰逢掘金的创作者鼓励活动,因此鼓起勇气来参加该活动,并锻炼自己的输出能力。
引言
昨天学习了侯捷老师的C++面向对象的程序设计的前三篇,对于课程中所讲的析构函数不甚理解,因此对于析构函数的概念进行学习。 因为本人还属于初学者,对于很多概念还未有深入的了解,可能在行文中有诸多错误,对于大佬们的建议会虚心请教,也会在后期进行修正。
为什么要有析构函数
析构函数的概念
析构函数的形式
析构函数的长相和一般的函数很不相同,
构造函数具有与类相同的特征,无返回值
析构函数的特点
1.重载
重载是指,构造函数的名称相同,但参数的个数,类型、顺序会不同
// 使用官方文档中的一个例子进行说明,对Box类进行了三次重载,主要表现在参数个数的不同
class Box {
public:
// Default constructor
Box() {}
// Initialize a Box with equal dimensions (i.e. a cube)
explicit Box(int i) : m_width(i), m_length(i), m_height(i) // member init list
{}
// Initialize a Box with custom dimensions
Box(int width, int length, int height)
: m_width(width), m_length(length), m_height(height)
{}
int Volume() { return m_width * m_length * m_height; }
private:
// Will have value of 0 when default constructor is called.
// If we didn't zero-init here, default constructor would
// leave them uninitialized with garbage values.
int m_width{ 0 };
int m_length{ 0 };
int m_height{ 0 };
};
析构函数虽然具有重载的特点,但是要注意,重载的构造函数的实例化类不能重合,这会让编译器无法决策该使用哪一个析构函数进行类的初始化。
// 使用侯捷老师的一个复数例子进行说明
class complex{
public:
complex (double r = 0;double i = 0)
:re(r),im(i)
{}
complex() :re(0),im(0){}
complex c2();
complex& operator + = (const complex&);
double real() const {return re;} //返回
double imag() const {return im;} // 返回
void real(double r) {re = r;} // 赋值
}
{
// c1和c2均不需要手动设置初始化参数,编译器无法抉择使用哪一个构造器进行编译
complex c1; //
complex c2(); //
}