C++拾遺--構造函數(二)
在構造函數(一)中討論的是默認構造函數的一些應用。這裡我們來探討下其它的一些有名構造函數,及其它們的應用場景。
#include運行using namespace std; class Complex { protected: int real = 0; int imag = 0; public: //默認構造 Complex() { cout << Complex() << endl; } Complex(int r, int i) :real(r), imag(i) { cout << Complex(int r, int i) << endl; } //指定其它的構造函數完成自己的工作,相當於委托 Complex(int r) :Complex(r, 0) { cout << Complex(int r) << endl; } Complex(Complex& com) //拷貝構造的參數必須是引用類型 { cout << Complex(Complex& com) << endl; real = com.real; imag = com.imag; } Complex& operator=(Complex& com) //這裡的參數可以是非引用的 { cout << Complex& operator=(Complex& com) << endl; real = com.real; imag = com.imag; return *this; } }; int main() { Complex com1; //默認初始化,調用Complex()默認構造 cout << --- << endl; Complex com2(com1); //直接初始化,調用Complex(Complex& com) cout << --- << endl; Complex com3 = com1; //賦值初始化,調用Complex(Complex& com) cout << --- << endl; Complex com4; //默認初始化,調用Complex()默認構造 cout << --- << endl; com4 = com1; //賦值,調用operator=(Complex& com) cout << --- << endl; Complex com5(1, 1); //調用指定的構造函數Complex(int r, int i) cout << --- << endl; Complex com6(1); cin.get(); return 0; }
類似於Complex(Complex& com);其中的參數必須是引用類型,這就是拷貝構造函數。
所謂的淺拷貝和深拷貝,針對的是指針成員,對於普通成員,則無區別。對於指針成員而言,僅僅復制一份地址,則是淺拷貝,若復制的是內容,則是深拷貝。
若復制的僅僅是一份地址,則多個對象會共用同一份資源,當其中一個對象被銷毀,資源隨之銷毀。其它對象則受影響。這就是所謂的淺拷貝和深拷貝的問題。
在新標准中把類似於 Complex(int r):Complex(r, 0){}的構造稱為委托構造。
類比於設計模式:委托,可以很好理解。Complex(int r)把實際工作交給了Complex(r, 0)。