C C 中的建構函式

2021-08-19 21:35:50 字數 2156 閱讀 7877

每個類都分別定義了它的物件被初始化的方式,類通過乙個或多個特殊的成員函式來控制其物件的初始化過程,這些函式就叫做建構函式(constructor)。建構函式的任務是初始化類物件的資料成員,無論何時只要類的物件被建立,就會執行建構函式。

建構函式的名字和類名相同,但其沒有返回型別。類可以包括多個建構函式,和其他過載函式差不多,不同的建構函式之間必須在引數數量或引數型別上有所區別。

建構函式不能被宣告為const的,在常量物件的建立過程中,可以為其中的引數寫值,知道物件建立完成才會取得const屬性。

當我們沒有為類提供建構函式的時候,編譯器會為我們隱式地定義乙個建構函式,編譯器建立的建構函式又被稱為合成的預設建構函式,它將按照以下規則初始化類地資料成員

合成的預設建構函式只適合非常簡單的類,對於普通的類來說,必須定義它自己的建構函式,原因如下:

編譯器只有在發現類不包含任何建構函式的情況下才會建立預設的建構函式

對於某些類,合成的預設建構函式可能會執行錯誤的操作,比如對陣列或指標進行預設初始化,其值將是未定義的

編譯器有時候不能為某些類建立預設建構函式,如果該類裡面含有其他類的成員而該類成員沒有預設建構函式,則編譯器不能執行預設初始化

當且僅當我們既需要普通的建構函式也需要預設建構函式的時候,可以使用=default來定義

class sales_data

}

對於sales_data類的其他建構函式

sales_data(const

std::string &s):bookno(s){} //s作為bookno的初值

sales_data(const

std::string &s,unsigned n,double p):bookno(s),units_sold(n),revenue(p*n){}

//s作為bookno的初值,n作為units_sold的初值,p*n作為revenue的初值

在引數列表與大括號之間新出現的部分稱為建構函式初始值列表,它負責為新建立物件的乙個或幾個資料成員賦初值,另外需要注意建構函式不應該輕易覆蓋掉類內的初始值,除非新賦的值與原值不同。

需要注意,成員的初始化順序與它們在類定義中出現的順序一致:第乙個成員先被初始化,然後第二個等等。建構函式初始值列表中初始值的前後位置關係不會影響實際的初始化順序,因此最好令建構函式初始值的順序與成員宣告的順序一致。

class x

//會出現錯誤,因為i在j之前被初始化

};

c++11新標準擴充套件了建構函式初始值的功能,使得我們能夠定義委託建構函式,乙個委託建構函式使用它所屬類的其他建構函式執行它自己的初始化過程,或者說把它自己的一些或全部職責委託給了其他的建構函式。

class sales_data

//下面的建構函式都委託給其他的建構函式

sales_data():sales_data(" ",0,0){}

sales_data(std::string s):sales_data(s,0,0){}

sales_data(std::istream &is):sales_data()

}

在某個類中,接受string的建構函式和接受istream的建構函式分別定義了這兩種型別向該類的轉換規則

string null_book="9999";

item.combine(null_book);

//編譯器用給定的string自動建立了乙個sales_data的物件

注意,編譯器只會執行一步型別轉換,例如從字面量再到string物件再到sales_data物件的轉換是不被允許的。

在我們不需要進行型別轉換的時候可以使用explicit關鍵字進行抑制

class sales_data //不能從string物件轉換為sales_data物件

explicit sales_data(std::istream&);

}

在不使用隱式轉換的時候,另外可以使用顯式轉換

item.combine(static_cast

(cin));

C c 類的建構函式詳解

一 建構函式是幹什麼的 class counter private 資料成員 int m value 該類物件被建立時,編譯系統物件分配記憶體空間,並自動呼叫該建構函式 由建構函式完成成員的初始化工作 eg counter c1 編譯系統為物件c1的每個資料成員 m value 分配記憶體空間,並呼...

C C 建構函式的呼叫效果

建構函式在建構函式的初始化列表中呼叫才有效果,在建構函式體中呼叫不起作用!include using namespace std class member member int a age a void show age private int age class family void show ...

c c 拷貝控制 建構函式的問題

問題1 下面 處的 注釋掉後,就編譯不過,為什麼?問題2 但是把 處的也注釋掉後,編譯就過了,為什麼?編譯錯誤 001.cpp in copy constructor test test const test 001.cpp 21 22 error no matching function for ...