显式和非显式构造函数

Explicit and non-explicit constructors

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= 是否真的最终调用了复制构造函数。

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

你的问题在于下面那个显式构造函数,加上对对象初始化的一点误解。

根据this,表达式:

Type variableName = value;

总是执行复制这样一个对象的初始化,也就是说:

Test1 u1 = 0;

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

而且,最重要的是,因为您将 复制构造函数 声明为 explicit,复制样式初始化将失败,但是:

Test1 t1(0);

会编译,因为这个表达式调用了方向初始化,即使Test1(int)会被标记为explicit,直接初始化是明确的,所以每件都匹配。