显式和非显式构造函数

Explicit and non-explicit constructors

本文关键字:构造函数      更新时间:2023-10-16
class Test
    {
    public:
        Test(int i) { cout<<"constructor calledn";}
        Test(const Test& t) { cout<<" copy constructor calledn";}
    };
 class Test1
        {
        public:
            Test1(int i) { cout<<"constructor calledn";}
            explicit Test1(const Test1& t) { cout<<" copy constructor calledn";}
        };
    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=实际上最终调用复制构造函数。

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

根据这个,表达式:

Type variableName = value;

是否总是执行copy初始化这样的对象,这意味着:

Test1 u1 = 0;

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

而且,最重要的是,因为你将复制构造函数声明为显式,复制样式的初始化将失败,但是:
Test1 t1(0);

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

Test u = 0是转换构造函数的情况。请参阅什么是c++中的转换构造函数?这是干什么用的?查看详情。
我试着在删除评论后编译注释行,它为我编译。我使用的是gcc 4.3.4版本。你用的是哪个版本的编译器