LINUX.ORG.RU

[c++] инициализация всех членов в конструкторе

 


0

0

Избавляюсь от вэрнингов вроде «... should be initialized in the member initialization list».

Два вопроса:

1. А действительно ли стоит это делать? Например, есть такой код:

Class SomeClass
{
  double m_a;
  double m_b;
  double m_c;
public:
  SomeClass(a, b):
    m_a(a),
    m_b(b) {  }  // конструктор для "повседневного" применения

  SomeClass() {  } // это для того, чтобы можно было делать vector элементов этого типа

  void calculateC()
  {
    m_c = /* адская формула с участием a и b */;
  }

  double getC () const { return m_c; }
  void setA (double a) { m_a = a; calculateC(); }
  void setB (double b) { m_b = b; calculateC(); }
}

Насколько оправдано здесь инициализировать m_c в SomeClass(a, b) и все переменные в SomeClass()?

2. Каким образом инициализировать «ненужные» в конструкторе члены? Касательно этого примера, как следует делать:

  SomeClass(a, b):
    m_a(a),
    m_b(b),
    m_c() {  }

или

  SomeClass(a, b):
    m_a(a),
    m_b(b),
    m_c(0) {  }
★★★★★
Ответ на: комментарий от jtootf

> где там сказано, что их можно ставить три штуки подряд?

Что не запрещено, то разрешено. Или у тебя есть пруфлинк, где правила русского языка запрещают использовать три штуки подряд?

anonymous
()
Ответ на: комментарий от jtootf

> если бы любая переменная в C++ неявно инициализировалась нулём, ничего бы с технической точки зрения не изменилось

С технической - нет, а с семантической - да.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

LamerOk

с семантической - да

ну собственно да, просто термин «семантически» тут использовать тем более стрёмно - если мы берём операционную семантику на основе абстрактой машины, то получится одно (small-step операции отличаются); если же, скажем, аксиоматическую семантику - другое (инварианты сохранились)

lester

кажется спорить бесполезно

не, я не стремлюсь кому-либо что-либо навязать. rationale для моей позиции где-то таково: определить в произвольном месте программы на C++ была ли некоторая переменная инициализирована или нет, невозможно; отсюда, собственно, и распространённость ошибок, с этим связанных. если бы инициализации не происходило, и обращение к неинициализированной переменной было бы ошибкой (времени компиляции или исполнения), термин «неинициализированная переменная» был бы более уместен

anonymous

ничего с ней не делает! И никаких значений он ни на этапе компиляции ни в рантайме туда просто так не записывает! А раз никто никаких значений не задавал зн-т никакой инициализации нет!

сколько эмоций :) я польщён

jtootf ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.