C ++中构造函数初始化的区别是什么?

时间:2014-10-04 22:31:52

标签: c++

假设我有一个名为Person的类,构造函数是

Person(int age)
{
    m_age = age;
}

在声明Person并初始化它时,是否存在以下区别:

Person john(36);

Person john = Person(36);

2 个答案:

答案 0 :(得分:4)

第一个是direct initialization而后者是copy initialization。它们是两种不同的语义,但总的来说:

  • 直接初始化通过构造函数的重载解析工作:它将找到最佳匹配构造函数并执行所需的每个隐式转换序列

  • 复制初始化使用临时对象的复制/移动语义。如果对象不相同,则将设置隐式转换序列(在这方面,它不如直接初始化灵活)

请注意,标准允许编译器(cfr。copy elision / RVO)完全忽略临时创建。


还相关:Is there a difference in C++ between copy initialization and direct initialization?

答案 1 :(得分:1)

区别在于代码: -

Person john(36);

首先创建一个对象john调用参数化构造函数并将值36赋给变量m_age。

代码: -

Person john = Person(36);

首先创建一个临时对象,为其赋值36,然后创建对象john,并进一步调用复制构造函数来复制变量m_age的值。

第一种方法更有时间效率,但第二种方法提供了灵活的使用方法,因为我们可以定义自己的复制构造函数并改变复制值的方式。

相关问题