实例化对象C ++

问题描述 投票:0回答:3

我看到人们以两种不同的方式实例化对象,哪种方式最好,为什么?或者甚至有差异?

class Entity
{
public:
    Entity(const std::string& name) : mName(name);

    ~Entity();

private:
    std::string mName;
};

int main()
{
    Entity ent("myname");
    Entity ent1 = Entity("yourname");
}   
c++ class
3个回答
4
投票
Entity ent("myname");

这为实体分配堆栈空间,然后调用构造函数使用myname初始化类。

Entity ent1 = Entity("yourname");

这(未经优化)创建了两个实体。第二个调用构造函数使用“yourname”初始化类,然后使用复制构造函数初始化ent1。然后破坏匿名实体。关于如何或何时可以消除额外的副本但是保持它们都是直的,有一些复杂的规则让我头晕目眩。

所以第一种形式更可取,因为它不需要考虑编译器将优化的内容。


0
投票

Entity ent("myname");称为直接初始化Entity ent1 = Entity("yourname");称为复制初始化

由于复制初始化中的初始值设定项(Entity("yourname"))是explicit type conversion,因此表达式是一个pr值,其结果对象是声明的对象。

所以这两种形式是等价的。你可以选择其中任何一个,这是一个品味问题。有些编码员更喜欢以下形式,这也是等同的:

auto ent1 = Entity("yourname");

请注意,这不是优化问题,这两种形式相同的事实是强制性的。


0
投票

现代编译器没有区别,因为它们会进行优化

Entity ent1 = Entity("yourname");

无论如何。但旧的创建一个临时对象,然后使用复制构造函数分配给ent1。

© www.soinside.com 2019 - 2024. All rights reserved.