2014-12-23 2 views
0

Я недавно присоединился к проекту, и один из основных классов интерфейса в проекте имеет инициализацию ниже.Инициализация в области конструктора, а не в списке инициализации члена

class CCom_Itf 
{ 
    CCom_Itf(IGlobalInterfaceTable *git_ptr): m_git_ptr(NULL), m_ComInitialized(false) 
    { 
     m_git_ptr = git_ptr; 
    } 
... 

Есть ли какие-либо преимущества/недостаток инициализации m_git_ptr, как описано выше, или я что-то пропустил ?. Благодарю.

+2

Advantage: none, если нет какой-либо скрытой зависимости, которая требует этой странной инициализации. Недостатки: вы тратите время на размышления о чем-то, в то время как вы можете делать что-то еще (если нет какой-то скрытой зависимости и т. Д.) – juanchopanza

ответ

1

Недостатком является то, что он инициализируется дважды, двумя разными способами. Это не проблема производительности, так как оптимизирующий компилятор устранит первое назначение, но это проблема для чтения кода. Выберите один стиль и придерживайтесь его.

Обратите внимание, что в C++ 11 такого рода «двойной инициализации» возвращается в моду, с в классе инициализации членов:

class CCom_Itf 
{ 
    m_git_ptr = nullptr; // in-class init 
... 

В таком случае инициализатор в классе будут игнорироваться если конструктор имеет список инициализации с тем же членом. Однако такая двойная инициализация кажется менее оправданной.

0

Нет никакого преимущества для этого странного танца назначения инициализации, если только вы не платите за символ исходного кода.

Для простого, непостоянного члена недостатки тривиальны: вы пишете больше кода, чем вам нужно, и полагаетесь на компилятор, чтобы заметить, что танец может быть заменен одной инициализацией (с , возможно, крошечное, влияние на производительность, если оно не будет).

Для более сложных типов может потребоваться стоимость исполнения, поскольку инициализация по умолчанию, за которой следует назначение, может быть более эффективной, чем прямая инициализация. Если тип не назначается, или член объявлен const, тогда танец не будет работать вообще.

+0

«платит за символ исходного кода», это приятная функция! –

Смежные вопросы