gpt4 book ai didi

C++ 构造函数语法

转载 作者:IT老高 更新时间:2023-10-28 23:03:41 26 4
gpt4 key购买 nike

简单的问题:以下陈述是否等效?还是第二个在幕后做了更隐含的事情(如果是,是什么?)

myClass x(3);
myClass x = myClass(3);

谢谢!

最佳答案

它们并不完全相同。第一个称为“直接初始化”,而第二个称为“复制初始化”。

现在,标准由两条规则组成。第一个用于直接初始化和复制初始化,其中初始化程序是已初始化对象的类型。第二条规则适用于其他情况下的复制初始化。

因此,从这个角度来看,两者都被称为第一条规则。在您使用相同类型进行拷贝初始化的情况下,编译器可以省略拷贝,因此它可以将您创建的临时对象直接构造到初始化对象中。所以你可以很好地生成相同的代码。但是,即使拷贝被省略(优化),复制构造函数也必须仍然可用。即,如果您有一个私有(private)复制构造函数,则如果它出现的代码无法访问该代码,则该代码无效。

第二种称为复制初始化,因为如果初始化器的类型是不同的类型,则会创建一个临时对象以尝试将右侧隐式转换为左侧:

myclass c = 3;

编译器创建一个 myclass 类型的临时对象,然后当有一个采用 int 的构造函数时。然后它用该临时对象初始化对象。同样在这种情况下,可以直接在初始化对象中创建临时创建的。您可以通过在类的构造函数/析构函数中打印消息并使用 GCC 的选项 -fno-elide-constructors 来遵循这些步骤。它不会尝试删除拷贝。

顺便说一句,上面的代码与赋值运算符无关。在这两种情况下,都会发生初始化。

关于C++ 构造函数语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/587070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com