亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么第二種構造函數的方式,運行結果會多顯示一行呢?

為什么第二種構造函數的方式,運行結果會多顯示一行呢?

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 關注
  • 276 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號