成員們的初始化隊伍
如果有這樣的定義:
x x0;
x x1
(x0)
;x x2 = x0;
x x3 =
x(x0)
;
都將會導致x的拷貝建構函式被呼叫。
如果函式定義如下
void foo(x x0);
x xx;
foo(xx);
x那麼呼叫foo函式時,將會呼叫x類的拷貝建構函式,生成乙個臨時物件,如下:
x temp;
temp.x::
x(xx)
;foo
(temp)
;
另一種可能的方式是,拷貝構造的方式,把實際引數構建在其應該在的位置上(棧)。函式返回時,棧上的區域性物件析構函式將會被執行。
x foo()
這種情況下,一種可能的優化方式為:
將函式增加乙個額外引數,型別是x物件的引用。
然後在return指令之前增加乙個拷貝構造的呼叫操作,將要傳回的物件構造出來。
一種可能的優化方式為:
x foo()
在前文中返回值的初始化一節提到的優化方式,有時候被稱為具名返回值(named return value).
如果乙個類中只有最基礎的資料型別,那麼會產生bitwise copy,不需要使用者自定義顯示的拷貝建構函式。
有以下四種成員,必須經由初始化列表初始化:
引用成員
常量基類建構函式擁有引數
成員的建構函式有引數
初始化列表相當於在建構函式之前插入了初始化成員的**。而且是由類中變數宣告的順序來的,不是按照初始化列表中的順序來的。
初始化列表中的順序如果和類中成員的宣告順序不同時,可能會導致問題
如:
class
x}
實際上會先將i的值設定為j, 然後再將j的值設定為val。由於j的初始值是不確定的,因此最終i的值也是不確定的。 《深度探索c 記憶體模型》讀書筆記 (二)
總結c 編譯器會在人意想不到的地方做一些隱式操作。例如,只含有乙個引數的建構函式,會被當做型別轉換運算子。而關鍵字explict就是為了阻止這一機制。c 編譯器會在需要的時候自動生成預設建構函式。如果乙個類沒有任何的建構函式,但是它有乙個物件成員,這個物件成員有乙個預設建構函式。那麼編譯器將會為這個...
《深度探索c 記憶體模型》讀書筆記 (五)
乙個類物件所佔空間的大小主要受以下三個因素影響 語言本身的額外負擔,虛繼承,虛函式 編譯器對特殊情況的優化處理 空的 對齊 乙個沒有資料成員的普通物件 沒有虛基類和虛繼承 所占用的空間也不是0個位元組。而是1個位元組,這個是被編譯器安插進去的,為了使這個物件在記憶體中保持獨一無二的位址。然而,當這個...
《深度探索C 物件模型》讀書筆記(5)
純虛函式 在設計抽象基類時,需要注意以下幾點 1 不要將destructor宣告為pure virtual function 如果將destructor宣告為pure virtual function,則設計者一定得定義它。因為每乙個derived class destructor會被編譯器加以擴充...