和有什么区别
MyClass mc = MyClass();
和
MyClass mc;
在 C++ 中?
第一个调用复制构造函数,以临时对象作为参数 -MyClass()
创建临时对象。
第二个调用默认构造函数。
实际上,在大多数情况下,它们都针对相同的代码进行了优化,但这就是语义上的差异。
正如Negal提到的,这种情况与 POD 类型有点不同。当“MyClass”是 POD 时,第二个片段不会 value-initialize mc
,而第一个片段会。
第一个是复制初始化,第二个是默认初始化。
例如,以下代码将无法编译:
class MyC
{
public:
MyC(){}
private:
MyC(const MyC&) {}
};
int main()
{
MyC myc = MyC();
return 0;
}
自定义复制构造函数和默认构造函数。
首先创建temp-object
通过c-tor without arguments
,然后调用copy-ctor
对象(不考虑任何优化)。第二次调用c-tor without arguments
,没有副本。通过编译器优化,两种情况都是平等的。
差异在于基本类型,所以
// initialized to something
int c;
// initialized to int() that is 0 by standard.
int c = int();
没有不同。默认 ctor 调用。语法糖)没有复制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。