C 基礎教程物件導向(學習筆記(30))

2021-08-29 13:59:29 字數 1780 閱讀 6493

考慮以下**行:

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...