簡體   English   中英

具有默認參數的C ++基類構造函數

[英]C++ base class constructor with default parameters

我寫了這個小程序來測試我的理解。 我無法理解的是構造函數沒有被繼承,但是類B能夠調用類A的構造函數!

#include <iostream>
using namespace std;

class A {
public:
    A(int x = 2) {          //Constructor A
        num = x;
    }
    int getNum() {
        return num;
    }

protected:
    int num;
};

class B: public A {         //Constructor B
public:
    B() {
        A(5);
    }
};

int main() {

    A a(3);                     //create obj a with num = 3
    B b;                        //create obj b
    cout << a.getNum() << endl;
    cout << b.getNum() << endl;
    return 0;
}

輸出為:

3
2

構造函數A的調用到底做了什么? 它沒有使用傳遞的參數來初始化對象b的編號!

此外,如果我從類A的構造函數中刪除默認值,則會出現編譯錯誤:

no matching function for call to 'A::A()'

那么,這里到底發生了什么?

我知道正確的方法是:

class B: public A {         //Constructor B
public:
    B() : A(5) {
    }
};

給出輸出:

3
5

但這只是出於理解的目的。

讓我們看一下B構造函數:

B() {
    A(5);
}

在這里,您實際上兩次 “調用”了A構造函數。 一次作為B構造的一部分(在其中稱為“默認” A構造函數),一次在B構造函數體內創建一個臨時對象

順序如下

  1. B構造函數稱為
  2. 作為B對象初始化的一部分調用A默認構造函數
  3. 輸入B構造函數的主體
  4. 創建臨時對象的一部分,稱為(帶有參數5A非默認構造函數
  5. 臨時對象超出范圍並被破壞
  6. B構造函數的主體退出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM