這樣一段代碼,輸出結果是 A B ~B ~A ~A
分析如下:
1.A a;構造一個對象a,調用A類的無參構造函數,輸出A
2.B b(a); 執行到構造函數初始化列表 B(A &a):_a(a),相當於直接調用拷貝構造函數來初始化(ps: 當一個對象需要通過另外一個對象進行初始化時,會調用拷貝構造,但是由於類A沒有顯式聲明拷貝構造函數,系統會生成默認拷貝構造函數,只進行位拷貝)
所以不會調用A()構造函數,此時無輸出。繼續構造則輸出 B
析構順序與構造順序完全逆序,爲~B ~A ~A
若改爲這樣
這裏B的構造函數被改爲
B(A &a)
{
printf(" B ");
_a=a;
}
結果爲 A A B ~B ~A ~A
分析_a=a;這一步,此時是先構造一個A _a對象(會輸出 A),然後再執行_a=a(由於沒有重載A類的=運算符,直接進行位拷貝)
爲何這個=號不會調用拷貝構造呢,因爲此時不是對_a進行初始化,而是普通的賦值操作。
那麼什麼是初始化,什麼又是賦值呢?
可以閱讀下此博客: