我见过人们以两种不同的方式实例化对象,哪种方式最好,为什么?或者甚至存在差异?
class Entity
{
public:
Entity(const std::string& name) : mName(name);
~Entity();
private:
std::string mName;
};
int main()
{
Entity ent("myname");
Entity ent1 = Entity("yourname");
}
答案 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");
请注意,这不是优化问题,这两种形式相同的事实是强制性的。