Предпочтительны ли пустые инициализаторы для инициализации по умолчанию целочисленных элементов? - PullRequest
5 голосов
/ 07 июля 2010

Я только что прочитал комментарий от 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
};

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

Ответы [ 4 ]

7 голосов
/ 07 июля 2010

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

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

2 голосов
/ 07 июля 2010

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

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

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

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

2 голосов
/ 07 июля 2010

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

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

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.Но вы, вероятно, хотите сделать свой код переносимым.В этом случае (для инициализации указателей) я предпочитаю инициализацию по умолчанию, чем инициализацию значения.

0 голосов
/ 07 июля 2010

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

...