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

А если нужна именно копия, с которой ты будешь работать

- менять или еще что-то ?

11 ответов

19 просмотров

Ну так если я изменю в одном месте, измениться же и в другом? Если не так то поправьте Так же и со ссылками

zjoss
Ну так если я изменю в одном месте, измениться же ...

конструктор копирования обычно выдает независимую копию, которая не видит изменения оригинала

Mikail Bagishov
конструктор копирования обычно выдает независимую ...

В ходе изучения узнал что данные лежат по тому же адресу что и были скопированы, значит если я их изменю, измениться и в том месте откуда копировал, так ведь?

zjoss
В ходе изучения узнал что данные лежат по тому же ...

> В ходе изучения узнал что данные лежат по тому же адресу что и были скопированы, Что? Нет

zjoss
В ходе изучения узнал что данные лежат по тому же ...

Может имеется ввиду, что если конструктор копирования не определить, то копирование будет выполняться конструктором копирования от компилятора, в таком случае будет побитовое копирование ( поля будут идентичны ). Тогда да, 2 адреса на одни и те же данные.

Sergey
Может имеется ввиду, что если конструктор копирова...

Дефолтный конструктор поля копирует не побитово, а с помощью их конструктора копирования.

Mikail Bagishov
> В ходе изучения узнал что данные лежат по тому ж...

В ходе изучения как работает твоя программа или вообще ты говоришь, про случай, когда член класса это указатель, и если ты не написал для этого класса конструктор копирования, то конечно, компилятор просто сделает битовую копию (он создаст конструктор копирования, но он толком не скопирует, он тупо скопирует в новый указатель тот же адрес что и в старом). Тогда, да - у тебя в копии объекта будет лежать уже новый член класса указатель, но адрес в нем будет тот же. Оба экземпляра класса будут ссылатся одно и то же место в памяти. Чтобы все скопировалось правильно, надо или иметь в качестве членов твоего класса не голые указатели, а объекты, которые умеют себя копировать правильно, в случае если они владеют ресурсом). Или же если все таки твой класс, имеет указатель на данные в куче, то соотвественно, делаешь конструктор копирования для твоего класса, чтоб он этот конструктор копирования создавал в куче место под данные (запрашивал память через new), и потом копировал те данные, что лежат у указателе-члена того объекта откуда ты будешь копировать в уже новое место в памяти, куда ссылается указатель объекта в который будут копироваться данные. А теперь внимание! Первое что надо понять, что когда говорят, что из одного объекта данные копируются в другой, по факту данные копируются не в объект, а они кладутся в память под названием куча . То есть на самом деле объекты в с++ это дескрипторы ресурсов, то есть в них по факту хранятся не данные, а указатели на данные, а сами данные лежат в куче. Даже если ты используешь контейнеры, по факту они тоже внутри себя просят через оператор new выделить им место в той памяти, которую я назвал куча (не знаю почему, но мне нравится это слово), и в объекте просто хранится указатель на это место в памяти (ну и как правило еще хранится служебная информация, например, размер массива или индекс итератора). То есть по факту объекты хранят данные опосредовано, данные хранятся в памяти. Скажу больше, при некорректном написании деструктора и вообще программы в целом, легко может получиться ситуация, когда объекта уже нет, а данные, указатель на которые он хранил еще существуют в куче, так как их никто оттуда не удалил (вернее, не освободил). Так что имей ввиду, что объекты в с++ сами в себе данные не хранят. Они хранят бумажки (указатели) в которых написано по какому адресу надо идти, чтоб забрать свои данные.

Mikail Bagishov
Дефолтный конструктор поля копирует не побитово, а...

Это,кстати, очень классно. Это реальная крутая фишка.

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта