拷貝構造函數中的形參引用,初始化與賦值的區別

#include<iostream>
using namespace std;

class Test
{
public:
    Test(int d = 0);data(d)
    {
        cout <<"Create Test Object"<< endl;
    }
    Test (const Test &copy_t) 拷貝構造函數
    {
        data = copy_t.data;
    }
private:
    int data;
};

void main()
{
    Test t(10);
    Test t1(t);  對象初始化對象,調用拷貝構造函數

    Test t2 = t1;  t2不存在,在創建的過程藉助t1,叫作t1初始化t2,調用拷貝構造函數

    Test t3;  t3已經存在,叫作t1給t3賦值
    t3 = t1;  對象給對象賦值,調用賦值語句
}

1、形參中的引用

如上代碼,拷貝構造函數中採用引用方式,將實例化的t對象傳入後,copy_t對t進行引用,此時不會開闢新的臨時空間,如果拷貝構造函數中的形參爲const Test  copy_t,運行t1(t)時,進入拷貝函數,此時需要給copy_t開闢臨時空間,使用對象t給copy_t進行初始化,此時初始化過程會第二次調用拷貝構造函數,第二次調用中的形參再一次需要初始化,無限循環,導致內存溢出。

2、初始化與賦值

區別在於需要被賦值或者初始化的對象是否存在,如果已經存在,被稱爲賦值,調用相應的賦值語句,不存在稱爲初始化,測調用相應的拷貝構造函數

3、拷貝構造函數被調用的三種情況

(1)對象初始化對象

(2)當函數的形參時累的對象,調用函數時,形參與實參結合時使用,這時要在內存新建立一個局部對象,並把實參拷貝到新的對象中

(3)當函數的返回值是累的對象,函數執行完成返回調用者時使用,理由也是要建立一個臨時對象中,再返回調用者

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章