2010-06-17 53 views
3

我寫了這個代碼:C++構造

class A { 
    public: 
    A(){d=2.2;cout<<d;} 
    A(double d):d(d){cout<<d;} 
    double getD(){return d;} 

    private: 
    double d; 
}; 

class Bing { 
    public: 
    Bing(){a=A(5.3);} 
    void f(){cout<<a.getD();} 
    private: 
    A a; 
}; 

int main() { 
    Bing b; 
    b.f(); 
} 

我得到的輸出:2.2 5.3 5.3而不是5.3 5.3。這是構造函數中的東西....爲什麼我得到這個?我該如何解決它?

+0

下一次請格式化使用編輯頁面上的'101010'按鈕,你的代碼。 – sbi 2010-06-17 13:48:40

+2

10分鐘內3個基本問題......也許讀一些寫得好的書會更有效? – ereOn 2010-06-17 13:52:48

+0

不!我只需要爲我的朋友回答幾個問題。我很少使用C++ ... – aharon 2010-06-17 13:55:53

回答

10

A類有兩個構造函數:默認構造函數,這臺d到2.2,並構造採取雙,這臺d,無論你傳入構造。

在您的課堂Bing中有一個類型爲A的成員變量。該成員變量在輸入Bing構造函數的主體之前被初始化。由於您沒有在構造函數的初始化程序列表中列出Bing成員,因此將調用其默認構造函數。您可以通過在初始化列表中初始化它與所需的值明確初始化:

Bing() : a(5.3) { } 
5

這是因爲您沒有使用初始化列表。

Bing構造函數應該是這樣的:

Bing() : a(5.3) 
{ 
} 

在你前面的代碼中,你創建的A(調用「默認構造函數」)的新實例,然後它會影響到A類型的另一個變量(確實稱爲分配運營商)。

+0

我沒有看到A的複製構造函數在任何地方使用。我不確定你是指引用賦值運算符還是帶雙精度的構造函數。 – dave4420 2010-06-17 14:03:30

+0

@Dave Hinton,你是對的。我顯然是指「分配運營商」。感謝您指出了這一點。 – ereOn 2010-06-17 14:11:32

0

它打印2.2因爲你是「從Bing的構造函數的調用A

Bing(){a=A(5.3);} 
2

因爲你「不要在初始化列表中初始化a,所以調用A的默認構造函數。

1

變化:

Bing(){a=A(5.3);} 

要:

Bing():a(5.3){} 

,你會得到你期望的結果。

運行時正在使用默認構造函數初始化a,然後爲其賦值。在我的表單中,它正在初始化你的價值。

1

A a的默認構造函數仍在執行構造函數必應。即使您正在初始化a立即在Bing構造函數的主體中,a的默認構造函數已經在該點執行。

但是,使用Bing的初始化列表將阻止執行a的默認構造函數。更改兵的默認構造函數:

Bing(): a(5.3) {} 
0

正如其他人所說,你應該初始化在各自的構造器初始化列表的ABing元素。您還可以將A::d設置爲默認值,因此您不需要A中的兩個構造函數。也就是說,你必須:

class A { 
    public: 
    A(){d=2.2;cout<<d;} 
    A(double d):d(d){cout<<d;} 
    double getD(){return d;} 

    private: 
    double d; 
};

你可以把它改寫爲:

class A { 
    public: 
    A(double d=2.2) : d(d) { cout << d; } 
    double getD() { return d; } 

    private: 
    double d; 
};