![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
VFaraon |
|
||||
![]() Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 5.12.2006 Где: Боярка, UA Репутация: нет Всего: нет |
Вот читаю Р. Лафоре... Мне нравится. Очень много полезных мелочей описано. И попал я на такую информацию:
И еще...
"Такая форма записи не рекомендется" - Не мог бы ктото поподробней рассказать об этой ситуации? "достаточно сложны" - И об этом... "Инициализация полей с помощью списка инициализации происходит до начала исполнения тела конструктора, что в некоторых ситуациях бывает важно" - Было бы оч хорошо, БОЛЬШЕ узнать об ЭТОМ механизме. Может ссылочку дадите или ктото сам попробует, а то уж больно интересный (для меня) вопрос ![]() |
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
да. не рекомендуется. просто по тому, что есть список инициализации это надо у автора спрашивать чистая правда. компилятор может соптимизировать код инициализации, именно поэтому её и советуют использовать. Ну и наконец, ссылки члены класса могут буть инициализированы только в списке инициализации конструктора. Это по сути основное отличие. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Это автор делает вид, что он очень умный, а все остальные - ... Одну причину Daevaorn назвал - некоторые члены можно проинициализировать только в списке инициализации (константы, ссылки), а также классы, не имеющие дефолт-конструктора. Вторая - сложные члены данных (классы) сами инициализируются по умолчанию до входа в тело конструктора. Если добавить их инициализацию в список инициализации явно - будет вызван соответствующий конструктор, если нет - все равно будет вызван дефолт-конструктор. А потом ты присваиваешь им новое значение в теле конструктора и делаешь, таким образом, лишнюю работу. Не всегда это так уж страшно, а встроенные типы (int, double) вообще по умолчанию никак не инициализируются. Но для некоторых пользовательских типов это может означать выделение памяти под дефолт-значение, а затем удаление ее и выделение под новое значение. Так что инициализировать данные класса в списке инициализации - хорошая привычка. Добавлено через 1 минуту и 33 секунды Приведенный автором пример с count - абсолютно по барабану как писать... -------------------- ... |
|||
|
||||
KelTron |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: нет Всего: 38 |
Когда ты пишешь, например, так:
Фактически происходит вот что:
Это сообщение отредактировал(а) KelTron - 2.4.2007, 08:26 -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
||||||||||
|
|||||||||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
||||
|
||||
Goryachev |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 23.2.2005 Где: Израиль Репутация: нет Всего: нет |
Это не правильно. Пример на gcc:
Ресультат:
То есть, мусор. |
||||||||||
|
|||||||||||
seacat79 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 27.2.2007 Где: Украина, Одесса Репутация: 1 Всего: 1 |
||||
|
||||
Goryachev |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 67 Регистрация: 23.2.2005 Где: Израиль Репутация: нет Всего: нет |
||||
|
||||
KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: нет Всего: 38 |
Исправлюсь, происходит вот что:
-------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
и где это не правильно?? это инициализация внутри тела конструктора! и что показывает твой пример? там не переопределен конструктор! вряд ли, скорее все соптимизировано в создание с инициализацией сразу, все таки встроенный тип. Зачем ему сначала создаваться, а потом инициализироваться ![]() |
|||
|
||||
KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: нет Всего: 38 |
Ну не надо вдаваться в частные случаи, оно может и соптимизироваться, не в этом дело, в общем случае происходит именно то что я написал т.е. вызываются конструкторы по умолчанию для объектов, тип int здесь только потому, что он в первом посту. -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
ты не понял. Речь о инициализации поумолчанию и Goryachev, в этом плане прав.
создается до вызова конструктора и если нет в списке инициализации, то значение не присваивается. Пока не произойдет присваивание внутри конструктора значение неопределено. |
|||
|
||||
vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
теперь понял ![]() я про тоже ![]() а вообще тут хватит постов Daevaorn и Earnest, а то развели тут ![]() |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
оффтоп: гы, у Earnest один пост, у KelTronа 3. Странный у тебя счетчик. Видать, был мусором проинициализирован ![]() ![]() Без обид ![]() |
|||
|
||||
Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Тоже не совсем правильно. Если написать int a=int(); то получим 0. Правда так в нормальном коде не пишут? но зато это часто встречается в шаблонах. Например, объявляем стандартный вектор интов заданной длины:
Это, кстати, очень удобно. Скажем, есть отображение std::map<CString, int> - допустим, мы хотим подсчитать, сколько раз каждая строка встречается в каком-то тексте. Пишем:
Если бы не было дефолт-конструктора, пришлось бы либо городить спец.класс counter с инициализацией, либо проверять, что строки еще нет и инициализировать счетчик нулем. -------------------- ... |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |