2011-10-10 14 views
-4
// operator_overloading.cpp 
// compile with: /EHsc 
#include <iostream> 
using namespace std; 

struct Complex { 
    Complex(double r, double i) : re(r), im(i) {} // what is this syntax? 
    Complex operator+(Complex &other); 
    void Display() { cout << re << ", " << im << endl; } 
private: 
    double re, im; 
}; 

// Operator overloaded using a member function 
Complex Complex::operator+(Complex &other) { 
    return Complex(re + other.re, im + other.im); 
} 

int main() { 
    Complex a = Complex(1.2, 3.4); 
    Complex b = Complex(5.6, 7.8); 
    Complex c = Complex(0.0, 0.0); 

    c = a + b; 
    c.Display(); 
} 
+0

類似:http://stackoverflow.com/questions/4289899/advantages-of-using-initializer-list http://stackoverflow.com/questions/1842678/c-newbie-initializer-list-question –

+0

可能的重複[構造函數中的冒號後的成員變量列表有什麼用?](http://stackoverflow.com/questions/210616/what-is-the-member-variables-list-after-the-colon-in -a-constructor-good-for) –

+0

可能的重複[在構造函數中有什麼奇怪的冒號成員語法?](http://stackoverflow.com/questions/1711990/what-is-this-weird-colon-成員在構造函數中的語法) – Flexo

回答

1

這些是成員初始值設定項。當使用該構造函數創建對象時,會根據這些成員進行初始化。

因此re被設置爲r。並且im被設置爲i

1

這是一個初始化列表。它初始化Complex的成員。

初始化列表可用於顯式初始化類的成員。如果您不以這種方式初始化您的成員,他們將獲得默認初始化。某些類型的成員必須以這種方式進行初始化,例如引用(因爲它們不能被默認初始化)或者沒有默認構造函數的類。

此語法也可用於將參數傳遞給超類的構造函數。

5
Complex(double r, double i) : re(r), im(i) {} 

這種結構被稱爲成員初始化列表在C++中。

您的會員re初始化爲值r和成員im的值i


是什麼初始化之間分配的內部構造的區別? &
有什麼優勢?

初始化使用初始化列表的成員並在構造函數體內爲其指定一個值之間有區別。

當你通過初始化列表初始化字段時,構造函數將被調用一次。

如果您使用賦值,那麼這些字段將首先使用默認構造函數進行初始化,然後使用實際值重新分配(通過賦值運算符)。

正如你所看到的那樣,在後者中創建&賦值會有額外的開銷,這對於用戶定義的類可能相當重要。

對於雙數據類型(爲此使用它)或POD類成員,沒有實際的開銷。

+0

很好的答案。我仍然不明白爲什麼使用標準賦值操作符會調用構造函數。不應該分配只是分配?如果他們只是指向對象的指針,那麼你會複製該值。對於原語,它應該是相同的,因爲沒有對象,對吧? – styfle

+1

@styfle:當成員被分配到構造函數體內部時,發生兩件事:1.成員對象是通過調用它們的構造函數來構造的。2.進一步通過賦值來分配成員對象。而在成員初始化列表的情況下,成員對象是通過調用具有參數的適當構造函數構造的。因此會產生開銷。並且您是正確的,但在基本數據類型的情況下,這種開銷並不存在,但是使用成員初始化程序列表始終如此,以確保在處理非基元類型時可以做同樣的事情。 –

相關問題