什麼是複製構造函數:
複製構造函數是一種特殊的構造函數,具有一般構造函數的所有特性 ,它的形參是本類的對象的引用,比如(類名 &對象名)。它的作用是使用一個已經存在的對象(由複製構造函數的參數制定),去初始化同類的一個新對象。那麼複製構造函數一般在什麼情況下被調用呢,有三種情況:
(1)當用類的一個對象去初始化該類的另一個對象的時候
eg: int main(){
Point a(1,2); // 調用類的構造函數
Point b(a); // 用對象a初始化對象b,複製構造函數被調用
Point c=a; // 用對象a初始化對象c,複製構造函數被調用
return 0;
}
(2)如果函數的形參是類的對象,調用此函數的時候,進行形參和實參相結合時,複製構造函數被調用
eg: void f(Point p){
cout<<p.getX()<<endl;
}
int main(){
Point a(1,2);
f(a); // 函數的形參爲類的對象,當調用函數時,複製構造函數被調用
return 0;
}
注意:只有把對象用值傳遞的時候,纔會調用複製構造函數,如果傳遞引用,則不會調用複製構造函數。
(3)如果構造函數的返回值是類的一個對象,函數執行完成返回調用者時,複製構造函數被調用
eg: Point g(){
Point a(1,2);
return a; // 函數的返回值是類的對象a,返回函數值時,複製構造函數被調用
}
int main(){
Point b;
b=g();
return 0;
}
注意:這種情況下,表面上函數g將a返回給了主函數,但是a是g()的局部對象,離開建立他的函數g以後a就不存在了,不可能在返回給主函數後繼續生存,所以在處理這種情況的時候編譯器系統會在主函數中創建一個無名的臨時對象,該臨時對象的生存期只在函數調用所處的表達式中,也就是表達式 b=g();中。執行語句“return 0;”時,實際上是調用複製構造將a的值複製到臨時對象中。函數g運行結束時對象a消失,但臨時對象會存在於表達式“b=g()”中。計算完這個表達式後,臨時對象的任務也就完成了,改臨時對象就會自動消失。
以上便是複製構造函數經常被調用的三種情況。下面我寫一下類Point,便於大家參考。
class Point{
public:
Point (int xx=0, int yy=0){ // 構造函數,帶有形參
x=xx; y=yy;
}
Point (Point &p); // 複製構造函數
int getX(){ return x;}
..........
private:
int x,y;
};
Point::Point(Point &p){ // 複製構造函數實現
x=p.x;
y=p.y;
}