实例化对象C ++

时间:2018-03-06 16:03:47

标签: c++ class

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

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

    ~Entity();

private:
    std::string mName;
};

int main()
{
    Entity ent("myname");
    Entity ent1 = Entity("yourname");
}   

3 个答案:

答案 0 :(得分:4)

Entity ent("myname");

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

Entity ent1 = Entity("yourname");

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

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

答案 1 :(得分:0)

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

Entity ent1 = Entity("yourname");

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

答案 2 :(得分:0)

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

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

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

auto ent1 = Entity("yourname");

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