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