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

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

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

Студворк — интернет-сервис помощи студентам
Имеется код ниже.
C++
1
Wein dres = rom;
Где dres и rom объекты класса Wein. Класс Wein имеет все конструкторы по умолчанию. Rom определен выше, это не имеет разницы. Расскажите, при подобном операторе какие конструкторы и деструкторы вызываются явно и не явно.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.08.2016, 23:30
Ответы с готовыми решениями:

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

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

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

51
26.08.2016, 15:05
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от DrOffset Посмотреть сообщение
Уверен?
Ну есть немного))) Ждал 3 года пока вы ошибетесь - и вот этот день настал!!!! 8-)

0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
26.08.2016, 15:39
 Комментарий модератора 
Дальнейший переход на личности или оффтоп буду карать без пощады


Добавлено через 32 минуты
Когда-то уже отписывался по этому поводу:
Visual Studio - нормально, g++ - ошибка
Почему при инициализации строки, сначала создаётся пустой объект?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
26.08.2016, 18:41
Croessmah, то есть при:
C++
1
2
A a;
A b = a;
вы склоняетесь, что есть шанс, каким-то компилятором вызывать оператор присвоения для объекта, которого нету?
Если справа от присвоения будет потенциальный аргумент конструктора преобразования тип которого не A - да там будет описанная ситуация о оптимизации 1 шага.

Но тут неявный вызов конструктора копирования, и 12.8.2. приводит пример, подписав его как конструктор копирования.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
26.08.2016, 19:04
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вы склоняетесь, что есть шанс, каким-то компилятором вызывать оператор присвоения для объекта, которого нету?
С чего Вы это взяли?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
26.08.2016, 19:06
Croessmah, из этого поста Visual Studio - нормально, g++ - ошибка или я не так прочитал всю суть?
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
26.08.2016, 19:10
rikimaru2013, я вообще не увидел там ничего о присваивании.
0
 Аватар для Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
26.08.2016, 19:26  [ТС]
Это снова я, создатель темы. Не думал что такой вопрос заставит вас ругаться. Я хочу попросить людей объяснить мне ещё 1 нюанс и желательно объяснить на пальцах.
Имеется код класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream>
class Test1{
private:
    int a;
    int b;
public:
    Test1() { std::cout << "Constructor called\n";
    a = 10;
    b = 20;
    }
    Test1(const Test1 &t) { std::cout << "operator of copy has been called\n";
    a = t.a;
    b = t.b;
    }
    Test1 operator=(Test1 &t){ std::cout << "operator of equals has been called\n"; 
    a = t.a;
    b = t.b;
    return *this;
    }
    ~Test1() { std::cout << "Destructor has been called\n"; }
 
};
И точка входа
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include "test1.h"
using namespace std;
 
 
int main(){
 
    Test1 a;
    Test1 b = a;
    b = a;
 
}
Вывод такой:
Constructor called
operator of copy has been called
operator of equals has been called
operator of copy has been called
Destructor has been called
Destructor has been called
Destructor has been called

Тут у нас 1 создание, 1 инициализация и 1 присваивание, но в консоли в итоге дважды вызвался оператор копирования. Зачем? Ведь я единожды скопировал. Надеюсь вы объясните по понятнее, так как это очень важный момент
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
26.08.2016, 19:29
Sinkha,
C++
1
Test1& operator=( const Test1 &t )
Найдите отличие с вашим. И опережая ваш вопрос: - для a = b = c;
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
26.08.2016, 19:36
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
отличие
получается, что отличия
1
 Аватар для Sinkha
3 / 3 / 2
Регистрация: 04.07.2015
Сообщений: 187
26.08.2016, 19:47  [ТС]
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Найдите отличие с вашим. И опережая ваш вопрос: - для a = b = c;
Понял. У меня возвращаемое значение есть сам объект, а не ссылка на него. То есть создаётся временный обхект и потом происходит вызов операции копирования.

Добавлено через 7 минут
Ещё 1 вопрос
C++
1
2
3
4
5
6
7
8
 Test1() { std::cout << "Constructor called\n";
    a = 10;
    b = 20;
    }
    Test1(const Test1 &t) { std::cout << "operator of copy has been called\n";
    a = t.a;
    b = t.b;
    }
Тут конструктор и операция копирования. Я заметил что они очень похожи друг на друга. ПРавда ли то, что операция копирования это частный случай конструктора?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
26.08.2016, 20:38
Цитата Сообщение от Sinkha Посмотреть сообщение
ПРавда ли то, что операция копирования это частный случай конструктора?
ну есть практика выносить общую логику установки данных класса с помощью init подобных методов, а для конструкторов лучше использовать делигирование конструкторов
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
05.10.2016, 22:03
Так всё же на вырезке с книги в посте Порядок вызова конструкторов при присваивании объектов одного класса не верная

При
C++
1
2
A a;
A b = a;
О какой "в зависимости от реализации можно говорить" ? По стандарту конструктор копирование A( const A& ) - тут не будет ничего неявного и конвертирующего как при
C++
1
2
A a;
B b = a;

lss, alsav22, nord_v, вы как считаете?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.10.2016, 22:03

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
52
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru