c++物件模型筆記之建構函式

來源:互聯網
上載者:User
建構函式
你是不是這樣認為:
(1)任何類如果沒有定義預設建構函式,編譯器就會合成一個;
(2)編譯器合成的會明確社頂類中每個資料成員的預設值;
事實並非如此,只有C++編譯器需要的時候才會合成個預設建構函式。
類中帶有對象成員
class A{……};
class B
{
 private:
 A a;  //對象成員
 int x;
}
合成的建構函式
B::B( )
{
 a.A::A();
}
假如你定義了個建構函式
A::A( )
{
 x=0;
}
編譯器會追加代碼到裡面去
A::A()
{
 a.A::A();
 x=0;
}
基類中有預設建構函式(包括被合成的)
和第一種一樣,你定義了很多建構函式,編譯器會追加代碼到每個建構函式中
 
帶有虛函數的類(包括純虛函數)
編譯器的必要的操作
(1)一個虛函數表將產生,內放虛函數的地址;
(2) 一個虛函數指標將產生,指向虛函數表地址;
所以編譯器會為每個對象設定vptr的初始值,放置適當的虛函數表地址,對於類所定義的建構函式追加程式碼完成這些事。
 
虛繼承
class X{publci: int i ; };
class A :public virtual X { public : int j ;};
class B: public virtual X { public: double d;};
class C: public A,public B{ public: int k;};
void foo(const A *pa) { pa->i=1024;}  //無法在編譯期決定出pa->X::i 的位置
main() {foo(new A); foo(new C);}  // 可能轉變為 void foo (const A*pa) { pa->_vbcx->i=1024} vbcx是對象指向類X的指標,當然要在建構函式中確定。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.