构造函数与析构函数的调用次序

我们知道C++类中的构造函数与析构函数几乎是成对出现,构造函数用来初始化类的数据成员,而析构函数的作用主要是完成所需资源的回收。另外两者的调用次序相反,即最先构造的对象最后被析构,最后构造的对象最先被析构。以下用一段简单的代码验证一下它们的调用顺序。

#include <iostream>
using namespace std;
class Stu
{
private:
 int num;
public:
 Stu(int a):num(a)
 {
  cout<<"第"<<num<<"个Stu对象的构造函数被调用"<<endl;
 }
 ~Stu()
 {
     cout<<"第"<<num<<"个Stu对象的析构函数被调用"<<endl;
 }
};
int main()
{
 cout<<"程序运行时"<<endl;
 Stu test[4]={1,2,3,4};
 cout<<"退出main函数时"<<endl;
 return 0;
}

运行结果是:

 

验证结论。

好的,这是一个经典的面向对象编程的例子,我来逐步解释一下。 首先,我们声明一个基类Shape,其中包含一个方法来计算面积: ```C++ class Shape { public: virtual double getArea() const = 0; // 纯虚函数,计算面积 virtual ~Shape() {} // 虚析构函数,确保子类析构时也会被调用 }; ``` 这里使用了纯虚函数来定义计算面积的功能,因为不同的形状计算面积的方法是不同的,我们需要在子类中实现这个方法。 接下来,我们从Shape派生两个类:Rectangle和Circle: ```C++ class Rectangle : public Shape { public: Rectangle(double w, double h) : width(w), height(h) {} double getArea() const override { return width * height; } private: double width, height; }; class Circle : public Shape { public: Circle(double r) : radius(r) {} double getArea() const override { return 3.14159 * radius * radius; } private: double radius; }; ``` 这里使用了override关键字来覆盖基类的虚函数,确保在子类中实现了正确的功能。Rectangle和Circle分别实现了自己的计算面积的方法,也定义了自己的构造函数。 接下来,我们从Rectangle派生正方形类Square: ```C++ class Square : public Rectangle { public: Square(double s) : Rectangle(s, s) {} }; ``` 注意到正方形是矩形的一种特殊情况,因此我们可以从Rectangle派生Square,然后在构造函数中将正方形的宽和高都设置为边长s。 最后,我们可以创建各派生类的对象,观察构造函数析构函数调用次序,以及计算不同对象的面积: ```C++ int main() { Shape* s1 = new Rectangle(2, 3); Shape* s2 = new Circle(1.5); Shape* s3 = new Square(2); cout << "Area of rectangle: " << s1->getArea() << endl; cout << "Area of circle: " << s2->getArea() << endl; cout << "Area of square: " << s3->getArea() << endl; delete s1; delete s2; delete s3; return 0; } ``` 这里使用了指针来创建对象,并使用虚析构函数确保子类析构时也会被调用。我们可以观察到构造函数调用顺序是Shape -> Rectangle -> Square/Circle,析构函数调用顺序是Square/Circle -> Rectangle -> Shape,即与构造函数相反的顺序。 最后,我们计算了不同对象的面积,并输出了结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值