複制構造函數
基本概念
複制構造參數隻有一個參數,即對同類對象的引用,形如: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;
}