使用默认构造函数对原始数据类型进行默认初始化

时间:2012-02-10 12:16:03

标签: c++ constructor default-value

使用默认构造函数对原始数据类型进行默认初始化是否有任何缺点/缺点?

例如

class MyClass
{
public:
    MyClass(); 

private:
    int     miInt;
    double  mdDouble;
    bool    mbBool;
};

使用此构造函数:

MyClass::MyClass() 
  : miInt(int())
  , mdDouble(double())
  , mbBool(bool())
{}

而不是:

MyClass::MyClass() 
  : miInt(0)
  , mdDouble(0.0)
  , mbBool(false)
{}

2 个答案:

答案 0 :(得分:4)

不,编译器很可能会为两者生成相同的代码。

关闭优化后,将生成以下代码:

MyClass::MyClass() 
  : miInt(0)
  , mdDouble(0.0)
  , mbBool(false)
{}
012313A0  push        ebp  
012313A1  mov         ebp,esp 
012313A3  sub         esp,0CCh 
012313A9  push        ebx  
012313AA  push        esi  
012313AB  push        edi  
012313AC  push        ecx  
012313AD  lea         edi,[ebp-0CCh] 
012313B3  mov         ecx,33h 
012313B8  mov         eax,0CCCCCCCCh 
012313BD  rep stos    dword ptr es:[edi] 
012313BF  pop         ecx  
012313C0  mov         dword ptr [ebp-8],ecx 
012313C3  mov         eax,dword ptr [this] 
012313C6  mov         dword ptr [eax],0 
012313CC  mov         eax,dword ptr [this] 
012313CF  fldz             
012313D1  fstp        qword ptr [eax+8] 
012313D4  mov         eax,dword ptr [this] 
012313D7  mov         byte ptr [eax+10h],0 
012313DB  mov         eax,dword ptr [this] 
012313DE  pop         edi  
012313DF  pop         esi  
012313E0  pop         ebx  
012313E1  mov         esp,ebp 
012313E3  pop         ebp  
012313E4  ret           

MyClass::MyClass() 
  : miInt(int())
  , mdDouble(double())
  , mbBool(bool())
{}
001513A0  push        ebp  
001513A1  mov         ebp,esp 
001513A3  sub         esp,0CCh 
001513A9  push        ebx  
001513AA  push        esi  
001513AB  push        edi  
001513AC  push        ecx  
001513AD  lea         edi,[ebp-0CCh] 
001513B3  mov         ecx,33h 
001513B8  mov         eax,0CCCCCCCCh 
001513BD  rep stos    dword ptr es:[edi] 
001513BF  pop         ecx  
001513C0  mov         dword ptr [ebp-8],ecx 
001513C3  mov         eax,dword ptr [this] 
001513C6  mov         dword ptr [eax],0 
001513CC  mov         eax,dword ptr [this] 
001513CF  fldz             
001513D1  fstp        qword ptr [eax+8] 
001513D4  mov         eax,dword ptr [this] 
001513D7  mov         byte ptr [eax+10h],0 
001513DB  mov         eax,dword ptr [this] 
001513DE  pop         edi  
001513DF  pop         esi  
001513E0  pop         ebx  
001513E1  mov         esp,ebp 
001513E3  pop         ebp  
001513E4  ret     

如您所见,它是完全相同的。

答案 1 :(得分:4)

创建默认对象的语法更加一致:

MyClass::MyClass() 
  : miInt()
  , mdDouble()
  , mbBool()
{
}

也就是说,不要传递任何东西。只需编写T(),就会使用默认值创建对象。它也与类类型一致(想想POD类型)!