2 / 2 / 0
Регистрация: 31.03.2018
Сообщений: 60
|
||||||
1 | ||||||
Инициализация объектов "содержит" в C++02.05.2019, 22:39. Показов 746. Ответов 19
Метки нет (Все метки)
Вот эта строчка меня смущает, Student() : name("Null Student"), scores() {}, ну типо есть списковая инициализация, в ней обязательно должен быть объект даже если его мы не инициализируем, дабы вызвался его конструктор без аргумента?
или мы можем сделать просто так Student() : name("Null Student") {} ?? Потому что и так и этак код компилируется...Вопрос в том, что не могу понять зачем scores() в списковой инициализации
1
|
02.05.2019, 22:39 | |
Ответы с готовыми решениями:
19
Инициализация массива объектов Инициализация массива объектов Инициализация объектов в структуре Инициализация объектов класса |
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
|
|
02.05.2019, 22:56 | 2 |
Чтобы убедится что объект будет инициализирован, т.к. в случае инициализации по-умолчанию объект может содержать неопределенное значение.
Подробнее - default initialization
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
02.05.2019, 22:59 | 3 |
S_el, а в чём отличие с score() и без?
0
|
2 / 2 / 0
Регистрация: 31.03.2018
Сообщений: 60
|
|
02.05.2019, 23:05 [ТС] | 4 |
Блин, вот мой вопрос, в чем отличие))))
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
02.05.2019, 23:07 | 5 |
Араик Расоян, его просто нету) Но вдруг сейчас уточнят нам в чём
0
|
Неэпический
|
|
02.05.2019, 23:12 | 6 |
Инициализация разная. Можно прочувствовать на тривиальных типах.
https://rextester.com/LZGC78920
0
|
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
|
||||||||||||||||||||||||||
02.05.2019, 23:13 | 7 | |||||||||||||||||||||||||
Араик Расоян, отличие в том, что в списке инициализации нужно указывать конкретный конструктор, т.е. либо
А вот в коде, если напишешь
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
02.05.2019, 23:16 | 9 |
Croessmah, https://rextester.com/XUY80052 так пример ТСа такой
https://rextester.com/NFNU73418 лул https://stackoverflow.com/ques... ialization
0
|
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
|
||||||
02.05.2019, 23:19 | 10 | |||||
В списке инициализации конструктора нельзя написать
0
|
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
|
|
02.05.2019, 23:21 | 12 |
rikimaru2013, я давал линк для общего ответа про разницу в инициализациях, а не про конкретный тип, но похоже только запутал, а не внес ясность
0
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
02.05.2019, 23:23 | 14 |
S_el, да я думал для POD только {} в списке инициализаций конструктора спасает, а тут еще и () - век живи век учись.
И компилятор молчит, что я читаю мусорную переменную - сижу тыкаю почему молчит
0
|
2 / 2 / 0
Регистрация: 31.03.2018
Сообщений: 60
|
|
02.05.2019, 23:24 [ТС] | 15 |
Тоесть получается что в моем примере в списковой инициализации объекта класса Student нужно либо сделать так
Student() : name("Null Student"), scores() {} либо так Student() : name(), scores(n) {} или так Student() {} но не в коем случае не так Student() : name("Null Student") {} ну или так тоже не делать Student() : scores() {} Тоесть грубо говоря либо вызывать конструкторы явно всех объектов которые содержатся в классе Student либо не вызывать явно не у одного из них, так?
0
|
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
|
|
02.05.2019, 23:30 | 17 |
Араик Расоян, можно часть вписать, часть не вписать. Единственное что - хорошим тоном будет вписывать именно в том же порядке, в котором эти поля объявлены в классе.
0
|
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
|
|
02.05.2019, 23:34 | 18 |
Это C++, каждый день можно узнать что-то новое.
Нет. Смотреть какое поле и инициализировать все что не имеет корректную инициализацию по-умолчанию или когда таковая вас не устраивает.
1
|
2 / 2 / 0
Регистрация: 31.03.2018
Сообщений: 60
|
|
02.05.2019, 23:38 [ТС] | 19 |
Спасибо, я понял. Раз я уже обратил ваше внимание, задам еще один вопросик
Student(const std::string & s, int n) : name(s), scores(n) {} Вот в этой строчке, если мы первый аргумент объявим так Student(const std::string s, int n) : name(s), scores(n) {} и сделаем вот так в main() { Student("dfgfgdf"); } то вызовется конструктор класса Student который создаст временный объект класса string s, проинициализирует объект name и уничтожится временный объект string s после того как программа покинет блок конструктора. а если через ссылку то тогда сразу объекту name присвоится строка, правильно?
0
|
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
|
|
02.05.2019, 23:52 | 20 |
нет. Временный объект будет передан в конструктор класса Student.
Нет, строка все равно будет скопирована. Для размещения временной строки в name надо использовать семантику перемещения, но оставьте это для другого раза.
0
|
02.05.2019, 23:52 | |
02.05.2019, 23:52 | |
Помогаю со студенческими работами здесь
20
Инициализация объектов класса Инициализация объектов разными типами Инициализация сложных объектов(структура) Инициализация массива объектов через конструктор Инициализация статических объектов без конструктора Инициализация массива объектов класса Point Динамическое выделение памяти и инициализация объектов классов A и B Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |