2014-09-01 71 views
5

爲什麼返回運算符重載允許的構造函數?爲什麼在運算符重載中返回允許的構造函數?

下面是一個例子:

Complex Complex::operator*(const Complex &operand2) const 
{ 
    double Real = (real * operand2.real)-(imaginary * operand2.imaginary); 
    double Imaginary = (real * operand2.imaginary)+(imaginary * operand2.real); 

    return Complex (Real, Imaginary); 
} 

這似乎爲對象,而不是對象本身將返回一個構造函數?那裏有什麼回報?

這似乎更有意義:

Complex Complex::operator*(const Complex &operand2) const 
{ 
    double Real = (real * operand2.real)-(imaginary * operand2.imaginary); 
    double Imaginary = (real * operand2.imaginary)+(imaginary * operand2.real); 

    Complex somenumber (Real, Imaginary); 

    return somenumber; 
} 
+7

'復(...)'是*實例*'的Complex'建設。構造函數用於初始化該類型的對象,在這種情況下爲臨時對象。 – 0x499602D2 2014-09-01 23:45:34

+3

「返回構造函數」?你在地球上得出的結論是它「返回一個構造函數」?在C++語言中,構造函數的名稱如「Complex :: Complex」。注 - 兩個相同的部分用'::'分隔。這將是一個構造函數名稱。現在,您在哪裏看到任何在您發佈的代碼中看起來像構造函數的東西? – AnT 2014-09-02 00:22:57

+0

爲什麼不'返回{真實,虛構};'? – 2014-09-02 08:38:36

回答

10

在C++中的語法:(又名臨時對象)類型名(參數)裝置創建未命名的對象類型的類型名 。參數傳遞給該對象的構造函數(或用作基元類型的初始值)。

它在含義上你的第二個例子很相似:

Complex somenumber(Real, Imaginary); 
return somenumber; 

唯一的區別在於對象有一個名字。

這兩個版本之間有一些細微的差異,涉及複製或將對象移回到調用函數。 More info here

除了當它part of a function declaration

+0

馬特,我編輯了第二個例子。是的,因爲()運算符沒有在Complex中超載,所以沒有多大意義。 – Overtaker 2014-09-01 23:55:22

+0

@Overtaker確定,已更新 – 2014-09-02 00:03:04

+0

至於你提到的複製/移動構造函數,使用第一個版本並返回一個未命名的臨時對象會更好嗎? – Overtaker 2014-09-02 00:17:09

相關問題