C++ new malloc 初始化與建構函式

來源:互聯網
上載者:User

Effective item 12

 

new 分配空間->初始化->建構函式

malloc 分配空間

 

對象的建立分兩步:
1. 資料成員初始化。(參見條款13)
2. 執行被調用建構函式體內的動作。

 

class AA<br />{<br />public:<br />string s;<br />};</p><p>int main()<br />{<br />AA *a = (AA *)malloc(sizeof(AA));<br />a->s = "abc";</p><p>system("pause");<br />return 0;<br />}<br />

由於a中的s未被初始化,也就是沒有調用string的預設建構函式 

導致s->s = "abc"異常

 

使用AA *a = new AA;正常運行

 

 

 

class AA<br />{<br />public:<br />AA()<br />{<br />cout << "AA constructor" << endl;<br />}<br />~AA()<br />{<br />cout << "AA destructor" << endl;<br />}<br />BB s;<br />};</p><p>int main()<br />{<br />//AA *a = (AA *)malloc(sizeof(AA));<br />//free(a);<br />AA *a = new AA;<br />delete a;<br />system("pause");<br />return 0;<br />}<br />

顯示:

BB constructor    // 對AA類中成員的初始化過程
AA constructor    // 對AA建構函式的調用
AA destructor     // 對AA解構函式的調用
BB destructor    

 

使用malloc無任何顯示

 

 

 

初始化列表與建構函式:

 

初始化列表 是複製建構函式的過程 即Intialization  (const 和引用資料 只能初始化 不可以賦值) (使用初始化列表的對象 預設初始化過程不再進行)

 

建構函式     是賦值過程                即assignment   (賦值前 已經有了一個預設初始化過程[調用他的預設建構函式]  然後在賦值操作 效率比直接利用初始化列表低)

 

 

在建構函式內對成員變數賦初值:

class BB<br />{<br />public:<br />BB()<br />{<br />cout << "BB constructor" << endl;<br />}<br />BB(const BB& bv)<br />{<br />a = bv.a;<br />cout << "BB copy constructor" << endl;<br />}<br />~BB()<br />{<br />cout << "BB destructor" << endl;<br />}<br />const BB& operator=(const BB& bv)<br />{<br />a = bv.a;<br />cout << "BB assignment" << endl;<br />return *this;<br />}</p><p>int a;<br />};</p><p>class CC<br />{<br />public:<br />CC()<br />{<br />cout << "CC constructor" << endl;<br />}<br />CC(const CC& cv)<br />{<br />a = cv.a;<br />cout << "CC copy constructor" << endl;<br />}<br />~CC()<br />{<br />cout << "CC destructor" << endl;<br />}</p><p>const CC& operator=(const CC& cv)<br />{<br />a = cv.a;<br />cout << "CC assignment" << endl;<br />return *this;<br />}<br />int a;</p><p>};</p><p>class AA<br />{<br />public:<br />AA(const BB& bb,const CC& cc)<br />{<br />b = bb;<br />c = cc;<br />}<br />//AA(const BB& bb,const CC& cc):b(bb), c(cc){}<br />BB b;<br />CC c;<br />};</p><p>int main()<br />{<br />BB b;<br />CC c;<br />AA *a = new AA(b, c);<br />delete a;<br />system("pause");<br />return 0;<br />}

顯示:

BB constructor    // main 中b的構造
CC constructor    // main 中c的構造
BB constructor    // 類AA對BB的預設初始化 通過BB的預設建構函式
CC constructor    // 類AA對CC的預設初始化 通過CC的預設建構函式
BB assignment    // 類AA建構函式中的賦值
CC assignment    // 類AA建構函式中的賦值
CC destructor
BB destructor

 

 

在初始化列表中初始化

class BB<br />{<br />public:<br />BB()<br />{<br />cout << "BB constructor" << endl;<br />}<br />BB(const BB& bv)<br />{<br />a = bv.a;<br />cout << "BB copy constructor" << endl;<br />}<br />~BB()<br />{<br />cout << "BB destructor" << endl;<br />}<br />const BB& operator=(const BB& bv)<br />{<br />a = bv.a;<br />cout << "BB assignment" << endl;<br />return *this;<br />}</p><p>int a;<br />};</p><p>class CC<br />{<br />public:<br />CC()<br />{<br />cout << "CC constructor" << endl;<br />}<br />CC(const CC& cv)<br />{<br />a = cv.a;<br />cout << "CC copy constructor" << endl;<br />}<br />~CC()<br />{<br />cout << "CC destructor" << endl;<br />}</p><p>const CC& operator=(const CC& cv)<br />{<br />a = cv.a;<br />cout << "CC assignment" << endl;<br />return *this;<br />}<br />int a;</p><p>};</p><p>class AA<br />{<br />public:<br />//AA(const BB& bb,const CC& cc)<br />//{<br />//b = bb;<br />//c = cc;<br />//}<br />AA(const BB& bb,const CC& cc):b(bb), c(cc){}<br />BB b;<br />CC c;<br />};</p><p>int main()<br />{<br />BB b;<br />CC c;<br />AA *a = new AA(b, c);<br />delete a;<br />system("pause");<br />return 0;<br />}

顯示:

BB constructor   // main 中b的構造
CC constructor    // main 中c的構造
BB copy constructor   // 類AA對BB的初始化列表中的初始化 通過BB的複製建構函式   【省去了上例的預設初始化過程】
CC copy constructor  // 類AA對CC的初始化列表中的初始化 通過CC的複製建構函式   【省去了上例的預設初始化過程】
CC destructor
BB destructor

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.