Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Инициализация в конструкторе класса |
Автор: VFaraon 26.3.2007, 23:19 | ||||
Вот читаю Р. Лафоре... Мне нравится. Очень много полезных мелочей описано. И попал я на такую информацию:
И еще...
"Такая форма записи не рекомендется" - Не мог бы ктото поподробней рассказать об этой ситуации? "достаточно сложны" - И об этом... "Инициализация полей с помощью списка инициализации происходит до начала исполнения тела конструктора, что в некоторых ситуациях бывает важно" - Было бы оч хорошо, БОЛЬШЕ узнать об ЭТОМ механизме. Может ссылочку дадите или ктото сам попробует, а то уж больно интересный (для меня) вопрос ![]() |
Автор: Earnest 27.3.2007, 08:13 |
Это автор делает вид, что он очень умный, а все остальные - ... Одну причину Daevaorn назвал - некоторые члены можно проинициализировать только в списке инициализации (константы, ссылки), а также классы, не имеющие дефолт-конструктора. Вторая - сложные члены данных (классы) сами инициализируются по умолчанию до входа в тело конструктора. Если добавить их инициализацию в список инициализации явно - будет вызван соответствующий конструктор, если нет - все равно будет вызван дефолт-конструктор. А потом ты присваиваешь им новое значение в теле конструктора и делаешь, таким образом, лишнюю работу. Не всегда это так уж страшно, а встроенные типы (int, double) вообще по умолчанию никак не инициализируются. Но для некоторых пользовательских типов это может означать выделение памяти под дефолт-значение, а затем удаление ее и выделение под новое значение. Так что инициализировать данные класса в списке инициализации - хорошая привычка. Добавлено через 1 минуту и 33 секунды Приведенный автором пример с count - абсолютно по барабану как писать... |
Автор: KelTron 27.3.2007, 11:14 | ||||||||||
Когда ты пишешь, например, так:
Фактически происходит вот что:
|
Автор: Fazil6 27.3.2007, 11:40 |
вообще-то не совсем , count не инициализируется нулем поумолчанию |
Автор: Goryachev 27.3.2007, 11:46 | ||||||||||
Это не правильно. Пример на gcc:
Ресультат:
То есть, мусор. |
Автор: seacat79 27.3.2007, 11:55 | ||
А если count это: ![]()
|
Автор: Goryachev 27.3.2007, 12:06 | ||||
Я думаю, что count подразумевался, как в оригинальном посте, т.е. int. ;) |
Автор: KelTron 27.3.2007, 12:19 | ||
Исправлюсь, происходит вот что:
|
Автор: vinter 27.3.2007, 12:52 |
и где это не правильно?? это инициализация внутри тела конструктора! и что показывает твой пример? там не переопределен конструктор! вряд ли, скорее все соптимизировано в создание с инициализацией сразу, все таки встроенный тип. Зачем ему сначала создаваться, а потом инициализироваться ![]() |
Автор: KelTron 27.3.2007, 13:00 | ||
Ну не надо вдаваться в частные случаи, оно может и соптимизироваться, не в этом дело, в общем случае происходит именно то что я написал т.е. вызываются конструкторы по умолчанию для объектов, тип int здесь только потому, что он в первом посту. |
Автор: Fazil6 27.3.2007, 13:04 | ||
ты не понял. Речь о инициализации поумолчанию и Goryachev, в этом плане прав.
создается до вызова конструктора и если нет в списке инициализации, то значение не присваивается. Пока не произойдет присваивание внутри конструктора значение неопределено. |
Автор: vinter 27.3.2007, 13:31 | ||||
теперь понял ![]()
я про тоже ![]() а вообще тут хватит постов Daevaorn и Earnest, а то развели тут ![]() |
Автор: JackYF 27.3.2007, 15:07 |
оффтоп: гы, у Earnest один пост, у KelTronа 3. Странный у тебя счетчик. Видать, был мусором проинициализирован ![]() ![]() Без обид ![]() |
Автор: Earnest 27.3.2007, 15:10 | ||||
Тоже не совсем правильно. Если написать int a=int(); то получим 0. Правда так в нормальном коде не пишут? но зато это часто встречается в шаблонах. Например, объявляем стандартный вектор интов заданной длины:
Это, кстати, очень удобно. Скажем, есть отображение std::map<CString, int> - допустим, мы хотим подсчитать, сколько раз каждая строка встречается в каком-то тексте. Пишем:
Если бы не было дефолт-конструктора, пришлось бы либо городить спец.класс counter с инициализацией, либо проверять, что строки еще нет и инициализировать счетчик нулем. |
Автор: vinter 27.3.2007, 17:02 | ||
я имел ввиду достаточно двух постов, что дальнейшее обсуждение не имеет смысла ![]() |
Автор: VFaraon 28.3.2007, 22:04 |
Спасибо за информацию!!! Просветили юнца ![]() |
Автор: NoNo 29.3.2007, 08:24 |
KelTron Если он читает книгу Р. Лафоре и он в данный момент изучает только тему "объекты и классы", то "наследование" и "указатели" ему ещё стоит пройти...... Это я по поводу твоего примера. VFaraon А тебе посоветую не замарачивайся сейчас на этом...читай книгу дальше.......а когда станешь понимать лудше.... вернёшься к этому вопросу.....так легче понять...... |
Автор: VFaraon 1.4.2007, 14:45 | ||
Нет нет. Я уже прочитал одну книгу, там есть все, но очень просто написано (т.к. книга для совсем не знакомых с ВЕЛИКИМ ![]() |