拷貝構造函數
一、作用
在建立一個新的對象時,用一個已經存在的對象去初始化這個新建立的對象。
二、定義
類名 (const 類名& 對象名)
{
函數體
}
舉例說明:
class Date
{
public:
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
//拷貝構造函數
Date(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
Date d2(d1);
return 0;
}
三、特點
- 函數名和類名相同
- 無返回值
- 函數只有一個形參且是該類對象的引用
四、調用拷貝構造函數的三種情況
(1)創建新對象時,用一個已經存在的對象去初始化這個對象。列如:
Date d1; //已經存在的一個對象
Date d2(d1); //調用拷貝構造函數用d1去初始化d2(代入法)
Date d3=d1; //調用拷貝構造函數用d1去初始化d3(賦值法)
(2)當函數的形參是類對象,調用函數進行形參與實參的結合時。列如:
fun1 (Date d)
{
d.show();
}
int main()
{
Date d1(2019,3,4);
fun1(d1); //調用函數fun1時,實參d1是類Date的對象
//將調用拷貝構造函數,初始化形參對象d
return 0;
}
(3)當函數的返回值是對象,函數執行完返回調用者時。列如:
Date fun2() //函數的返回值是對象
{
Date d(2018,2,5);
return d;
}
int main()
{
Date d1;
d1=fun2(); //函數執行完成,返回調用者時,調用拷貝構造
return 0;
}
解析:
在函數fun2()
內,執行語句return d
時,將會調用拷貝構造函數將d
的值賦值給一個無名對象,這個無名對象是編譯器臨時創建的。fun2
結束時對象d
也就一起消失,但是這個無名對象會存在於語句d1=fun2()
中,當着行語句執行完後,無名對象也就消失了。
附加小知識
(1)拷貝構造函數時構造函數的一種重載形式
(2)如果沒有顯示定義拷貝構造函數,那麼編譯器會自動生成一個默認的拷貝構造函數。
(3)拷貝構造函數的參數只有一個,並且必須要使用引用類型,因爲值傳遞會導致無窮遞歸調用。