Explicit构造函数

参考[C/C++不常见语法特性]_[强制显式调用构造函数explicit]

为什么一些书里的构造函数都要写个explicit呢?原来C++中带一个参数的构造函数,在默认情况下会在多种情况下自动调用,而explicit就是为了防止隐式使用拷贝构造函数。

#include <iostream>
using namespace std;

class A
{
    public:
    
    int x;
    
    A(int x1)
    {
        x = x1;
        cout << "A" << endl;
    }
};

class B
{
    public:
    
    int x;
    
    explicit B(int x1)
    {
        x = x1;
        cout << "B" << endl;
    }
};

void f1(A a){}
void f2(B b){}

int main()
{
    f1(10);        //输出A
    f2(B(20));     //输出B 
    //f2(20);    //编译出错,提示conversion from `int' to non-scalar type `B' requested 
}

f1(10)中,10并不是A对象呀,为什么仍然可以成功调用函数呢?

原来编译器隐式调用了构造函数,构造了一个值为10的A对象。

而f2(20)会编译失败,因为explicit关键字阻止了这种隐式调用。

 

posted @ 2014-04-06 19:27  Norcy  阅读(415)  评论(0编辑  收藏  举报