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

Я просто прочитал комментарий GMan это

class A
{
public:
   A() :
      m_ptr() // m_ptr is implicitly initialized to NULL
   { }
};

должен быть предпочтен

class A
{
public:
   A() :
      m_ptr(NULL) // m_ptr is explicitly initialized to NULL
   { }
};

Заметьте отсутствие NULL в первом примере.

Действительно ли GMan является правильным? Этот мог бы довольно субъективный, таким образом, "Вы предпочитаете пустые инициализаторы для инициализации по умолчанию?" могло бы быть более соответствующим.

Также, если Вы предпочитаете пустые инициализаторы, это относится к другим интегральным участникам?

class B
{
public:
   B() :
      m_count(),
      m_elapsed_secs()
   {}
private:
   std::size_t m_count;
   float m_elapsed_secs;  //the elapsed time since instantiation
};

Конечно, защитите свою точку наблюдения с описанием того, почему нужно быть предпочтен по другому.

5
задан Community 23 May 2017 в 12:03
поделиться

4 ответа

Я предпочитаю ясность. Как показали некоторые неправильные ответы на этот вопрос, не для всех очевидно, что, скажем, int () и int (0) эквивалентны.

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

7
ответ дан 13 December 2019 в 22:01
поделиться

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

Один пример, когда инициализация по умолчанию не подходит:

struct X {
  HANDLE some_file_handle;
  // note that INVALID_HANDLE_VALUE is not equal to 0 in Windows
  X() : some_file_handle( INVALID_HANDLE_VALUE ) {} 
};

Что касается использования NULL по сравнению с инициализацией по умолчанию, у меня есть еще один пример: в Visual Studio 2010, которая объявлена ​​как-то совместимой с C ++ 0x NULL по-прежнему определяется как 0, но в C ++ 0x вы должны использовать nullptr для инициализации указателей. А nullptr не определен в C ++ '03. Но вы, вероятно, захотите сделать свой код переносимым. В этом случае (для инициализации указателей) я предпочитаю инициализацию по умолчанию, а не инициализацию значения.

2
ответ дан 13 December 2019 в 22:01
поделиться

Во-первых, я сказал, что это возможно лучше, а не то, что это так. :) Кроме того, речь шла скорее об избавлении от NULL; так уж получилось, что вместо 0 я использую ничего. Но вопрос все равно интересный.

Возможно, это просто вопрос стиля, но важно отметить, как это сделал Йоханнес, что это не просто синтаксический стиль; они делают разные вещи. Просто легко сделать эти разные вещи одинаковыми.

Я предпочитаю инициализацию значения, потому что я не принимаю никакого участия в том, как инициализируется значение; я просто говорю "быть инициализированным". И наоборот, как только вы вводите значение, вы влияете на то, как это значение инициализируется.

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

2
ответ дан 13 December 2019 в 22:01
поделиться

Я думаю, что это разные вещи, возможно, вы путаете NULL с void, то есть int main() то же самое, что и int main(void), но НЕ int main(NULL) (В C++ NULL эквивалентен 0

-1
ответ дан 13 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: