2013-08-17 84 views
0

我已經做了一個簡單的類來嘗試C++中的轉換構造函數。爲什麼不調用轉換構造函數?

它很明顯,但是當做某個操作時,似乎編譯器不會調用它。我會知道爲什麼,或者我錯了。

#include <iostream> 
using std::cout; using std::endl; 

class CostruttoreConversione 
{ 
public: 
    CostruttoreConversione(int val = 0) 
    { 
    cout << "Costruttore chiamato" << endl; 
    valore = val; 
    } 

    inline int getValore(){ 
    return valore; 
    } 

    CostruttoreConversione provaConversioneImplicita() 
    { 
    return -10; //here the type *should* be converted; doesn't happen. 
    } 

private: 
    int valore; 
}; 

int main(void){ 
    CostruttoreConversione obj(10); 
    cout << "obj = " << obj.getValore() << endl; 
    obj = 20; //WORKS 
    cout << obj.getValore() << endl; 
// cout << obj.provaConversioneImplicita() << endl; doesn't work. 
    return 0; 
} 
+0

什麼是錯誤信息? –

+1

當您在類中定義函數時,您不需要聲明函數'inline';它具有相同的效果。 –

回答

2

建設應該工作,但是那是因爲你還沒有爲你的類中定義的輸出操作失敗輸出操作。

你仍然可以做例如

cout << obj.provaConversioneImplicita().getValore() << endl; 

或者你定義輸出操作:

inline std::ostream& operator<<(std::ostream& os, const CostruttoreConversione& cc) 
{ 
    os << cc.getValore(); 
    return os; 
} 
+0

請注意,當您從ConstruttoreConversione :: provaConversioneImplicita()返回-10時,它會返回一個臨時值,以便調用該資金的實例的valore成員變量將不會被修改。 – rohitsan

+0

你說得對。我的想法是錯誤的。 我完全忘記了實現<<運算符。 – edmz

1

可以重載轉換運算符,這樣CostruttoreConversione可以轉換爲int。

class CostruttoreConversione{ 
    operator int() const{ 
    return valore; 
    } 
} 

也寫一個拷貝構造

0

默認構造和參數化的構造一起構成轉換構造。 例如, 如果您正在編寫用於創建ADT數組的程序, 當您在函數main中聲明數據類型數組的變量時, main將調用參數化構造函數,該構造函數將數組轉換爲您用於的數據類型開發數組。 因此間接轉換正在發生。 因此不調用轉換構造函數。 但默認和參數化的構造函數在內部執行轉換。

相關問題