#include<iostream>
using namespace std;
class Test
{
public:
Test(int d = 0);data(d)
{
cout <<"Create Test Object"<< endl;
}
Test (const Test ©_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)當函數的返回值是累的對象,函數執行完成返回調用者時使用,理由也是要建立一個臨時對象中,再返回調用者