天天看點

拷貝構造函數的調用時機拷貝構造函數的調用有四種場景

拷貝構造函數的調用有四種場景

假設定義了一個類A: class A{ public: A(const A& obj) // 拷貝構造函數 {...} ... };

第一種copy構造函數調用:

void main() { A a1; A a2 = a1;// 調用copy構造函數 a2 = a1;/ /淺copy,不會調用copy構造函數 }

第二種copy構造函數的調用:

void main() { A a1; A a2(a1);// 調用copy構造函數 }

第三種copy構造函數的調用:

void f(A p) {...}

void main() { A a; f(a);// a實參去初始化形參p,會調用copy構造函數 }

第四種copy構造函數調用場景(難點):

 // g函數傳回的是一個元素(複雜類型的),傳回的是一個新的匿名對象(是以會調用匿名對象類的copy構造函數)

// A g() { A a; return a;.// 先調用copy構造函數,用a對象建立了一個匿名對象;再執行a的析構函數(因為a為局部對象) }

void main() { A a0; a0 = g();// 匿名對象淺copy給a0,匿名對象被析構 A a1 = g();// 匿名對象直接去初始化a1,不會調用copy構造函數(此時c++編譯器直接把匿名對象轉成a1) }

繼續閱讀