显式和非显式构造函数

时间:2015-08-21 04:15:35

标签: c++ constructor copy-constructor explicit copy-initialization

class Test
    {
    public:
        Test(int i) { cout<<"constructor called\n";}
        Test(const Test& t) { cout<<" copy constructor called\n";}
    };
 class Test1
        {
        public:
            Test1(int i) { cout<<"constructor called\n";}
            explicit Test1(const Test1& t) { cout<<" copy constructor called\n";}
        };

    int main()
    {
        Test t(0);  
        Test u = 0;
        //Test1 t1(0);   Line 1
        //Test1 u1 = 0;  Line 2

    }

我观察到不同的输出。 案例1:当注释第1行和第2行时,o / p为:    构造函数调用    构造函数叫

案例2:取消注释第1行和第2行时:编译错误

有人可以解释输出及其原因。也有人可以判断operator =实际上是否最终调用了复制构造函数。

2 个答案:

答案 0 :(得分:3)

你的问题在于那里的显式构造函数,加上对对象初始化的轻微误解。

根据this,表达式:

Type variableName = value;

始终执行此类对象的复制初始化,这意味着:

Test1 u1 = 0;

将使用参数Test1::Test1(const Test1&)有效地调用重载的构造函数Test1(int),从而生成u1::Test1(Test1(0))

而且,由于您将复制构造函数声明为 explicit ,因此复制样式初始化将失败,但是:

Test1 t1(0);

将编译,因为此表达式调用方向初始化,即使 Test1(int)将标记为显式,直接初始化也是显式的,因此每个部分都匹配。

答案 1 :(得分:0)

测试u = 0是转换构造函数的情况。有关详细信息,请参阅What is a converting constructor in C++ ? What is it for? 我在删除评论后尝试编译注释行,并为我编译。我正在使用gcc版本4.3.4。您使用的是哪个版本的编译器?