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

Max*_*rai 8 c++ constructor object

我现在正在学习ctors并有一些问题.在这些方面:

Foo obj(args);

Foo obj2;
obj2 = Foo(args);

Foo obj3 = Foo(args);
Run Code Online (Sandbox Code Playgroud)

第一部分:只有1个构造函数被调用(Foo)并被obj初始化.所以,1个对象创建.

第二部分:创建临时对象obj2,为其调用默认ctor.下一行我们创建另一个副本Foo并将其复制到operator=().是对的吗?所以,3个本地临时对象,2个构造函数调用.

第三部分:创建1个对象Foo并将其复制到operator=().所以,2个临时对象和1个ctor调用.

我理解这个吗?如果这是真的,编译器(例如最后一个gcc)会在常见情况下优化这些吗?

Naw*_*waz 10

我将先评论第三个:

Foo obj3=Foo(args);
Run Code Online (Sandbox Code Playgroud)

它不使用operator=称为复制分配.相反,它调用copy-constructor(理论上).这里没有任务.所以从理论上讲,有两个对象创建,一个是临时的,另一个是obj3.编译器可能会优化代码,完全避免创建临时对象.

现在,第二个:

Foo obj2;         //one object creation
obj = Foo(args);  //a temporary object creation on the RHS
Run Code Online (Sandbox Code Playgroud)

这里第一行创建一个对象,调用默认构造函数.然后它调用operator=传递从表达式创建的临时对象Foo(args).所以有两个对象只operator=通过const引用获取参数(这是应该做的).

关于第一个,你是对的.

  • @MrLister:不."1"和"3"之间有一个细微的区别.只需编写测试代码,并使copy-constructor为"private".第一个将编译,第三个将不会! (3认同)