[英]C++ object creation and constructor
我现在正在学习 ctors 并且有一些问题。 在这些行:
Foo obj(args);
Foo obj2;
obj2 = Foo(args);
Foo obj3 = Foo(args);
第一部分:只有 1 个称为 (Foo) 和obj
构造函数被初始化。 因此,创建 1 个对象。
第二部分:创建临时对象obj2
,为其调用默认构造函数。 接下来的几行我们创建Foo
另一个副本并将其副本传递给operator=()
。 是对的吗? 因此,3 个本地临时对象,2 个构造函数调用。
第三部分:创建 1 个对象Foo
并将其副本传递给operator=()
。 因此,2 个临时对象和 1 个 ctor 调用。
我理解正确吗? 如果这是真的,编译器(例如最后一个 gcc)会在常见情况下优化这些吗?
我先评论第三个:
Foo obj3=Foo(args);
它不使用被称为复制赋值的operator=
。 相反,它调用复制构造函数(理论上)。 这里没有任务。 所以理论上,有两个对象创建,一个是临时的,另一个是obj3
。 编译器可能会优化代码,完全消除临时对象的创建。
现在,第二个:
Foo obj2; //one object creation
obj = Foo(args); //a temporary object creation on the RHS
这里第一行创建一个对象,调用默认构造函数。 然后它调用operator=
传递从表达式Foo(args)
创建的临时对象。 所以有两个对象,只有operator=
通过const
引用获取参数(这是它应该做的)。
关于第一个,你是对的。
是的, Foo obj(args)
创建一个 Foo 对象并调用一次ctor。
obj2
不被视为临时对象。 但是就像 1 Foo obj2
创建一个对象并调用Foo
ctor。 假设你的意思是下一行obj2 = Foo(args)
,这一行会创建一个临时 Foo 对象,然后调用obj2.operator=()
。 因此,对于第二个示例,只有一个临时对象,一个非临时对象,Foo ctors 被调用两次(一次用于非临时,一次用于临时)并且 operator=() 被调用一次。
不,这一行不调用operator=()
。 当您使用=
语法初始化obj3
,它几乎就像您使用括号一样: Foo obj3(Foo(args));
所以这一行创建了一个临时对象,然后调用 Foo 复制构造函数来使用该临时对象初始化 obj3。
你的术语有点混乱。
对象obj
、 obj2
obj3
不被称为“临时对象”。 只有在分配给 obj 之前在第 3 行中创建的实例才是临时对象。
此外,您不会创建“Foo 的副本”,而是创建“Foo 的实例”或“Foo 类型的对象”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.