【C++】複製構造函數與類型轉換構造函數

複製構造函數

基本概念

複製構造參數只有一個參數,即對同類對象的引用,形如: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;
}

 

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