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代替往往是比较好的选择。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值