// 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();
}
回答
這些是成員初始值設定項。當使用該構造函數創建對象時,會根據這些成員進行初始化。
因此re
被設置爲r
。並且im
被設置爲i
。
這是一個初始化列表。它初始化Complex
的成員。
初始化列表可用於顯式初始化類的成員。如果您不以這種方式初始化您的成員,他們將獲得默認初始化。某些類型的成員必須以這種方式進行初始化,例如引用(因爲它們不能被默認初始化)或者沒有默認構造函數的類。
此語法也可用於將參數傳遞給超類的構造函數。
Complex(double r, double i) : re(r), im(i) {}
這種結構被稱爲成員初始化列表在C++中。
它您的會員re
初始化爲值r
和成員im
的值i
。
是什麼初始化之間分配的內部構造的區別? &
有什麼優勢?
初始化使用初始化列表的成員並在構造函數體內爲其指定一個值之間有區別。
當你通過初始化列表初始化字段時,構造函數將被調用一次。
如果您使用賦值,那麼這些字段將首先使用默認構造函數進行初始化,然後使用實際值重新分配(通過賦值運算符)。
正如你所看到的那樣,在後者中創建&賦值會有額外的開銷,這對於用戶定義的類可能相當重要。
對於雙數據類型(爲此使用它)或POD類成員,沒有實際的開銷。
很好的答案。我仍然不明白爲什麼使用標準賦值操作符會調用構造函數。不應該分配只是分配?如果他們只是指向對象的指針,那麼你會複製該值。對於原語,它應該是相同的,因爲沒有對象,對吧? – styfle
@styfle:當成員被分配到構造函數體內部時,發生兩件事:1.成員對象是通過調用它們的構造函數來構造的。2.進一步通過賦值來分配成員對象。而在成員初始化列表的情況下,成員對象是通過調用具有參數的適當構造函數構造的。因此會產生開銷。並且您是正確的,但在基本數據類型的情況下,這種開銷並不存在,但是使用成員初始化程序列表始終如此,以確保在處理非基元類型時可以做同樣的事情。 –
- 1. R - 這個tapply()函數做了什麼?
- 2. 這是什麼構造函數調用以下雙括號?
- 3. 這個JavaScript程序中的參數'i'和函數各有什麼功能?
- 4. 什麼是'這個'的構造函數,它是什麼
- 5. 爲什麼這個構造函數是這樣寫的?
- 6. 這個構造函數在做什麼?
- 7. 函數(i)在這個jQuery代碼中意味着什麼?
- 8. Delphi中的「i:= i - $ 24」這行代碼中的「$」是什麼?
- 9. 這是複製構造函數elision嗎?
- 10. 在這個std :: vector構造函數中發生了什麼?
- 11. 什麼是數據[,-i]在R中的含義
- 12. 從R調用這個C函數(libqp_gsmo.c)的方法是什麼?
- 13. 什麼類型的java構造函數是這些?構造函數鏈接?
- 14. 爲什麼這個複製構造函數在程序中被調用?
- 15. 爲什麼需要這個複製構造函數
- 16. 爲什麼我得到這個輸出(整數和雙歧義)?
- 17. 爲什麼我得到構造函數和這裏調用的複製構造函數?
- 18. 爲什麼這個函數被認爲是由linters構造的?
- 19. 這個構造函數的語法是什麼?
- 20. Javascript:這個`Array(i + 1)`做什麼?
- 21. 這是什麼錯這個JS程序
- 22. 爲什麼我會得到這個函數的雙控制檯消息?
- 23. 通過構造仿函數無法實現的雙函數是什麼?
- 24. 雙列表複製構造函數:與單列表複製構造函數有什麼不同?
- 25. 在R公式中,爲什麼我必須使用I()函數的冪項,如y〜I(x^3)
- 26. 爲什麼IllegalAccessError不具有雙參數構造函數?
- 27. 爲什麼我得到這個文件I/O異常?
- 28. 爲什麼不是「這個」。命令需要在這個構造函數中? (java)
- 29. 這是用於構造函數的術語是什麼?
- 30. R中的這個錯誤是什麼?
類似:http://stackoverflow.com/questions/4289899/advantages-of-using-initializer-list http://stackoverflow.com/questions/1842678/c-newbie-initializer-list-question –
可能的重複[構造函數中的冒號後的成員變量列表有什麼用?](http://stackoverflow.com/questions/210616/what-is-the-member-variables-list-after-the-colon-in -a-constructor-good-for) –
可能的重複[在構造函數中有什麼奇怪的冒號成員語法?](http://stackoverflow.com/questions/1711990/what-is-this-weird-colon-成員在構造函數中的語法) – Flexo