C++拷貝構造函數

拷貝構造函數

一、作用

在建立一個新的對象時,用一個已經存在的對象去初始化這個新建立的對象。

二、定義

類名 (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. 函數名和類名相同
  2. 無返回值
  3. 函數只有一個形參且是該類對象的引用

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

(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)拷貝構造函數的參數只有一個,並且必須要使用引用類型,因爲值傳遞會導致無窮遞歸調用。

發佈了39 篇原創文章 · 獲贊 7 · 訪問量 2651
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章