当前位置:  开发笔记 > 编程语言 > 正文

C++构造函数语法

如何解决《C++构造函数语法》经验,为你挑选了3个好方法。

简单问题:以下陈述是否相同?或者是第二个在幕后做更隐含的事情(如果是这样的话,是什么?)

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

谢谢!



1> Johannes Sch..:

它们并不完全相同.第一种称为"直接初始化",而第二种称为"复制初始化".

现在,标准制定了两条规则.第一种是直接初始化和复制初始化,其中初始化器是初始化对象的类型.第二个规则是在其他情况下进行复制初始化.

所以,从这个角度来看,两者都被称为一个 - 第一个 - 规则.如果您具有相同类型的复制初始化,则允许编译器删除副本,因此它可以构造您直接在初始化对象中创建的临时对象.因此,您可以使用生成的相同代码完成最终结果.但是复制构造函数,即使复制被省略(优化出来),仍然必须可用.即如果你有一个私有拷贝构造函数,如果它出现的代码无法访问它,那么该代码是无效的.

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

myclass c = 3;

当有一个带有int的构造函数时,编译器会创建一个myclass类型的临时对象.然后用它临时初始化对象.同样在这种情况下,可以直接在初始化对象中创建临时创建.您可以通过在类的构造函数/析构函数中打印消息并使用-fno-elide-constructorsGCC 选项来执行这些步骤.它不会试图删除副本.

另外,上面的代码与赋值运算符无关.在这两种情况下,会发生什么是初始化.



2> dirkgently..:

myclass如果编译器未实现复制省略,则第二个可能会或可能不会要求额外的对象构造.但是,大多数构造函数都默认启用了复制省略,即使没有任何优化开关.

注意初始化,而构造永远不会调用赋值运算符.

始终,请记住:

赋值: 已存在的对象获取新值

初始化: 新对象在其诞生时获取值.



3> Naveen..:

在第二个中,首先创建一个临时对象,然后使用myClass的复制构造函数将其复制到对象x中.因此两者都不一样.

推荐阅读
wangtao
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有