Инициализация по умолчанию с конструктором по умолчанию для примитивных типов данных - PullRequest
1 голос
/ 10 февраля 2012

Существуют ли какие-либо недостатки / недостатки при использовании конструктора по умолчанию для инициализации по умолчанию для примитивных типов данных?

Например

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 ]

4 голосов
/ 10 февраля 2012

Существует более согласованный синтаксис для создания объектов по умолчанию:

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

То есть ничего не передавать.Просто напишите T() и объект будет создан со значением по умолчанию.Это также согласуется с типами классов (подумайте о типах POD)!

4 голосов
/ 10 февраля 2012

Нет, и компилятор, скорее всего, сгенерирует один и тот же код для обоих.

При выключенной оптимизации генерируется следующий код:

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     

Как видите, оно идентично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...