Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
1

Порядок вызова конструкторов при присваивании объектов одного класса

25.08.2016, 23:30. Показов 2747. Ответов 51
Метки нет (Все метки)

Имеется код ниже.
C++
1
Wein dres = rom;
Где dres и rom объекты класса Wein. Класс Wein имеет все конструкторы по умолчанию. Rom определен выше, это не имеет разницы. Расскажите, при подобном операторе какие конструкторы и деструкторы вызываются явно и не явно.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.08.2016, 23:30
Ответы с готовыми решениями:

Порядок вызова конструкторов при множественном наследовании
Здравствуйте, меня интересует вопрос, как изменить последовательность вызова конструкторов базовых...

Порядок вызова конструкторов
Всем доброго дня. Наткнулся в коде на интересные грабли: test.cpp #include "test.h" Test...

Порядок вызова конструкторов
Есть классы First и Second. Класс Second наследуется от First. Я имею ввиду: class Second:...

Порядок вызова конструкторов
на срр-reference нашёл тему про виртуальный деструктор, но я так и не понял (да там и не...

51
851 / 780 / 260
Регистрация: 27.07.2012
Сообщений: 2,192
25.08.2016, 23:41 2
Цитата Сообщение от Sinkha Посмотреть сообщение
при подобном операторе какие конструкторы и деструкторы вызываются явно и не явно.
Вызывается оператор копирующего присваивания Wein & operator=(const Wein &). Деструкторов не вызывается.
0
9 / 5 / 1
Регистрация: 15.08.2016
Сообщений: 48
25.08.2016, 23:47 3
Цитата Сообщение от John Prick Посмотреть сообщение
Вызывается оператор копирующего присваивания
Нет. Вызывается конструктор копии
0
851 / 780 / 260
Регистрация: 27.07.2012
Сообщений: 2,192
25.08.2016, 23:52 4
Цитата Сообщение от Sretenkov Посмотреть сообщение
Нет. Вызывается конструктор копии
Драться будем или мирно разойдёмся?
0
9 / 5 / 1
Регистрация: 15.08.2016
Сообщений: 48
25.08.2016, 23:58 5
Цитата Сообщение от John Prick Посмотреть сообщение
Драться будем или мирно разойдёмся?
Мирно разойдемся
http://ideone.com/ZZsp7g
1
nd2
3416 / 2796 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
26.08.2016, 00:02 6
Цитата Сообщение от Sinkha Посмотреть сообщение
Расскажите, при подобном операторе какие конструкторы и деструкторы вызываются явно и не явно.
От реализации зависит. Цитата из С.Прата.
0
Миниатюры
Порядок вызова конструкторов при присваивании объектов одного класса  
851 / 780 / 260
Регистрация: 27.07.2012
Сообщений: 2,192
26.08.2016, 00:05 7
Цитата Сообщение от Sretenkov Посмотреть сообщение
Мирно разойдемся
ОК, сдаюсь. operator= будет работать, если не одновременно с объявлением.
0
2542 / 1201 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
26.08.2016, 00:05 8
John Prick, а я бы с вами подрался - конструкторы с одним параметром могут вызываться неявно - в данном случаи создание объекта dres - о каком операторе вы говорите, когда нету объекта dres еще
0
9 / 5 / 1
Регистрация: 15.08.2016
Сообщений: 48
26.08.2016, 00:07 9
да
0
851 / 780 / 260
Регистрация: 27.07.2012
Сообщений: 2,192
26.08.2016, 00:15 10
rikimaru2013, ну я там уже слился в домик спрятался, хотя что-то покоя не даёт...
Цитата Сообщение от nd2 Посмотреть сообщение
От реализации зависит.
1
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
26.08.2016, 00:21  [ТС] 11
Цитата Сообщение от John Prick Посмотреть сообщение
От реализации зависит.
А что понимается под реализацией? Компилятор и его настройки оптимизации? Или что?
0
851 / 780 / 260
Регистрация: 27.07.2012
Сообщений: 2,192
26.08.2016, 00:24 12
Цитата Сообщение от Sinkha Посмотреть сообщение
Компилятор и его настройки оптимизации?
Ага, оно.
0
2542 / 1201 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
26.08.2016, 00:42 13
John Prick, если вы о copy elision - то это оптимизация де факто основана на правиле, что конструктор копирование не должен содержать side effects. Но то, что там вызовется по стандарта well-defined именно copy constructor - говорит вроде бы

12.8.2
A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&,
volatile X& or const volatile X&, and either there are no other parameters or else all other parameters
have default arguments (8.3.6). [ Example: X::X(const X&) and X::X(X&,int=1) are copy constructors.
C++
1
2
3
4
5
6
7
struct X {
X(int);
X(const X&, int = 1);
};
X a(1); // calls X(int);
X b(a, 0); // calls X(const X&, int);
X c = b; // calls X(const X&, int);
John Prick, и наша дискуссия была бы более продуктивная если бы вы наводили контр-аргументы, а не просто утверждения)
0
851 / 780 / 260
Регистрация: 27.07.2012
Сообщений: 2,192
26.08.2016, 01:14 14
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
наша дискуссия была бы более продуктивная если бы вы наводили контр-аргументы
Ну а что мне приводить? Я уже признал, что был не прав. Хотя есть и тонкие моменты. Вот такой код X x = X(); просто вызывает дефолтный конструктор, хотя логичным кажется, что должен был бы быть вызван сначала конструктор для временного объекта, а потом оператор копирующего присваивания.
0
15110 / 8110 / 1958
Регистрация: 30.01.2014
Сообщений: 13,784
26.08.2016, 09:44 15
Цитата Сообщение от John Prick Посмотреть сообщение
хотя логичным кажется, что должен был бы быть вызван сначала конструктор для временного объекта, а потом оператор копирующего присваивания.
Не может быть это логичным. Оператор присваивания вызывается для уже созданного объекта, а в этом случае объекта нет еще. Его еще только предстоит создать через копирование временного объекта.
Если отключить оптимизацию, то именно так оно и будет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#define PRINT std::cout << __PRETTY_FUNCTION__ << std::endl;
 
struct A
{
    A() { PRINT }
    A(A const &) { PRINT }
    ~A() { PRINT }
};
 
int main()
{
    A a = A();
}
http://rextester.com/CVNXS69419
1
851 / 780 / 260
Регистрация: 27.07.2012
Сообщений: 2,192
26.08.2016, 10:07 16
DrOffset, Ну да, я перед сном вчера уже это понял.
0
nd2
3416 / 2796 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
26.08.2016, 13:09 17
Цитата Сообщение от DrOffset Посмотреть сообщение
Оператор присваивания вызывается для уже созданного объекта, а в этом случае объекта нет еще. Его еще только предстоит создать через копирование временного объекта.
DrOffset, я что-то совсем запутался. Как тогда та, возможная, реализация, о которой пишет Прата?
C++
1
A a = b;
Создаётся временная копия b, инициализируется конструктором копирования, потом эта копия присваивается a.
0
825 / 249 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
26.08.2016, 13:29 18
Цитата Сообщение от nd2 Посмотреть сообщение
потом эта копия присваивается
Еще раз: здесь нет присваивания. Здесь именно инициализация.
0
nd2
3416 / 2796 / 1251
Регистрация: 29.01.2016
Сообщений: 9,426
26.08.2016, 13:31 19
Цитата Сообщение от HelicopterK52 Посмотреть сообщение
Еще раз: здесь нет присваивания.
Прата скажи.
0
825 / 249 / 34
Регистрация: 27.07.2016
Сообщений: 497
Записей в блоге: 1
26.08.2016, 13:36 20
Цитата Сообщение от nd2 Посмотреть сообщение
Прата скажи.
Книга, глава, страница?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2016, 13:36

Порядок вызова конструкторов/деструкторов
Вопрос чисто теоретический. Попробую сформулировать, не ругайте если получится коряво. Например,...

Классы, наследование, порядок вызова конструкторов
допустим у меня эсть два класса class a { publc: char *n; a() { n= new char ; } ~a()

Очерёдность вызова конструкторов класса
У меня есть 2 класса, к примеру Base и Mod. Mod является наследником Base. Классу Mod...

Странный порядок вызова конструкторов и передача временного обьекта в функцию в качестве неконстантной ссылки
Есть код //g++ 5.4.0 #include &lt;iostream&gt; struct foo { foo(int){std::cout &lt;&lt; &quot;int...


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

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

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