建構函式初始化成員列表(constructor initializer list)
如果cmember是另乙個類的成員,你怎樣初始化它呢?答案是你必須使用成員初始化列表。
01.
class
cmyclass ;
06.
// 必須使用初始化列表來初始化成員 m_member
07.
cmyclass::cmyclass() : m_member(2)
08.
09.
沒有其它辦法將引數傳遞給m_member,如果成員是乙個常量物件或者引用也是一樣。根據c++的規則,常量物件和引用不能被賦值,它們只能被初始化。
在它們之間有什麼不同嗎?是的。編譯器總是確保所有成員物件在建構函式體執行之前被初始化,因此在第乙個例子中編譯的**將呼叫cstring::cstring來初始化m_str,這在控制到達賦值語句前完成。在第二個例子中編譯器產生乙個對cstring:: cstring(lpctstr)的呼叫並將"hi,how are you."傳遞給這個函式。結果是在第乙個例子中呼叫了兩個cstring函式(建構函式和賦值操作符),而在第二個例子中只呼叫了乙個函式。
初始化和賦值對內建型別的成員沒有什麼大的區別,像上面的任乙個建構函式都可以。對非內建型別成員變數,為了避免兩次構造,推薦使用類建構函式初始化列表。
但有的時候必須用帶有初始化列表的建構函式:
1.成員型別是沒有預設建構函式的類。若沒有提供顯示初始化式,則編譯器隱式使用成員型別的預設建構函式,若類沒有預設建構函式,則編譯器嘗試使用預設建構函式將會失敗。
2.const成員
或引用型別的成員。因為const物件或引用型別只能初始化,不能對他們賦值。
#include #includeview codeusing
namespace
std;
class
person
;person::person(
const
string &name, const
string &address):name(name),address(address),born_year(2
)string person::get_name() const
string person::get_address() const
intmain()
引用類成員???
必須對任何const或引用型別成員以及沒有預設建構函式的類型別的任何成員使用初始化式。
呵呵,標頭檔案裡確實不是初始化的地兒。引用型別是在初始化列表裡賦值的。比如你在標頭檔案裡這樣寫:
class c
;然後在原始檔中寫:
c::c() : x(y)
這樣就可以將x跟y關聯上了。
建構函式初始化列表
建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化式。例如 example example ival 0 dval 0.0 ival 和dval 是類的兩個資料成員 上面的例子和下面不用初始化列表的建構函式看似沒什麼區別 example exa...
建構函式初始化列表
c 程式語言中有很多比較重要的概念值得我們去深入 比如今天為大家介紹的有關c 建構函式的相關概念。這一方面的知識在實際程式設計中就是乙個比較重要的應用技術。希望能個大家可以從中學到一些知識。c 建構函式初始化列表以乙個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟乙個放在括號中的初始化...
建構函式初始化列表
class object private int v1,v2 看看願意是 先初始化v2為5,然後初始化v1為 3 倍的 v2 但是結果卻是奇葩的,這個是因為建構函式的初始化列表遵循的原則是先初始化父類 父類也是這個原則,那麼就相當於遞迴 然後初始化本類的成員,最後執行建構函式的函式體 而初始化本類的...