繁体   English   中英

C++ 对象创建和构造函数

[英]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引用获取参数(这是它应该做的)。

关于第一个,你是对的。

  1. 是的, Foo obj(args)创建一个 Foo 对象并调用一次ctor。

  2. obj2不被视为临时对象。 但是就像 1 Foo obj2创建一个对象并调用Foo ctor。 假设你的意思是下一行obj2 = Foo(args) ,这一行会创建一个临时 Foo 对象,然后调用obj2.operator=() 因此,对于第二个示例,只有一个临时对象,一个非临时对象,Foo ctors 被调用两次(一次用于非临时,一次用于临时)并且 operator=() 被调用一次。

  3. 不,这一行不调用operator=() 当您使用=语法初始化obj3 ,它几乎就像您使用括号一样: Foo obj3(Foo(args)); 所以这一行创建了一个临时对象,然后调用 Foo 复制构造函数来使用该临时对象初始化 obj3。

你的术语有点混乱。

对象objobj2 obj3不被称为“临时对象”。 只有在分配给 obj 之前在第 3 行中创建的实例才是临时对象。

此外,您不会创建“Foo 的副本”,而是创建“Foo 的实例”或“Foo 类型的对象”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM