Явная инициализация переменных

Тема в разделе "LANGS.C", создана пользователем systemio, 28 июл 2010.

  1. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    Добрый день господа программисты.
    Сегодня на работе был спор по поводу хорошо ли явно инициализировать все переменные класса. Сыр бор начался из-за мэпа стл который я засунул в инициализатор конструктора - т.е. просто явно вызвал конструктор мэпа без параметров. Моя точка зрения - все поля класса нужно явно перечислять в конструкторе. Это наглядно и... больше никаких объяснений не нашел. У кого какие точки зрения по этому поводу?
    Спасибо!
     
  2. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    systemio

    если мемберы plain они не будут инициализированы, если не указать в инициализаторе
     
  3. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    я считаю что не надо N+1 раз писать то что можно написать N раз
     
  4. systemio

    systemio New Member

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    98
    с другой стороны конструктор это особое место где (как я считаю) необходимо явно показать что за это поле я отвечаю и что оно не содержит мусора. Это как хороший этикет в программировании.
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    RedLord
    Код (Text):
    1. #include <iostream>
    2. class Test
    3. {
    4. public:
    5.     void print()
    6.     {
    7.         std::cout<<m_i<<std::endl;
    8.     }
    9. private:
    10.     int m_i;
    11. };
    12.  
    13. int main (int argc, char* argv[])
    14. {
    15.     Test *t = new Test();
    16.     t->print();
    17. }
    GoldFinch
    +1
     
  6. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    Booster
    это не POD, для POD там действительно будет мусор.
    но также будет и предупреждение об использовании не инициализированного поля
    http://codepad.org/oTBoMf0b
     
  7. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    Booster
    пример не в тему.

    Код (Text):
    1. #include <iostream>
    2. class Test
    3. {
    4. public:
    5. Test(){} // речь идет про то, что  в списке инициализатора нет мембера
    6.     void print()
    7.     {
    8.         std::cout<<m_i<<std::endl;
    9.     }
    10. private:
    11.     int m_i;
    12. };
    13.  
    14. int main (int argc, char* argv[])
    15. {
    16.     Test *t = new Test();
    17.     t->print();
    18. }
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    GoldFinch
    Что по вашему POD?
     
  9. RedLord

    RedLord Member

    Публикаций:
    0
    Регистрация:
    23 июн 2005
    Сообщения:
    183
    Адрес:
    Ukraine
    GoldFinch
    http://codepad.org лажает.
    в примере, приведенном Booster, как раз все хорошо с инициализацией.
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    RedLord
    Полностью согласен, plain мемберы обязательно нужно инициализировать. Что касается остального, то это на вкус. Кому-то нравится лишняя писанина, кому-то нет. Главное чтобы скомпилировалось. ^)
     
  11. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    странно, всегда считал что у POD-структур не может быть закрытых членов, счя полистал стандарт - ничего такого не нашел %)