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