2016-09-30 57 views
5

如果它是重複的問題,我很抱歉,但是我沒有找到關於這個問題的討論。所以,我正在學習C++,並且我不明白將值分配給類對象的以下問題。我有這個實現的類牛逼的:將值分配給C++中的類對象

class T 
{ 
    int aInt; 
    double aDouble; 

    public: 
    T():aInt(0),aDouble(0.){} 

    T(int my_aInt, double my_aDouble):aInt(my_aInt), aDouble(my_aDouble){} 

    T(int my_aInt):aInt(my_aInt), aDouble(0.){} 

    T(double my_aDouble):aInt(0), aDouble(my_aDouble){} 

    void set_aInt(int my_aInt){ 
     aInt = my_aInt; 
    } 

    void set_aDouble(double my_aDouble){ 
     aDouble = my_aDouble; 
    } 

    int get_aInt(){ 
     return aInt; 
    } 

    double get_aDouble(){ 
     return aDouble; 
    } 
}; 

我要創建這個類的對象,並指定一些值給他們。我可以這樣做:

T tt1(-1, 5.), tt2(-1), tt3(5.); 

它工作正常。現在我想更改分配給對象tt1的值。我知道我可以這樣做:

tt1.set_aInt(-3); // gives aInt = -3, aDouble = 0 
tt1.set_aDouble(6.); // gives aInt = 0, aDouble = 6. 

它也可以正常工作。但似乎有另一種方式做到這一點:

tt1 = -3; // gives aInt = -3, aDouble = 0 
tt1 = 6.; // gives aInt = 0, aDouble = 6. 
tt1 = (-3, 6.); // gives aInt = 0, aDouble = 6. - Why? 

我的第一個問題是:tt1 = -3;相當於tt1.set_aInt(-3);並且這是一個好的做法呢?第二個問題是tt1 = (-3, 6.);有什麼問題,爲什麼它設定的值爲aInt等於而不是-3

+2

顯式定義賦值成員函數。 – seccpur

回答

7

您應該標記單參數構造函數explicit,因爲定義一個參數構造函數還會創建從參數類型到C++中的構造類型的隱式轉換,這通常是不期望的。

tt1 = -3; 

因此等於:

tt1 = T(-3); 

即它使用複製/移動分配。在第二種情況下,(-3, 6.)只是圍繞語句-3, 6.的括號,其中,是序列運算符。該語句因此評估爲6.,並且選擇使用double構造函數的隱式轉換。

-4

提供set_aInt是很好的,這樣您就可以跟蹤值傳遞到類中的位置,因爲它等於通過tt1 = -3;而(-3,6)被傳遞給T類,可能是覆蓋被接受的整數值,但它會擦除它並傳遞雙值6.因此你面臨一個問題。當你單獨初始化分配的兩個實例發生和分配值,但在單個初始化更新後的值將覆蓋前值進入類

2

當你寫tt1 = -3這相當於

T temp(-3); 
tt1 = temp; 

在C++ ,採用單個參數的構造函數充當隱式轉換運算符。因此,編譯器查看tt1 = -3,並發現它可以使用臨時變量中的構造函數將-3轉換爲T類型,然後使用默認的=運算符將值分配給tt16.的賦值工作方式類似,只是使用了一個使用單個double的構造函數。如果您預先使用explicit構造函數,則不會將其用於此類轉換。

當您鍵入tt1 = (-3, 6.)時,您正在調用逗號運算符。在C/C++中,(x,y)的計算結果爲y,所以這實際上相當於tt1 = 6.