170 похожих чатов

Добрый день, возник следующий вопрос: без перегрузки оператора "=" осуществляется

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

13 ответов

23 просмотра

Что значит "вместе с данными будет скопирована и область памяти"?

Ярослав- Автор вопроса

Ну поля из копирующего экземпляра класса будут указывать на ту область памяти, где хранятся данные из копируемого экземпляра класса

Ярослав- Автор вопроса
🐈
Эмм, нет

А как тогда?

Ярослав
А как тогда?

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

Ярослав
А как тогда?

Вы сбросьте лучше пример, какой конкретно класс, структура вас интересует. Общий ответ на ваш вопрос займет слишком много места, проще объяснить на примере

Ярослав
А как тогда?

Ручками или, русками самому копировать. Указатель ничего не знает о том, на что указывает, кроме типа.

Ярослав- Автор вопроса
Stepan Zorin
вы немного путаетесь. Скопируются значения указате...

Ааа, точно запутался здесь, спасибо, что объяснили

В идеале, у тебя в качестве полей должны лежать объекты, которые имеют конструктор копирования. Ты сам выбираешь что тебе удобно иметь в качестве полей (какие типы объектов), если эти объекты имеют конструктор копирования, то тебе для твоего класса не надо делать свой конструктор копирования. Каждый член (я могу немного ошибаться) сам скопируется за счет своего конструктора копирования. Иногда, есть такие объекты, которые нельзя скопировать, тогда тебе надо уже делать свой конструктор копирования и в нем, получив по ссылке класс из которого копируем, заполняем поля класса в который копируем. Не рекомендуется держать в качестве поля голый указатель (но ситуации разные бывают, иногда и нужно), если у тебя в качестве поля указатель, то он указывает на данные в куче. Если не делать свой конструктор копирования, в копии твоего класса будет тоже поле-указатель и в нем будет значение того же адреса, что и в экземпляре откуда ты копируешь. А тебе надо независимую копию. Поэтому ты в своем конструкторе копирования в классе, куда копируешь, в этот указатель сначала кладешь через new адрес места, куда будет ссылаться указатель (new выделяет область памяти под этот тип и отдает указатель на начало этого участка памяти), потом через разыменование присваиваешь само значение из старого указателя в место, куда указывает указатель в копии. Еше не забудь, если у тебя есть указатель, значит ты выделил память через new, то и в деструкторе не забудь прописать delete по этому указателю.

The Pressbraker
В идеале, у тебя в качестве полей должны лежать об...

Всё ещё неправильно :( Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

Ярослав
Ну поля из копирующего экземпляра класса будут ука...

Да нет, у тебя просто данные скопируются из одной структуры в другую.

Ярослав- Автор вопроса
The Pressbraker
В идеале, у тебя в качестве полей должны лежать об...

Оо, спасибо, что разъяснили насчёт этого

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
5
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Карта сайта