建構函式的任務是初始化物件的資料成員,建構函式不應該輕易覆蓋掉類內的初始值,除非新賦的值與原值不同,如果你不能使用類內初始值,則所有建構函式都應該顯式地初始化每個內建型別的成員。
無需任何實參的建構函式為預設建構函式,類沒有宣告其它建構函式時編譯器會生成乙個合成的預設建構函式,如果存在類內初始值,則用它來初始化成員,否則預設初始化該成員。
有時候我們希望既有合成的預設建構函式也有自定義建構函式,可以使用=default要求編譯器生成預設建構函式。=default既可以出現在宣告,也可以出現在定義中,如果在類的內部,則預設建構函式是內聯的。
class person
;
class person
;person:
:person()
=default
;
建構函式初始值列表使用:成員名(引數名)…{}的方式為成員賦初始值,當某個成員不在初始值列表中時,它將以預設建構函式相同的方式隱式初始化。
class person;}
;
我們在定義變數的時候習慣於立即對其初始化,而非先定義(初始化),再賦值,對於類的資料成員,也有初始化和賦值的區別。
std:
:string str=
"hello"
;//定義並初始化
std:
:string str2;
//預設初始化為空字串
str2 =
"111"
;//賦值
如果沒有在建構函式的初始值列表中顯示地初始化成員,則該成員函式將在建構函式體之前執行預設初始化。下面兩段建構函式中,前者初始化了它的資料成員,後者先預設初始化它的資料成員再賦值。這一區別到底會有什麼影響取決於資料成員的型別。
class person;}
;
class person;
person:
:person
(const std:
:string& name)
如果資料成員時const或引用,必須將其初始化,類似的,當資料成員屬於某種類型別且該型別沒有定義預設建構函式時,也必須將這個成員初始化。
如果資料成員是const,引用或者某種未提供預設建構函式的類型別,我們必須通過建構函式初始值列表為這些成員提供初始值。
資料成員的初始化順序與它們在類定義中的出現順序一致,而與初始值列表中的順序沒有關係。最好令建構函式初始值的順序與成員宣告的順序保持一致,如果可能的話,盡量避免用某些成員初始化其它成員。
c++11引入了委託建構函式,乙個委託建構函式可使用它所屬類的其它建構函式執行它自己的初始化過程。
當乙個委託建構函式委託其它建構函式時,被委託的建構函式的初始值列表和函式體被依次執行,最後控制權回到委託建構函式的函式體。
class person
;person()
:person(10
,10,"123");
person
(int height)
:person()
;};int
main
(void
)
init1
init2
init3
1010
123
如果建構函式只接受乙個實參,則它實際上定義了轉換為此類型別的隱含轉換機制,我們把這種建構函式稱作轉換建構函式。
這種型別轉換只允許一步轉換,如果把下面**中person建構函式的形參型別改為const std::string& 就不能轉換了,因為此時轉換需要兩步,const char*=>std::string,std::string=>person。
class person;}
;void
testfunc
(const person& person)
intmain
(void
)int
main
(void
)
class person;}
;void
testfunc
(const person& person)
intmain
(void
)
我們可以在只有乙個實參的建構函式前面新增explicit關鍵字阻止隱式轉換,由於多個實參的建構函式不能用於執行隱式轉換,所以無需將這些建構函式指定為explicit。
explicit關鍵字只能在類內宣告建構函式時使用,不能在類外部定義中使用。
派生類能夠重用其直接基類定義的建構函式,但不包括預設,拷貝,移動建構函式,如果派生類沒有這三種建構函式,編譯器將為派生類合成它們。
派生類繼承基類建構函式的方式是提供直接基類名的using宣告語句,對於基類的每個建構函式,編譯器都在派生類中生成乙個形參列表完全相同的建構函式。如果派生類有直接的資料成員,則這些成員會被預設初始化。
class person;}
;class worker :public person
;
除此之外,我們還可以顯式呼叫基類的建構函式,但是似乎沒有辦法在函式體內呼叫基類的建構函式。
class person;}
;class worker :public person
;worker:
:worker
(const
char
* name)
:person
(name)
C 建構函式 拷貝建構函式
建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...
C 構造器(建構函式)
定義和作用 構造器是在構建類的 引用時 自動執行的方法。所以,每個類都必須至少要有乙個構造器。在訪問乙個類的時候,編譯器最先執行構造器中的 它與類同名,帶引數的構造器能夠獲取引數,但是與方法不同的是 構造器雖然也是一種 例項型別 即必須通過例項來進行呼叫,也可以稱之為引用型別 但是卻不能返回任何值 ...
C 建構函式
建構函式是一種特殊的成員函式,它主要用於為物件分配儲存空間,對資料成員進行初始化.1 建構函式的名字必須與類同名 2 建構函式沒有返回型別,它可以帶引數,也可以不帶引數 3 建構函式的主要作用是完成對類的初始化工作 4 在建立乙個類的新物件 使用new關鍵字 時,系統回自動呼叫給類的建構函式初始化新...