一道關於c++拷貝構造與=運算符的題目

 

這樣一段代碼,輸出結果是 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進行初始化,而是普通的賦值操作。 

那麼什麼是初始化,什麼又是賦值呢?

可以閱讀下此博客:

http://blog.csdn.net/lzcx/archive/2006/03/10/620790.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章