與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。在c++中,struct和class的唯一區別是預設的訪問性不同,而這裡我們不考慮訪問性的問題,所以下面的**都以struct來演示。
struct foo建構函式的執行可以分成兩個階段,初始化階段和計算階段,初始化階段先於計算階段。; // 初始化列表
};
所有類型別(class type)的成員都會在初始化階段初始化,即使該成員沒有出現在建構函式的初始化列表中。
一般用於執行建構函式體內的賦值操作,下面的**定義兩個結構體,其中test1有建構函式,拷貝建構函式及賦值運算子,為的是方便檢視結果。test2是個測試類,它以test1的物件為成員,我們看一下test2的建構函式是怎麼樣執行的。
struct test1test1(const test1& t1) // 拷貝建構函式
test1& operator = (const test1& t1) // 賦值運算子
int a ;
};struct test2
};
呼叫**
test1 t1 ;輸出test2 t2(t1) ;
解釋一下,第一行輸出對應呼叫**中第一行,構造乙個test1物件。第二行輸出對應test2建構函式中的**,用預設的建構函式初始化物件test1,這就是所謂的初始化階段。第三行輸出對應test1的賦值運算子,對test1執行賦值操作,這就是所謂的計算階段。
初始化類的成員有兩種方式,一是使用初始化列表,二是在建構函式體內進行賦值操作。使用初始化列表主要是基於效能問題,對於內建型別,如int, float等,使用初始化類表和在建構函式體內初始化差別不是很大,但是對於類型別來說,最好使用初始化列表,為什麼呢?由上面的測試可知,使用初始化列表少了一次呼叫預設建構函式的過程,這對於資料密集型的類來說,是非常高效的。同樣看上面的例子,我們使用初始化列表來實現test2的建構函式
struct test2使用同樣的呼叫**,輸出結果如下。}
第一行輸出對應 呼叫**的第一行。第二行輸出對應test2的初始化列表,直接呼叫拷貝建構函式初始化test1,省去了呼叫預設建構函式的過程。所以乙個好的原則是,能使用初始化列表的時候盡量使用初始化列表。
除了效能問題之外,有些時場合初始化列表是不可或缺的,以下幾種情況時必須使用初始化列表
對於沒有預設建構函式的類,我們看乙個例子。
struct test1int i ;
};struct test2
};
以上**無法通過編譯,因為test2類中test1 test1;需要呼叫預設的建構函式,但是test1類沒有無參的建構函式,但是由於test1沒有預設的建構函式,故而編譯錯誤。正確的**如下,使用初始化列表代替賦值操作。
struct test2成員是按照他們在類**現的順序進行初始化的,而不是按照他們在初始化列表出現的順序初始化的,看**。}
struct foo再看下面的**; // ok, 先初始化i,後初始化j
};
struct foo這裡i的值是未定義的,雖然j在初始化列表裡面出現在i前面,但是i先於j定義,所以先初始化i,但i由j初始化,此時j尚未初始化,所以導致i的值未定義。所以,乙個好的習慣是,按照成員定義的順序進行初始化。// i值未定義
};
如何提高效率
如果問 你想不想使自己的收入加倍 我猜每個人的答案都是 yes 如果我繼續問 你相不相信現在你的收入會加倍 我想有一些人可能會沒把握,有一些人認為不太可能,我告訴各位 你們每個人的收入一定會加 倍 因為按照每年物價增長率及通貨膨脹的正常速度,20年後你的收入一定會加倍。但是如果你希望,提前在5年內 ...
Python 提高效率
最近師兄給了小任務,算乙個p值。任務詳情是這樣的 第一步,有基因集a,23個元素,基因集b,451個元素,共有23 451 9922個組合 當然你要考慮去重 看在ppi資料庫 145萬多行資料 中出現的組合總個數 觀察值 第二步,然後再以hg19中基因為背景基因集,放回隨機抽取23個基因構成基因集c...
如何提高效率
在提高班學習有很長的一段時間了,學習的收穫中有一點是非常的明顯,那就是自己的效率明顯的比原來高出許多,現在就按照自己的切身體會來總結一下如何提高自己效率.1 目標 必須要有目標,沒有目標和方向效率會大大的折扣.當然不僅僅是學習,更是生活,事業,和人的整個一生.這點公尺老師非常的重視,每個學習階段都給...