複製構造函數
基本概念
複製構造參數只有一個參數,即對同類對象的引用,形如:X::X(X&) 或 X::X(const X&),常用後者。
若用戶未定義,則編輯器會生成默認的複製構造函數,完成複製的功能。
class Complex {
private:
double real,imag;
};
Complex c1; //調用缺省無參構造函數
Complex c2(c1);//調用缺省的複製構造函數,將 c2 初始化成和c1一樣
注:不允許有形如X::X(X)的構造函數。
調用的三種時機
- 當用一個對象去初始化同類的另一個對象時。
Complex c2(c1);
Complex c2 = c1; //初始化語句,非賦值語句
- 如果某函數有一個參數是類 A 的對象, 那麼該函數被調用時,類A的複製構造函數將被調用。
class A
{
public:
A() { };
A(A & a) {//重寫複製構造函數
cout << "Copy constructor called" <<endl;
}
};
void Func(A a1){ }
int main(){
A a2;
Func(a2);//程序輸出:Copy constructor called
return 0;
}
- 如果函數的返回值是類A的對象時,則函數返回時, A的複製構造函數被調用。
class A
{
public:
int v;
A(int n) { v = n; };
A(const A & a) {//重寫複製構造函數
v = a.v;
cout << "Copy constructor called" <<endl;
}
};
A Func() {
A b(4);
return b;
}
int main() {
cout << Func().v << endl;
return 0;
}
類型轉換構造函數
基本概念
只有一個參數,而且不是複製構造函數的構造函數,一般就可以看作是類型轉換構造函數。
當需要的時候,編譯系統會自動調用轉換構造函數,建立一個無名的臨時對象(或臨時變量)。
目的
實現類型的自動轉換。
class Complex {
public:
double real, imag;
Complex(int i) {//類型轉換構造函數
cout << "IntConstructor called" << endl;
real = i; imag = 0;
}
Complex(double r,double i) {//構造函數
real = r;
imag = i;
}
};
int main ()
{
Complex c1(7,8);
Complex c2 = 12;
c1 = 9; // 9被自動轉換成一個臨時Complex對象
cout << c1.real << "," << c1.imag << endl;
return 0;
}