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

What's the difference between constructor initialization in C++?

本文关键字:什么 区别 初始化 构造函数 C++      更新时间:2023-10-16

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

Person(int age)
{
    m_age = age;
}

当声明一个Person并初始化它时,之间有区别吗

Person john(36);

Person john = Person(36);

第一种是直接初始化,而后者是复制初始化。它们是两种不同的语义,但总的来说:

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

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

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

<小时>

还相关:在C++中,复制初始化和直接初始化之间有区别吗?

区别在于代码:-

Person john(36);

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

而代码:-

Person john = Person(36);

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

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