Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 31.03.2018
Сообщений: 60
1

Инициализация объектов "содержит" в C++

02.05.2019, 22:39. Показов 746. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот эта строчка меня смущает, Student() : name("Null Student"), scores() {}, ну типо есть списковая инициализация, в ней обязательно должен быть объект даже если его мы не инициализируем, дабы вызвался его конструктор без аргумента?
или мы можем сделать просто так Student() : name("Null Student") {} ??
Потому что и так и этак код компилируется...Вопрос в том, что не могу понять зачем scores() в списковой инициализации


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class Student
{
private:
    typedef std::valarray<double> ArrayDb;
    
    std::string name;  // включенный объект
    ArrayDb scores;     // включенный объект
 
    // Закрытый метод для вывода оценок
    std::ostream & arr_out(std::ostream & os) const;
public:
    ArrayDb & nn() { return scores; }
 
 
    Student() : name("Null Student"), scores() {}
    
    explicit Student(const std::string & s) : name(s), scores() {}///////////////////////////// не понимаю, что значит scores()
    explicit Student(int n) : name("Nully"), scores(n) {}
    
    Student(const std::string & s, int n) : name(s), scores(n) {}
    Student(const std::string & s, const ArrayDb & a) : name(s), scores(a) {}
    Student(const char * str, const double * pd, int n) : name(str), scores(pd, n) {}
    ~Student() {}
    double Average() const;
    const std::string & Name() const;
    double & operator[](int i);
    double operator[](int i) const;
 
    // Друзья
    // Ввод
    friend std::istream & operator>>(std::istream & is, Student & sty);  // 1 словов
    friend std::istream & getline(std::istream & is, Student & stu);  // 1 строка
    // Вывод
    friend std::ostream & operator<<(std::ostream & os, const Student & stu);
};
#endif
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.05.2019, 22:39
Ответы с готовыми решениями:

Инициализация массива объектов
Добрый вечер. не могу никак понять, почему массив объектов sampArray вмещает не четыре строки по...

Инициализация массива объектов
Уважаемые программисты, проясните ситуацию. Имеется класс CPt (точка), причем конструктор по...

Инициализация объектов в структуре
Нужно с помощью структуры создавать несколько объектов LabeledEdit и ComboBox, вопрос в том как и...

Инициализация объектов класса
Помогите, пожалуйста написать, с этим у меня тяжко хоть это и азы... Создайте 3 экземпляра класса...

19
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
02.05.2019, 22:56 2
Цитата Сообщение от Араик Расоян Посмотреть сообщение
Вопрос в том, что не могу понять зачем scores() в списковой инициализации
Чтобы убедится что объект будет инициализирован, т.к. в случае инициализации по-умолчанию объект может содержать неопределенное значение.
Подробнее - 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
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
02.05.2019, 23:12 6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а в чём отличие с score() и без?
Инициализация разная. Можно прочувствовать на тривиальных типах.
https://rextester.com/LZGC78920
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
02.05.2019, 23:13 7
Араик Расоян, отличие в том, что в списке инициализации нужно указывать конкретный конструктор, т.е. либо

C++
1
scores(n)
либо конструктор по-умолчанию
C++
1
scores()
либо вовсе не указывать конструктор для этого поля (тогда опять же будет использован конструктор по-умолчанию)

А вот в коде, если напишешь

C++
1
ArrayDb scores();
то это будет значить, что у тебя объявлена функция scores(), возвращающая объект ArrayDb. А вот для объявления переменной, инициализируемой конструктором по-умолчанию, используется форма
C++
1
ArrayDb scores;
А вот если используется конструктор с параметрами, то например
C++
1
ArrayDb scores(10);
означает инициализацию переменной scores с конструктором из int'а. А не объявление функции, как было в предыдущем случае.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
02.05.2019, 23:15 8
Цитата Сообщение от TRam_ Посмотреть сообщение
то это будет значить, что у тебя объявлена функция scores()
Речь о списке инициализации конструктора.
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
Цитата Сообщение от Croessmah Посмотреть сообщение
Речь о списке инициализации конструктора.
В списке инициализации конструктора нельзя написать

C++
1
scores,
это будет синтаксическая ошибка. В этом списке указываются конструкторы.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
02.05.2019, 23:20 11
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
так пример ТСа такой
Я не про пример ТС'а, а вообще. У ТС'а valarray - это классовый тип, там хоть так, хоть так будет конструктор по-умолчанию вызван.
0
2443 / 1841 / 406
Регистрация: 15.12.2013
Сообщений: 8,238
02.05.2019, 23:21 12
rikimaru2013, я давал линк для общего ответа про разницу в инициализациях, а не про конкретный тип, но похоже только запутал, а не внес ясность
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
02.05.2019, 23:21 13
Цитата Сообщение от TRam_ Посмотреть сообщение
В списке инициализации конструктора нельзя написать
А где в вопросе написано так?
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
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
02.05.2019, 23:26 16
Цитата Сообщение от Араик Расоян Посмотреть сообщение
но не в коем случае не так
В Вашем случае, что scores(), что вообще без него - без разницы.
Что так, что так будет вызван конструктор по-умолчанию.
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
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
да я думал для POD только {} в списке инициализаций конструктора спасает, а тут еще и () - век живи век учись.
Это C++, каждый день можно узнать что-то новое.

Цитата Сообщение от Араик Расоян Посмотреть сообщение
Тоесть грубо говоря либо вызывать конструкторы явно всех объектов которые содержатся в классе Student либо не вызывать явно не у одного из них, так?
Нет. Смотреть какое поле и инициализировать все что не имеет корректную инициализацию по-умолчанию или когда таковая вас не устраивает.
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 который создаст временный объект класса string s
нет. Временный объект будет передан в конструктор класса Student.

Цитата Сообщение от Араик Расоян Посмотреть сообщение
а если через ссылку то тогда сразу объекту name присвоится строка, правильно?
Нет, строка все равно будет скопирована. Для размещения временной строки в name надо использовать семантику перемещения, но оставьте это для другого раза.
0
02.05.2019, 23:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.05.2019, 23:52
Помогаю со студенческими работами здесь

Инициализация объектов класса
Доброго всем времени суток! У Бьерн Страуструп увидел вот такую конструкцию class date { ...

Инициализация объектов разными типами
Дана такая main: int main() { C c1(6), c2 = 5, c3(c1 + c1); return 0; } Нужно определить...

Инициализация сложных объектов(структура)
Как лучше описать инициализацию vulkan api? Много всяких действий. Как их распихать по классам?...

Инициализация массива объектов через конструктор
class some { public: some(){} some(int b):a(b){} void Set(int b){a=b;} private: int...

Инициализация статических объектов без конструктора
Что-то я как ни вертел этот код, он у меня не заработал. Как я понял, смысл в том что не надо...

Инициализация массива объектов класса Point
Когда создаю массив объектов {(x1, y1), (x2, y2),...} или передаю этот объект в качестве параметра...

Динамическое выделение памяти и инициализация объектов классов A и B
Не могу зделать задачу знатоки Help! #include &lt;iostream&gt; using namespace std; class A { int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru