2
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= 是否实际上最终调用了复制构造函数。

4

2 回答 2

4

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

据此表达式:

Type variableName = value;

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

Test1 u1 = 0;

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

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

Test1 t1(0);

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

于 2015-08-21T04:42:52.237 回答
0

测试 u = 0 是转换构造函数的情况。请参阅什么是 C++ 中的转换构造函数?它是干什么用的?详情。
我在删除注释后尝试编译注释行,它为我编译。我正在使用 gcc 版本 4.3.4。您使用的是哪个版本的编译器?

于 2015-08-21T04:31:47.857 回答