【问题标题】:Default initialization with default constructor for primitive data types使用原始数据类型的默认构造函数进行默认初始化
【发布时间】:2012-03-02 21:54:45
【问题描述】:

使用默认构造函数对原始数据类型进行默认初始化有什么缺点/缺点吗?

例如

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)
{}

【问题讨论】:

  • 不需要重复类型 - 只需写括号。

标签: c++ constructor default-value


【解决方案1】:

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

关闭优化,生成如下代码:

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     

如您所见,它是相同的。

【讨论】:

  • 好的,但是为什么我在 codeproject 这样的公共代码中看不到这个?
  • @jisaak 我想这是习惯问题。
  • 谢谢,就是这样。您是如何生成此列表的?
【解决方案2】:

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

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

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

【讨论】:

  • @LuchianGrigore:是的。您可以使用POD 类型。事实上,您必须。除了T() 语法之外,没有针对 POD 类型的语法。
猜你喜欢
  • 2011-06-17
  • 2012-09-15
  • 2011-01-25
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多