假设我有一个名为Person的类,构造函数是
Person(int age)
{
m_age = age;
}
在声明Person并初始化它时,是否存在以下区别:
Person john(36);
和
Person john = Person(36);
答案 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的值。
第一种方法更有时间效率,但第二种方法提供了灵活的使用方法,因为我们可以定义自己的复制构造函数并改变复制值的方式。