Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
iluxa1810
13 / 13 / 5
Регистрация: 03.09.2011
Сообщений: 1,022
#1

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

29.10.2011, 18:32. Просмотров 2644. Ответов 50
Метки нет (Все метки)

http://s2.ipicture.ru/uploads/20111029/A7AtbNYV.jpg
Пункт первый не могу немного понять.Т.е получается,что всегда лучше создавать самому конструктор класса ?

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2011, 18:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопрос про конструктор класса по умолчанию (C++):

Конструктор класса не видит конструктор по умолчанию другого класса - C++
Ошибка, естественно, в Classes.cpp, в строке 20. Ругается, что у класса TailNode нет конструктора по умолчанию, хотя он там, конечно, есть....

Вопрос про конструктор - C++
цитата исходного кода из книги: class stock{ ... public: stock(); //Типа объявление конструктора по умолчанию чтоли... ...

Вопрос про конструктор - C++
Обязательно ли делать конструктор по умолчанию для класса, экземпляр которого входит в другой класс? Например так: class Class2 ...

Вопрос про конструктор и инициализвцию - C++
class test { int a; char name; string name2; public: test(int a,char* name, ....) : a(a), .....{} }; если стринг как...

Cделать конструктор по умолчанию и копирования для класса - C++
Вот у меня класс строка: class strg { char *str; int len; public: strg(); strg(const strg &); }; реализация:

Конструктор класса по умолчанию: код компилируется, хотя по идее не должен - C++
#include <iostream> class A {}; int main() { A i; A j(i); return 0;

50
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
30.10.2011, 16:25 #16
Bers
Это я знаю.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
30.10.2011, 16:29 #17
Bers, Не скажу, что ущербна.
Все же не спроста списки инициализации придумали.

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
#include <iostream>
#include <initializer_list>
#include <stdexcept>
 
class Cl
{
public:
   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);
   }
private:
   int value1;
   int value2;
   int value3;
};
 
int main()
{
   Cl c = {1,2,3};
}
0
Bers
Заблокирован
30.10.2011, 16:36 #18
ForEveR, не компилируется по двум причинам:

1. В моей старенькой студии отсутствует #include <initializer_list>
2. error C2552: c: инициализация не агрегированных данных с помощью списка инициализации не допускается

Попытка инициализации приватных членов.

Я не могу точно сказать как происходит инициализация в приведенном вами коде, но подозреваю, что такое не по стандарту. Элементарно, снаружи класса нет доступа к приватным членам. Ага.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
30.10.2011, 16:39 #19
Bers, http://liveworkspace.org/code/8b6d3cb4177ca28aa119dcd0707f53e2
1. Код абсолютно корректен и компилируется.
2. Код полностью соответствует текущему стандарту языка.
0
Bers
Заблокирован
30.10.2011, 16:41 #20
Цитата Сообщение от ForEveR Посмотреть сообщение
2. Код полностью соответствует текущему стандарту языка.
Хотите сказать, что нынче можно инициализировать данные члены класса СНАРУЖИ?
Нарушение инкапсуляции?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
30.10.2011, 16:43 #21
Bers, Почему снаружи? Инициализация с вызовом конструктора, принимающего аргумент типа std::initializer_list<T>.

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

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

Я так подозреваю, что сначала выполняется инициализация данных членов класса (список инициализации), а потом уже запускается конструктор без параметров. Не?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
30.10.2011, 16:52 #24
Jupiter, Это с какого барабана?
http://liveworkspace.org/code/1b8219123671ec160d83d869ac87707b
Хотя вообще да. Что это я. Ты прав.

Добавлено через 3 минуты
Bers, Конструктор принимающий initializer_list запускается.
0
Bers
Заблокирован
30.10.2011, 16:53 #25
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Конструктор принимающий initializer_list запускается.
с какой стати? И причем тут список инициализации для данного конструктора?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 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;
уже не знаю, описание давно читал
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
30.10.2011, 16:55 #27
Bers, Объект такой. initializer_list<T>. Из нового стандарта.

Добавлено через 39 секунд
Jupiter, Да. ты прав. delete говорит, что функции нет в классе.
0
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.

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

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

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

Как это вообще все понимать?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 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 тоже фишка из нового стандарта. Советую ознакомиться. Как никак он уже оффициально принят.
0
Bers
Заблокирован
30.10.2011, 17:16 #30
Цитата Сообщение от ForEveR Посмотреть сообщение
Bers, Если в классе есть конструктор принимающий список инициализации его можно инициализировать так как я показал.
Покажите отдельно конструктор, принимающий список инициализации
0
30.10.2011, 17:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.10.2011, 17:16
Привет! Вот еще темы с ответами:

Для класса "R" не существует конструктор по умолчанию - C++
Подскажите, что не так. И как здесь пользоваться cout? Чтобы вывести с. Просто я вбивал, а он не работает. И где его вообще вбивать нужно? ...

Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром? - C++
Добрый день, сразу к делу, есть некий класс class some { int x; public: some(int y = 1) : x(y) {} };

Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно» - C++
Помогите пожалуйста, хоть с одним из заданий. 1. Создать класс. Написать конструктор по умолчанию, конструктор с параметрами....

Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно? - C++
Можно ли использовать конструктор по умолчанию и конструктор инициализации одновременно?


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru