Форум программистов, компьютерный форум CyberForum.ru

Вопрос про конструктор класса по умолчанию - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
iluxa1810
12 / 12 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
29.10.2011, 18:32     Вопрос про конструктор класса по умолчанию #1
http://s2.ipicture.ru/uploads/20111029/A7AtbNYV.jpg
Пункт первый не могу немного понять.Т.е получается,что всегда лучше создавать самому конструктор класса ?

Не по теме:

Ппц,как так можно книги выпускать.Сплошные опечатки,пропуски букв,не полный перевод комментариев...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2011, 16:43     Вопрос про конструктор класса по умолчанию #21
Bers, Почему снаружи? Инициализация с вызовом конструктора, принимающего аргумент типа std::initializer_list<T>.

Кстати да. О птичках текущего стандарта.

http://liveworkspace.org/code/4e2895...7a8720e588dbf4
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.10.2011, 16:44     Вопрос про конструктор класса по умолчанию #22
Цитата Сообщение от ForEveR Посмотреть сообщение
Инициализация с вызовом конструктора, принимающего аргумент типа std::initializer_list<T>.
инициализация с проискодит через конструктор копии
Bers
Заблокирован
30.10.2011, 16:45     Вопрос про конструктор класса по умолчанию #23
Цитата Сообщение от ForEveR Посмотреть сообщение
Cl c = {1,2,3};
что именно делает эта запись?
запускает конструктор с тремя параметрами, или как?

Я так подозреваю, что сначала выполняется инициализация данных членов класса (список инициализации), а потом уже запускается конструктор без параметров. Не?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2011, 16:52     Вопрос про конструктор класса по умолчанию #24
Jupiter, Это с какого барабана?
http://liveworkspace.org/code/1b8219...83d869ac87707b
Хотя вообще да. Что это я. Ты прав.

Добавлено через 3 минуты
Bers, Конструктор принимающий initializer_list запускается.
Bers
Заблокирован
30.10.2011, 16:53     Вопрос про конструктор класса по умолчанию #25
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Конструктор принимающий initializer_list запускается.
с какой стати? И причем тут список инициализации для данного конструктора?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.10.2011, 16:54     Вопрос про конструктор класса по умолчанию #26
инициализация объектов при создании через оператор равно
C++
1
myclass obj = 5;
выполняется через конструктор копирования,
а на счет
C++
1
2
private: 
   Cl(const Cl&) = delete;
уже не знаю, описание давно читал
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2011, 16:55     Вопрос про конструктор класса по умолчанию #27
Bers, Объект такой. initializer_list<T>. Из нового стандарта.

Добавлено через 39 секунд
Jupiter, Да. ты прав. delete говорит, что функции нет в классе.
Bers
Заблокирован
30.10.2011, 17:01     Вопрос про конструктор класса по умолчанию #28
C++
1
Cl(const Cl&) = delete;
такую запись впервые вижу.


Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Объект такой. initializer_list<T>. Из нового стандарта.
Причем тут этот объект?

Цитата Сообщение от Bers Посмотреть сообщение
Cl c = {1,2,3};
Создаётся экземпляр с, который инициализируется данными объекта с правой стороны ( {1,2,3} - тоже объект класса Cl получается).

То есть {1,2,3} неявно создаёт временный объект типа CL, у которого данные члены инициализируются списком инициализации 1,2,3.

Потом с конструируется при помощи копирующего конструктора .

Конечно, на деле происходит что-то совершенно непонятное.

Данные-члены инициализируются снаружи класса, а потом запускается конструктор с параметрами.

Как это вообще все понимать?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2011, 17:06     Вопрос про конструктор класса по умолчанию #29
Bers, Если в классе есть конструктор принимающий список инициализации его можно инициализировать так как я показал. Это есть во всех стандартных контейнерах уже.

Суть. Класс initializer_list<T> имеет конструктор, который не является explicit. В итоге при написании Cl c = {1,2,3} происходит следующее. Из {1,2,3} конструируется объект типа initializer_list<int> затем вызывается конструктор класса Cl, принимающий объект этого типа, выполняется конструирование объекта и затем этот только что созданный объект копируется в нашу переменную c.

delete тоже фишка из нового стандарта. Советую ознакомиться. Как никак он уже оффициально принят.
Bers
Заблокирован
30.10.2011, 17:16     Вопрос про конструктор класса по умолчанию #30
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Если в классе есть конструктор принимающий список инициализации его можно инициализировать так как я показал.
Покажите отдельно конструктор, принимающий список инициализации
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2011, 17:18     Вопрос про конструктор класса по умолчанию #31
C++
1
2
3
4
5
6
7
8
9
10
   Cl(const std::initializer_list<int>& lst)
   {
      if (lst.size() != 3)
      {
         throw std::runtime_error("Wrong number of arguments");
      }
      value1 = *lst.begin();
      value2 = *(lst.begin() + 1);
      value3 = *(lst.begin() + 2);
   }
Полагаю запутал тем, что называю этот тип списком инициализации. std::initializer_list<T> я имел ввиду конечно же.
Сыроежка
Заблокирован
30.10.2011, 17:25     Вопрос про конструктор класса по умолчанию #32
Цитата Сообщение от iluxa1810 Посмотреть сообщение
Сыроежка, ну в это я въехал.
Я просто вот это замечание из книги к первому пункту немного не понимаю: Неиницированная переменная обычно содержит значение -"мусор"
Например,неинициализированная целая переменная может содержать -858993460,что в большинстве программ будет ,вероятно недопустимым значением для данной переменной .

Вот это относится к ситуации,когда я попытаюсь ,не объявив конструктор самостоятельно,задать значение переменной класса при создании ?
Я вам уже ответил на этот вопрос, почему вы снова переспрашиваете?! Читайте вниматенльно,что вам я пишу.
Bers
Заблокирован
30.10.2011, 17:28     Вопрос про конструктор класса по умолчанию #33
Цитата Сообщение от ForEveR Посмотреть сообщение
Полагаю запутал тем, что называю этот тип списком инициализации. std::initializer_list<T> я имел ввиду конечно же.
ни разу вы не педагог)
Ладно, проще просто прошмуглить, что за std::initializer_list<int> такой.
Однозначно, я не вижу его практическую пользу. По-моему, ток запутывает.
Сыроежка
Заблокирован
30.10.2011, 17:28     Вопрос про конструктор класса по умолчанию #34
Цитата Сообщение от ForEveR Посмотреть сообщение
iluxa1810, В только что объявленных переменных ПОД типов. Или же если переменная - объект класса, а в нем есть под-типы, но нет конструктора по умолчанию.
Ну если не знаете С++, то уж лучше бы помолчали! Как надоели такие доморощенные "эксперты"!

Неявно объявленный компилятором конструктор по умолчанию не инициализирует фундментальные типы!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2011, 17:32     Вопрос про конструктор класса по умолчанию #35
Сыроежка,
Неявно объявленный компилятором конструктор по умолчанию не инициализирует фундментальные типы!
Товарищ "эксперт", я где-то сказал обратное?

Добавлено через 42 секунды
Bers, Нуу...

C++
1
std::vector<int> vec = {1,2,3,4};
Неудобно?
Сыроежка
Заблокирован
30.10.2011, 17:34     Вопрос про конструктор класса по умолчанию #36
Цитата Сообщение от ForEveR Посмотреть сообщение
Сыроежка,

Товарищ "эксперт", я где-то сказал обратное?

Добавлено через 42 секунды
Bers, Нуу...

C++
1
std::vector<int> vec = {1,2,3,4};
Неудобно?
Вы даже сами не понимаете,что пишите! Причем здесь POD типы?!!! Вы хотя бы выучите, что такое 1) фундаментальные типы, 2) агрегаты; 3) POD -структуры!

А самое главное посмотрите, чем агрегаты отличаются от POD структур!

Когда это выучите, то не будете писать всякий бред!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2011, 17:36     Вопрос про конструктор класса по умолчанию #37
Сыроежка, Читать учись. Второе сообщение было адресовано не тебе. И ответ был не на твой вопрос.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.10.2011, 17:37     Вопрос про конструктор класса по умолчанию #38
Цитата Сообщение от Сыроежка Посмотреть сообщение
POD -структуры!
POD типами могут быть не только структуры но и классы
Bers
Заблокирован
30.10.2011, 17:40     Вопрос про конструктор класса по умолчанию #39
Цитата Сообщение от ForEveR Посмотреть сообщение
Неудобно?
У меня такое не компилируется.

Но дело даже не в этом. Дело в том, что идеологически, объект конструируется согласно заданным параметрам. И не может быть сконструирован как то "не по правилам".

Тем более, когда заходит речь о конструкторах, важно что бы последние были безопасными.

Предположим, что мой вектор не умеет хранить более 4 элементов (велосипед). А я попытаюсь списками запихать в него больше. Что будит? Исключения в конструкторе вещь не хорошая...

Конкретные конструкторы позволяют построить объект конкретно безопасно. Сохраняя таким образом инвариант класса.

Любая попытка сконструировать объект с кривыми стартовыми параметрами должна пофикситься ещё на этапе компиляции, а не в рантайме...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2011, 17:42     Вопрос про конструктор класса по умолчанию
Еще ссылки по теме:

Конструктор класса по умолчанию: код компилируется, хотя по идее не должен C++
C++ Cделать конструктор по умолчанию и копирования для класса
C++ Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром?

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.10.2011, 17:42     Вопрос про конструктор класса по умолчанию #40
Сыроежка,
Arithmetic types (3.9.1), enumeration types, pointer types, pointer to member types (3.9.2), std::nullptr_-
t, and cv-qualified versions of these types (3.9.3) are collectively called scalar types. Scalar types, POD
classes (Clause 9), arrays of such types and cv-qualified versions of these types (3.9.3) are collectively called
POD types. Scalar types, trivially copyable class types (Clause 9), arrays of such types, and cv-qualified
versions of these types (3.9.3) are collectively called trivially copyable types. Scalar types, trivial class types
(Clause 9), arrays of such types and cv-qualified versions of these types (3.9.3) are collectively called trivial
types. Scalar types, standard-layout class types (Clause 9), arrays of such types and cv-qualified versions of
these types (3.9.3) are collectively called standard-layout types.
Yandex
Объявления
30.10.2011, 17:42     Вопрос про конструктор класса по умолчанию
Ответ Создать тему
Опции темы

Текущее время: 01:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru