1 | ||||||||||||||||
Какая разница в инициализации?06.12.2011, 10:25. Показов 2252. Ответов 17
Метки нет (Все метки)
Есть класс:
0
|
06.12.2011, 10:25 | |
Ответы с готовыми решениями:
17
В чём разница в конструкрукторе со списком инициализации и без оного Разница в определении конструкторов со списком инициализации и без него Различные варианты инициализации указателя - в чём точная разница между ними? Инициализация в теле конструктора или в списке инициализации, есть ли разница в сгенерированном коде? |
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
06.12.2011, 10:35 | 2 |
Эта форма предназначена для вызова конструкторов предков isState1 и isState2, то есть isState1 и isState2 - классы-предки isState1. Соответственно удивляет тот компилятор, который проглотит эту форму при
, то есть без таких предков.
В том случае, когда нет наследования, эта форма - единственная, иначе она не возможна, так как класс-потомок (в отличие от композита) просто не имеет членов с такими именами.
0
|
Заблокирован
|
||||||
06.12.2011, 10:41 | 3 | |||||
1 случай: инициализация данных членов.
2 случай: инициализация данных членов дефолтными конструкторами, а потом присвоение им уже других значений. В результате - падение производительности. Если данные члены - тяжелые объекты, а скорость - критичный параметр, то падение производительности может оказаться существенным. Если данные члены - примитивные типы данных, то возможно разницы не будит никакой (нужно смотреть ассм код) Добавлено через 2 минуты ничего подобного:
0
|
06.12.2011, 10:45 [ТС] | 4 |
taras atavin, приведенный код абсолютно нормально компилится gcc, и в нем нет ничего зазорного ни с точки зрения логики ни с точки зрения стандарта.
Добавлено через 1 минуту не совсем понял... оба случая - дефолтный конструктор (класса), разница только в способе (месте инициализации)
0
|
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
|
|
06.12.2011, 10:54 | 5 |
первый, тк
единственный способ вызвать конструкторы родительских классов с определёнными параметрами - список инициализации Добавлено через 1 минуту во втором случае сначала вызывается конструктор по умолчанию, а затем только - оператор присваивания
1
|
Заблокирован
|
||||||
06.12.2011, 10:59 | 6 | |||||
Проиллюстрируем на примере:
1
|
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
|
|
06.12.2011, 11:02 | 8 |
1
|
Заблокирован
|
||||||
06.12.2011, 11:03 | 9 | |||||
oxotnik, а есть ситуации, когда не получится просто так вызвать конструктор базового класса, даже если очень хочется, и остаётся лишь прибегать к услугам туловища конструктора потомка:
1
|
145 / 142 / 11
Регистрация: 11.09.2011
Сообщений: 411
|
|||||||||||||||||||||
06.12.2011, 11:19 | 10 | ||||||||||||||||||||
1й случай это типа инициализация конструктора в памяти заведутся переменные сразу со занчениями (true, false) после чего пойдет выполнение конструктора.
2й тут заведутся переменные со случайными значениями (т.е. в переменных будут просто данные которые хранились в этой области памяти до того как переменные заняли эту область), после пойдет выполнение конструктора в котором им присвоятся значения (true, false) в книгах советуют первый способ т.к. он быстрее. а еще таким способом нужно вызывать конструкторы базового класса с аргументами.
0
|
ниначмуроФ
851 / 535 / 110
Регистрация: 12.10.2009
Сообщений: 1,913
|
|
06.12.2011, 11:23 | 12 |
+ список инициализации - единственный способ инициализации константных членов и членов-ссылок класса
вроде преимуществ больше нет
0
|
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
|
06.12.2011, 11:25 | 13 |
А с какого предок вообще знает, что нужно потомку и как его инитить? Предок должен быть описан так, чтобы допускать отсутствие потомков с заранее заданными декларациями, твой инит - способ засунуть свою голову себе же в рот и подвесить кувалду возле челюсти. А если чилдрен не будет иметь определённого расширяющего члена? А ты в parent::init к нему уже обратился. А если потом ты решишь, что тот комплекс значений полей, которые parent::init в них запишет, не допустим? Но поведение parent::init уже стало частью реализации другого класса. А если ты потом закроешь расширяющий член? А parent::init уже к нему обращается. А если числдрен придётся переименовать? Но предку он уже известен под этим именем и под ним внесён в член предка.
0
|
06.12.2011, 11:38 [ТС] | 16 |
Bers, не понимаю как этот пример использовать:
Код
class Test { public: Test(int val): ref(val){} int& ref; }; int main() { int i = 100; Test(i); return 0; } а так: Код
int main() { Test(100); return 0; }
0
|
Заблокирован
|
||||||
06.12.2011, 11:41 | 17 | |||||
да это просто пример, как можно инициализировать ссылку.
Ну можно так:
0
|
oxotnik
|
06.12.2011, 11:43
[ТС]
Какая разница в инициализации?
#18
|
Не по теме: ой, блин, ступил немного
0
|
06.12.2011, 11:43 | |
Какая разница? Какая разница?! Какая Разница между сортировками? Какая разница между двумя алгоритмами? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |