拷貝構造函數與類同名,沒有返回值,只有一個參數,參數爲該類對象的引用。拷貝構造函數的定義格式:
類名::拷貝構造函數名(類名 &引用名)
例如:
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;
}