考慮以下**行:
int x = 5;
此語句使用拷貝初始化將新建立的整數變數x初始化為值5。
但是,類更複雜一些,因為它們使用建構函式進行初始化。本課將介紹與類的拷貝初始化相關的主題。
拷貝類的初始化
鑑於我們的fraction類:
#include #include class fraction
friend std::ostream& operator<<(std::ostream& out, const fraction &f1);};
std::ostream& operator<<(std::ostream& out, const fraction &f1)
考慮以下:
int main()
如果你要編譯並執行它,你會發現它產生了預期的輸出:
6/1這種形式的複製初始化的評估方式與以下相同:
fraction six(fraction(6));
正如您在上一課中所了解到的,這可能會呼叫fraction(int,int)和fraction拷貝建構函式(由於效能原因可能會被省略)。但是,由於不能保證刪除,最好避免類的拷貝初始化,而是使用直接或統一初始化。
規則:避免使用複製初始化,而是使用統一初始化。
其他地方使用拷貝初始化
還有一些其他地方使用了拷貝初始化,但其中兩個值得明確提及。按值傳遞或返回類時,該程序使用複製初始化。
考慮:
#include #include class fraction
// 拷貝建構函式
fraction(const fraction ©) :
m_numerator(copy.m_numerator), m_denominator(copy.m_denominator)
friend std::ostream& operator<<(std::ostream& out, const fraction &f1);
int getnumerator()
void setnumerator(int numerator) };
std::ostream& operator<<(std::ostream& out, const fraction &f1)
fraction makenegative(fraction f) // 理想情況下我們應該通過const引用來做到這一點
int main()
在上面的程式中,函式makenegative按值獲取分數,並返回按值分數。當我們執行這個程式時,我們得到:
copy constructor called
copy constructor called
-5/3
當fivethirds作為引數傳遞給makenegative()引數f時,會發生第乙個拷貝構造函式呼叫。當makenegative()的返回值傳遞歸main()時,會發生第二次呼叫。
在上面的例子中,不能省略通過值傳遞的引數和返回值。但是,在其他情況下,如果引數或返回值滿足特定條件,編譯器可能會選擇忽略拷貝建構函式。例如:
class something;
something foo()
int main()
在這種情況下,編譯器可能會忽略拷貝建構函式,即使變數s是按值返回的。 C 基礎教程物件導向(學習筆記5(2))
在編寫具有多個建構函式的類 大多數建構函式 時,必須為每個建構函式中的所有成員指定預設值會導致冗餘 如果更新成員的預設值,則需要觸控每個建構函式。從c 11開始,可以直接為普通類成員變數 不使用static關鍵字的變數 提供預設初始化值 class rectangle void print int ...
C 基礎教程物件導向(學習筆記(23))
過載一元運算子 與您目前看到的運算子不同,正 負 和邏輯非 運算子都是一元運算子,這意味著它們只能在乙個運算元上執行。因為它們僅對它們所應用的物件進行操作,所以通常將一元運算子過載實現為成員函式。所有三個運算元都以相同的方式實現。讓我們看一下我們如何在前面的例子中使用的cents類上實現operat...
C 基礎教程物件導向(學習筆記(24))
過載比較運算子相對簡單,因為它們遵循我們在過載其他運算子時看到的相同模式。因為比較運算子都是不修改左運算元的二元運算子,所以我們將使過載的比較運算子宣告為友元函式。這是乙個帶有過載運算子 和operator!的car類的示例。include include class car friend bool...