1. 程式人生 > >C++ 拷貝建構函式的四種呼叫時機

C++ 拷貝建構函式的四種呼叫時機

拷貝建構函式的呼叫有四種場景

假設定義了一個類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)

}