1. 程式人生 > >C++建構函式小結

C++建構函式小結

1.預設構造

class A
{
public:
    A() {};                     //default建構函式
};

class B
{
public:
    B(int _x = 0) : x(_x) {}    //default建構函式
private:
    int x;
};

class C
{
public:
    C(int _x) : x(_x) {}        //不是default建構函式
private:
    int x;
};

int main()
{
    A a;
    B b;
    C c;//error:no matching function for call to 'C::C()'
    return 0;
}

2.explicit

將建構函式宣告為explicit,可以阻止他們被用來執行隱式型別轉換(implicit type conversions),但他們仍可被用來執行顯示型別轉換(explicit type conversions)。explicit型別的建構函式能禁止編譯器執行非預期的型別轉換,應儘量使用explicit代替non-explicit。
class D
{
public:
    explicit D(int _x = 0) : x(_x) {}    //default建構函式
private:
    int x;
};

void func(D obj)
{
    //do something...
}

int main()
{
    D d;
    func(d);
    func(123);//error: could not convert '123' from 'int' to 'D'
    func(D(123));//ok

    return 0;
}

3.copy建構函式

class E
{
public:
    E(int _x = 0) : x(_x) {}    //default建構函式
    E(const E& rhs)             //copy建構函式
    { x = rhs.x; }
    E& operator=(const E& rhs)  //copy assignment操作符
    {
        x = rhs.x;
        return *this;
    }
private:
    int x;
};

int main()
{
    E e1;       //呼叫default建構函式
    E e2(e1);   //呼叫copy建構函式
    e1 = e2;    //呼叫copy assignment操作符
    E e3 = e2;  //呼叫copy建構函式
    return 0;
}

copy構造和copy賦值區分:如果有一個新物件被定義(如上文e3),一定會有一個建構函式被呼叫,不可能呼叫賦值操作。若沒有新物件被定義(如上文e1 = e2句),就不會呼叫建構函式,而是賦值操作符“=”被呼叫了。 , copy建構函式定義了一個物件如何passed-by-value(傳值)。passed-by-value以為只調用了copy建構函式,代價較大,以pass-by-reference-to-const代替往往是比較好的選擇。