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 賦值建構函式的作用就是建立乙個物件,該物件是同乙個類中已有物件的精確副本。...