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

2021-08-28 17:46:36 字數 2129 閱讀 6853

在編寫具有多個建構函式的類(大多數建構函式)時,必須為每個建構函式中的所有成員指定預設值會導致冗餘**。如果更新成員的預設值,則需要觸控每個建構函式。

從c ++ 11開始,可以直接為普通類成員變數(不使用static關鍵字的變數)提供預設初始化值:

class rectangle

void print()

}; int main()

該程式產生結果:

length:1.0,width: 1.0

非靜態成員初始化(也稱為類內成員初始值設定項)為建構函式將提供的成員變數提供預設值,如果建構函式不為成員本身提供初始化值(通過成員初始化列表)。

但是,注意建構函式仍然確定可以建立哪種物件。考慮以下情況:

class rectangle

void print()

};int main()

即使我們為所有成員提供了預設值,也沒有提供預設建構函式,因此我們無法建立沒有引數的rectangle物件。

如果提供了預設初始化值並且建構函式通過成員初始值設定項列表初始化成員,則成員初始值設定項列表將優先。以下示例顯示了這一點:

class rectangle

void print()

};int main()

這列印:

length:2.0,width:3.0

請注意,使用非靜態成員初始化初始化成員需要使用等號或大括號(統一)初始化程式 - 直接初始化表單在此處不起作用。

規則:支援使用非靜態成員初始化為您的成員變數提供預設值。

quiz time

1)更新以下程式以使用非靜態成員初始化和成員初始化列表。

2)為什麼我們需要在上面的程式中宣告乙個空的預設建構函式,因為所有成員都是通過非靜態成員初始化初始化的?

#include #include class ball

// 建構函式僅僅有color引數 (radius採用預設值)

ball(const std::string &color)

// 建構函式僅僅有radius引數 (color採用預設值)

ball(double radius)

// 具有color和radius引數的建構函式

ball(const std::string &color, double radius)

void print() };

int main()

該程式應該產生結果:

color:black,radius:10

color:blue,radius:10

color:black,radius:20

color:blue,radius:20

解決方案:

#include#includeusing namespace std;

class ball

//m_radius採用預設引數,這裡僅僅提供m_color引數

ball(const string &color) :m_color(color)

//m_color採用預設引數,這裡僅僅提供m_radius引數

ball(double radius) :m_radius(radius)

//這裡提供m_radius和m_color引數

ball(const string &color, double radius) :m_color(color), m_radius(radius)

void print();

private:

string m_color="black";

double m_radius = 10;

};void ball::print()

int main()

問題2:為什麼我們需要在上面的程式中宣告乙個空的預設建構函式,因為所有成員都是通過非靜態成員初始化初始化的?

回答:「ball def;」將尋找乙個預設建構函式來處理物件的例項化。如果該預設建構函式不存在(即使它是空的),編譯器將丟擲錯誤。

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

過載一元運算子 與您目前看到的運算子不同,正 負 和邏輯非 運算子都是一元運算子,這意味著它們只能在乙個運算元上執行。因為它們僅對它們所應用的物件進行操作,所以通常將一元運算子過載實現為成員函式。所有三個運算元都以相同的方式實現。讓我們看一下我們如何在前面的例子中使用的cents類上實現operat...

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

過載比較運算子相對簡單,因為它們遵循我們在過載其他運算子時看到的相同模式。因為比較運算子都是不修改左運算元的二元運算子,所以我們將使過載的比較運算子宣告為友元函式。這是乙個帶有過載運算子 和operator!的car類的示例。include include class car friend bool...

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

重新初始化型別 由於我們將在接下來的幾節課中談論很多初始化,讓我們首先回顧一下c 支援的初始化型別 直接初始化,統一初始化或拷貝初始化。以下是使用我們的fraction類的所有示例 include include class fraction friend std ostream operator ...