C++之析构函数

145 阅读2分钟

楔子

本人因为对代码的刨根问底能力有待加强,每逢碰见一个项目,总是急于上手,而忽视了技术上的很多细节。事后总会因为没有仔细的分析技术细节而后悔惋惜,但行动力始终不足。 恰逢掘金的创作者鼓励活动,因此鼓起勇气来参加该活动,并锻炼自己的输出能力。

引言

昨天学习了侯捷老师的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(); //
}