функции-члены и конструктор копирования

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

но как работает копирование функций-членов? все ли функции-члены включены автоматически? Это потому, что объект на самом деле является просто членами, а функции просто объявляют, как можно использовать класс? Означает ли это, что теоретически вы можете создавать урезанные объекты с помощью конструктора копирования, а затем, например, вызывать геттер, чтобы получить элемент, которого нет в вашей копии?


person Dollarslice    schedule 08.12.2011    source источник
comment
Итак, вы задаетесь вопросом, можете ли вы создать копию объекта, в которой отсутствуют некоторые члены? Или вам интересно, можно ли создать копию, в которой отсутствуют определенные методы?   -  person Corbin    schedule 08.12.2011
comment
В нем не может отсутствовать определенные члены. Однако данные в этих элементах могут отсутствовать. Если вы не скопируете данные, то их там нет. Однако для этого свойства все еще будет выделена память. Что касается некопирования методов, как указано ниже, это невозможно.   -  person Corbin    schedule 08.12.2011


Ответы (3)


Вероятно, существует неправильное понимание того, что такое классы/объекты в C++. В некоторых языках (например, python) объекты могут изменяться (новые переменные/функции); в C++ объекты статичны, как указано в классе, поэтому нельзя уменьшить версию вашего объекта.

Конструктор копирования по умолчанию уже выполняет копирование от члена к члену. Если этого недостаточно (поверхностная копия ‹-> глубокая копия), вы должны предоставить свою собственную версию конструктора копирования, в которой вы должны выполнять все копирование. Если не удастся скопировать элемент, скопированная версия останется с неопределенным элементом или элементом по умолчанию. Лучше избегать создания собственного конструктора копирования, избегая динамической памяти и тому подобного.

person stefaanv    schedule 08.12.2011

Функции-члены не хранятся в экземплярах класса. Это обычные функции. Однако указатель vtable можно сохранить. Он используется для динамической отправки виртуальных функций-членов.

Обычные вызовы функций-членов определяются во время компиляции.

(как примечание, есть некоторые языки, которые хранят копии методов для каждого экземпляра, хотя С++ не является одним из них)

person Pubby    schedule 08.12.2011

Функции не имеют отдельного экземпляра для каждого экземпляра; характеристика (нестатической) функции-члена заключается не в том, что она будет создаваться для каждого экземпляра, а в том, что она должна вызываться для экземпляра и неявно получать указатель на экземпляр. Нет копирования функций. (На самом деле, функции-члены или другие функции не могут быть скопированы.)

person James Kanze    schedule 08.12.2011