4

和有什么区别

MyClass mc = MyClass();

MyClass mc;

在 C++ 中?

4

5 回答 5

8

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

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

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


正如Negal提到的,这种情况与 POD 类型有点不同。当“MyClass”是 POD 时,第二个片段不会 value-initialize mc,而第一个片段会。

于 2012-08-14T11:36:55.757 回答
2

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

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

class MyC
{
public:
MyC(){}
private:
MyC(const MyC&) {}
};

int main()
{
  MyC myc = MyC();
  return 0;
}
于 2012-08-14T11:37:18.347 回答
1

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

于 2012-08-14T11:34:06.307 回答
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();
于 2012-08-14T11:36:43.980 回答
-3

没有不同。默认 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。

于 2012-08-14T11:39:38.120 回答