2016-04-30 59 views
0

我認爲賺錢重載的構造explicit防止拷貝初始化,如果我這樣做需要它explicit我怎樣才能使拷貝初始化爲下面的類如何啓用顯式重載構造函數的複製初始化?

class real { 
public: 
    explicit real(const double& value) : x(value) {} 
    real(const real& other) : x(other.x) {} 
    ~real() = default; 

    real& operator= (const double& rhs) { 
     this->x = rhs; 
     return *this; 
    } 

    operator double() { 
     return this->x; 
    } 
private: 
    double x; 
}; 

int main(){ 

    real r1 = 3.4; // Error 
    real r2 = (real) 3.4; // Ok : is this the only way ? 

    return 0; 
} 

回答

1

這是不好的C++:

real r2 = (real) 3.4; 

你想要的是:

real r2(3.4); 

這是傳遞參數的常用方法到C++中的構造函數。這就是人們在閱讀代碼時期望看到的內容。

如果你有,你需要分配的情況下,你可以這樣做:

r2 = real(3.4); 
+1

你的意思是我通過調用創建臨時對象,而不是鑄造拷貝構造函數...這是很好的方式不知道我是怎麼錯過了這個......但我認爲我可以做直接分配(複製初始化)而不需要創建臨時對象。 – Laith

+0

對。無論如何,我認爲不會對優化編譯器產生不利的性能影響。 –