C++ 拷貝建構函式的四種呼叫時機
阿新 • • 發佈:2019-02-10
拷貝建構函式的呼叫有四種場景
假設定義了一個類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)
}