"MyClass mc = MyClass()"还是"MyClass mc"?

"MyClass mc = MyClass()" or "MyClass mc"?

本文关键字:MyClass mc 还是      更新时间:2023-10-16

两者有什么区别

MyClass mc = MyClass();

MyClass mc;

在C++?

第一个调用复制构造函数,将临时对象作为参数 - MyClass()创建临时对象。

第二个调用默认构造函数。

实际上,在大多数情况下,它们针对相同的代码进行了优化,但这是语义上的区别。


正如 Negal 所提到的,POD 类型的情况略有不同;当 "MyClass" 是 POD 时,第二个代码片段不会对mc进行值初始化,而第一个代码片段会。

第一个是复制初始化,第二个是默认初始化。

例如,以下代码将无法编译:

class MyC
{
public:
MyC(){}
private:
MyC(const MyC&) {}
};
int main()
{
  MyC myc = MyC();
  return 0;
}

自定义复制构造函数和默认构造函数。

首先通过c-tor without arguments创建temp-object,然后为对象调用copy-ctor(不考虑任何优化)。第二次调用c-tor without arguments,没有副本。通过编译器优化,这两种情况是相等的。

区别在于基本类型,因此

// initialized to something
int c;
// initialized to int() that is 0 by standard.
int c = int();

没有区别。 默认 ctor 调用。 语法糖 )没有复制控制!!!

class PPP{
public:
    PPP(PPP&){
        std::cout<<"PPP1"<<std::endl;
    }
    PPP(const PPP&){
        std::cout<<"PPP2"<<std::endl;
    }
    PPP(){
        std::cout<<"PPP3"<<std::endl;
    }
};
PPP ppp = PPP();

而且您在控制台中只能找到 PPP。