2011-01-22 88 views
0
class phone { 
    public: 
     phone(int x) { num = x; } 
     int number(void) { return num; } 
     void number(int x) { num = x; } 

    private: 
     int num; 
}; 

int main(void) 
{ 
    phone p1(10); 

    p1 = 20; // here! 

    return 0; 
} 

嗨,夥計們如何在C++中將int賦值給對象?

只是我宣佈一個簡單的類像上面之一。
之後,我分配int值給類的對象,然後它的工作!
(我打印了它的值,它被正確存儲)

如果沒有帶int參數的構造,就會發生編譯錯誤。
所以,我認爲它與一個構造函數有關。是對的嗎?

請給我一個很好的解釋。
謝謝。

+1

在C++中,如果沒有參數,最好不要放棄。你也可以讓你的號碼獲得一個const函數。 – 2013-07-16 23:55:19

回答

6

這是合法的,因爲C++會解釋任何構造函數,它可以用類型爲T的單個參數調用,作爲將T隱式轉換爲自定義對象類型的方法。在你的情況下,代碼

p1 = 20; 

被解釋爲

p1.operator= (20); 

,這是反過來解釋爲

p1.operator= (phone(20)); 

這種行爲很古怪,和它幾乎肯定不是你自找的。要禁用它,你可以標記構造explicit禁用隱式轉換:現在

class phone { 
    public: 
     explicit phone(int x) { num = x; } 
     int number(void) { return num; } 
     void number(int x) { num = x; } 

    private: 
     int num; 
}; 

,構造不會做隱式轉換時,會考慮和上面的代碼將導致錯誤。

+2

我會添加一個註釋,儘管這種行爲「非常奇怪」,但它允許你編寫`func(std :: string s);`(或`func(const std :: string&s) )`)並將它們稱爲`func(「literal」);`。 – 2011-01-22 08:58:02