gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:21:04 26 4
gpt4 key购买 nike

我现在正在学习 ctors,有几个问题。在这些行:

Foo obj(args);

Foo obj2;
obj2 = Foo(args);

Foo obj3 = Foo(args);

第一部分:只初始化了一个名为 (Foo) 和 obj 的构造函数。因此,1 个对象创建。

第二部分:创建临时对象obj2,为它调用默认的ctor。下一行我们创建了 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 引用获取参数(这是它应该做的)。

关于第一个,你是对的。

关于C++ 对象创建和构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8777240/

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