一道關於c 拷貝構造與 運算子的題目

2021-08-25 21:46:30 字數 649 閱讀 2857

class a ~a() }; class b ~b() private: a _a; }; int main()

這樣一段**,輸出結果是 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

若改為這樣

class a ~a() }; class b ~b() private: a _a; }; int main()

這裡b的建構函式被改為

b(a &a)

結果為 a a b ~b ~a ~a

分析_a=a;這一步,此時是先構造乙個a _a物件(會輸出 a),然後再執行_a=a(由於沒有過載a類的=運算子,直接進行位拷貝)

為何這個=號不會呼叫拷貝構造呢,因為此時不是對_a進行初始化,而是普通的賦值操作。

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

一道關於c 拷貝構造與 運算子的題目

這樣一段 輸出結果是 a b b a a 分析如下 1.a a 構造乙個物件a,呼叫a類的無參建構函式,輸出a 2.b b a 執行到建構函式初始化列表 b a a a a 相當於直接呼叫拷貝建構函式來初始化 ps 當乙個物件需要通過另外乙個物件進行初始化時,會呼叫拷貝構造,但是由於類a沒有顯式宣告...

關於C 的一道題

閱讀下面程式,然後請寫出輸出結果 cpp view plaincopy include using namespace std int main void 輸出結果如下圖 分析 為什麼會這樣的結果呢?首先我們先分析一下程式,首先我們先看看第一組a和b,那麼a和b是什麼呢?根據我們所學,我們知道a和b...

拷貝建構函式與賦值運算子

物件的 生命週期 管理意味著完全地控制物件的誕生 繁殖和消亡的過程。使用拷貝建構函式和賦值運算子,可以更快的進行物件的繁殖操作。拷貝建構函式是一種建構函式,其原型類似於 classname const classname x 賦值建構函式的作用就是建立乙個物件,該物件是同乙個類中已有物件的精確副本。...