C 拾遺 建構函式 一 預設構造

2021-06-28 17:04:35 字數 1787 閱讀 6421

c++拾遺--建構函式(一)預設構造

對乙個類而言,建構函式恐怕是最重要的乙個成員函式了。關於建構函式的細節繁多,並且隨著新標準的提出,建構函式有了新的特性。本文來集中**下建構函式的那些鮮為人知的一面。

建構函式的作用眾所周知:在類的物件被建立時,控制物件的初始化和賦值。

建構函式的一般形式:

類名(arg_list);

其中arg_list是用逗號隔開的引數列表。

特點:無返回值型別,且不可加const限制。

需要特別指出,無參的建構函式是預設的,有參但都有預設引數的建構函式也是預設構造。

舉例證明:

#include using namespace std;

class myclass

;public:

myclass(int a = 0, int b = 0):a(a), b(b) //有預設實參的構造方法就是預設構造

int geta()const

int getb()const };

int main()

執行

從執行結果,即可驗證結論。有參但都有預設引數的建構函式也是預設構造,這一點恐怕是很多人都容易忽略的、

預設構造初始化類的資料成員的規則:

如果存在類內的初始值,用它來初始化成員。

否則,預設初始化。(這個規則雖是標準,但大多數編譯器還做不到)

1.類內初始值。

在上例**中,int a = 0; int b;這種形式就是類內初始值。後面會說明何時使用類內初始值。

2.預設初始化。

內建型別,如int,double型別等。int->0,double->0.0。就是預設初始化。

類型別,使用該類的預設構造初始化,就是預設初始化。

預設構造並不是總是存在的,若有另乙個建構函式(非預設構造)存在,則編譯器並不會提供乙個無參的預設構造。新標準提出了一種方式:如 myclass() = default; 關鍵字 default 的這種使用,表明要求編譯器生成乙個預設的建構函式。

3.初始值列表

建構函式 myclass(int a = 0, int b = 0):a(a), b(b)   其中 a(a), b(b)就是初始值列表。

4.什麼是初始化?什麼是賦值?

物件在記憶體中建立(有了記憶體實體),第一次有的值,叫做初始化。把原先的值覆蓋掉,叫做賦值。

一般情況下,建構函式在初始值列表中完成初始化,在函式體中完成賦值。

這個結論並不好證明,但還是有辦法的,辦法就是借助:const型別和引用型別。如下**:

#include using namespace std;

class myclass

int geta()const

void printca()const

void printra()const };

int main()

執行

const型別和引用型別,在建立時,必須進行初始化。若是把 ca = a; ra = this->a; 移到建構函式體內部,則無法通過編譯。也就是說,一旦進入建構函式體,初始化就已經完成了。

需要指出,初始值列表的順序並不代表著實際初始變數的順序,而成員的宣告順序才是。

本專欄目錄

所有內容的目錄

C 基礎拾遺 建構函式

拿了本高階教程第七版的,新書有愛啊,老習慣將目錄和引文遛一邊先。想著還是都翻把,權當複習和學習。看到建構函式的時候,雖然之前也是理解過的,但看了後感覺還是有必要筆記下這個過程,當是加深記憶和備忘。這個知識點重要的就是理解建構函式的建立過程。看例子 1 class people26 7class mm...

C 拾遺系列 3 建構函式

1.主要演示建構函式的繼承 2.靜態建構函式 3.示例 using system using system.collections.generic using system.linq using system.text description 建構函式測試 namespace nettest pub...

C 拾遺系列 3 建構函式

1.主要演示建構函式的繼承 2.靜態建構函式 3.示例 using system using system.collections.generic using system.linq using system.text description 建構函式測試 namespace nettest pub...