拷貝構造函數

拷貝構造函數是重載構造函數的一種重要形式,它的功能是使用一種已經存在的對象去初始一個新創建的同類對象,
、它可以將一個已有對象的數據成員的值拷貝給正在創建的另一個同類的對象。
 拷貝構造函數與類同名,沒有返回值,只有一個參數,參數爲該類對象的引用。拷貝構造函數的定義格式:
 類名::拷貝構造函數名(類名 &引用名)
 例如:
 Tdate::Tdate(Tdate &d);//形參是一個對象的引用
 
 三種需要用拷貝初始化構造函數的情況:
 (1)明確表示由一個對象初始化另一個對象的時候,如Cdate day3(d1);
 (2)當對象作爲函數的返回值,創建一個臨時對象時。
 (3)當對象作爲函數實參傳遞給函數形參時,如fun(Cdate day);
 
 使用拷貝構造函數的時候注意:
 默認執行的拷貝構造函數只進行對象數據成員簡單賦值。因此當類成員中包括動態分配的資源時,如果只做數據成員之間的簡單賦值(淺拷貝),
就會出現問題,用戶必須自己定義拷貝構造函數。讓他們各自擁有屬於自己的資源,不至於因爲指向同一塊內存空間而出現資源歸屬權不清楚的情況。

#include <iostream>
using namespace std;
class CComplex{
public:
	CComplex(double,double);
	CComplex(CComplex &c);//複數類的拷貝構造函數聲明
	CComplex add(CComplex &x);//複數相加,函數返回值爲兩個複數的和
	void Print();
private:
	double real;
	double imag;
};
CComplex::CComplex(double r=0.0, double i=0.0){
	real = r;
	imag = i;
	cout<< "調用兩個參數的構造函數" <<endl;
}
CComplex::CComplex(CComplex &c){//複數類的拷貝構造函數定義
	real = c.real;
	imag = c.imag;
	cout<< "調用拷貝構造函數" <<endl;
}
void CComplex::Print(){
	cout<< "(" << real << "," << imag << ")" <<endl;
}
void f(CComplex n){//對象作爲函數調用
	cout<< "n=";
	n.Print();
}
CComplex CComplex::add(CComplex &x){//函數的返回值爲對象
	CComplex y(real+x.real,imag+x.imag);
	return y;//調用複數類的拷貝構造函數
}
int main(){
	CComplex a(3.0,4.0),b(5.6,7.9);
	CComplex c(a);//調用複數類的拷貝構造函數
	cout<< "a = ";
	a.Print();
	cout<< "c = ";
	c.Print();
	f(b);//對象作爲函數實參傳遞給形參,調用拷貝構造函數
	c = a.add(b);
	c.Print();
	return 0;
}

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