为了账号安全,请及时绑定邮箱和手机立即绑定

为什么第二种构造函数的方式,运行结果会多显示一行呢?

为什么第二种构造函数的方式,运行结果会多显示一行呢?

C++
三国纷争 2023-05-02 15:10:36
#include <iostream> using namespace std;class Point {  public:Point(double a = 0, double b = 0){     x = a;      y = b; }  ~Point(){ cout << "Executing Point destructor \n";} private: double x; double y;   }; class Circle: public Point { public:Circle(double a=0, double b=0, double c=0):Point(a,b), radius(c){} ~Circle(){cout<<"executing Circle destructor"<<endl;}private: double radius; };int main(){ Point * p = new Circle(1, 1, 4); delete p; return 0; }执行的结果是:Executing Point destructor但我把派生类的构造函数:Circle(double a=0, double b=0, double c=0):Point(a,b), radius(c){}改成Circle(double a=0, double b=0, double c=0){    Point(a,b);     radius = c; }运行结果是:Executing Point destructor Executing Point destructor
查看完整描述

1 回答

?
慕码人8056858

TA贡献1803条经验 获得超6个赞

Circle(double a=0, double b=0, double c=0){    Point(a,b);//这行写法是错误的
    radius = c;
}

你只能在构造函数后面的冒号那里(叫初始化列表),用参数来初始化基类.
不能在构造函数体内这么写(因为当开始执行函数体时, 基类已经完成了构造),你这么写事实上相当于在栈上构造了一个临时对象, 函数返回后即被销毁,于是多了一行输出.
而类成员(radius)两种写法都可以,可以在初始化列表初始化,也可以在函数体里赋值,前者有更高的执行效率(不考虑优化的话).

另外你的main函数中的用法也存在问题,如果你希望用基类的指针储存派生类对象,那么你需要把基类的析构函数声明为virtual的,否则在delete的时候会出现内存泄漏.


查看完整回答
反对 回复 2023-05-05
  • 1 回答
  • 0 关注
  • 124 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信