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