2012-08-14 55 views

回答

8

的首先调用复制构造,与临时对象作为参数 - MyClass()创建临时。

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

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


作为Negal提到的,情况是POD类型有些不同;当“MyClass”是POD时,第二个片段不会初始化mc,而第一个将会。

+0

+ 1说临时事情。 – 2012-08-14 11:38:46

+4

尽管两种情况都被优化为相同的东西,但结果不同时至少有一种情况。如果'MyClass'是一个POD(普通旧数据)类型,'mC'是局部变量时'MyClass mc'不会导致'mc'被值初始化。第二种方法将创建一个初始化临时值并用它初始化'mc'。 – 2012-08-14 11:46:37

+0

好点,而且它们是否被优化为相同的事情取决于默认构造函数和复制构造函数中的内容。 – 2012-08-14 11:49:03

1

自定义拷贝构造函数和默认构造函数。

+1

'operator ='不在这里调用。 – 2012-08-14 11:38:38

+0

好的。谢谢 。对不起, – 2012-08-14 11:39:22

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(); 
2

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

例如,下面的代码不会编译:

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

int main() 
{ 
    MyC myc = MyC(); 
    return 0; 
} 
+0

这确实显示了区别。如果拷贝构造函数是私有的,那么一个是合法的,另一个不是。 – 2012-08-14 11:40:09

-3

没有差别。默认ctor呼叫。语法糖) no copy 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。

+0

打印相同,你如何理解哪个构造函数被调用?此外,这可能会被编译器优化,关闭任何优化选项(-O0),然后再次尝试:) – 2012-08-14 11:44:51

+0

仅打印PPP一次))不在def和copy ctors中)。没有优化)/ od – kain64b 2012-08-14 11:46:42

+0

和你可以测试的源代码:PPP ppp = PPP(); PPP ppp1 = ppp;只在2级的时候复制) – kain64b 2012-08-14 11:53:07

相关问题