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

#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


三国纷争
浏览 130回答 1
1回答

慕码人8056858

Circle(double&nbsp;a=0,&nbsp;double&nbsp;b=0,&nbsp;double&nbsp;c=0){&nbsp;&nbsp;&nbsp;&nbsp;Point(a,b);//这行写法是错误的 &nbsp;&nbsp;&nbsp;&nbsp;radius&nbsp;=&nbsp;c; }你只能在构造函数后面的冒号那里(叫初始化列表),用参数来初始化基类.不能在构造函数体内这么写(因为当开始执行函数体时, 基类已经完成了构造),你这么写事实上相当于在栈上构造了一个临时对象, 函数返回后即被销毁,于是多了一行输出.而类成员(radius)两种写法都可以,可以在初始化列表初始化,也可以在函数体里赋值,前者有更高的执行效率(不考虑优化的话).另外你的main函数中的用法也存在问题,如果你希望用基类的指针储存派生类对象,那么你需要把基类的析构函数声明为virtual的,否则在delete的时候会出现内存泄漏.
打开App,查看更多内容
随时随地看视频慕课网APP