Конструкторы копирования являются неотъемлемой частью объектно-ориентированного программирования на C, предоставляя средства для инициализации объектов на основе существующих экземпляров. Хотя компилятор обычно генерирует конструкторы копирования по умолчанию для классов, существуют сценарии, в которых необходима настройка.
Когда конструктора копирования по умолчанию недостаточно, программисты выбирают определяемые пользователем конструкторы копирования для достижения индивидуального поведения копирования. Это особенно важно в ситуациях, когда поэлементное копирование, выполняемое конструктором копирования по умолчанию, не соответствует желаемым требованиям.
Пример 1: глубокое копирование динамически распределяемых данных
Рассмотрим класс с динамически выделяемой переменной-членом, как показано в следующем коде:
class Class {
public:
Class(const char* str);
~Class();
private:
char* stored;
};
Class::Class(const char* str) {
stored = new char[strlen(str) 1];
strcpy(stored, str);
}
Class::~Class() {
delete[] stored;
}
В этом примере почленное копирование сохраненного элемента будет дублировать только указатель, а не фактический буфер символов. В результате, когда одна из копий будет уничтожена, она освободит ту же память, что и другая копия, что приведет к неопределенному поведению. Чтобы решить эту проблему, необходимо реализовать конструктор глубокого копирования для дублирования буфера, гарантируя, что каждая копия имеет собственное независимое распределение памяти:
Class::Class(const Class& another) {
stored = new char[strlen(another.stored) 1];
strcpy(stored, another.stored);
}
void Class::operator=(const Class& another) {
char* temp = new char[strlen(another.stored) 1];
strcpy(temp, another.stored);
delete[] stored;
stored = temp;
}
Пример 2: Управление копированием объектов с подсчетом ссылок
Некоторые классы могут использовать подсчет ссылок для управления сроком службы динамически выделяемых объектов. Копирование таких классов по умолчанию приводит к неправильному подсчету ссылок. Пользовательский конструктор копирования может обеспечить правильный подсчет ссылок, предотвращая утечки памяти или преждевременное уничтожение объектов.
Пример 3. Копирование объектов с некопируемыми элементами
Классы могут иметь -копируемые переменные-члены, такие как дескрипторы файлов или сетевые подключения. Конструкторы копирования по умолчанию не могут обрабатывать такие члены, требуя от пользовательских конструкторов копирования выполнения соответствующих действий, таких как отсоединение некопируемых элементов во время копирования.
Понимая эти сценарии, программисты могут эффективно определять ситуации, когда пользовательские конструкторы копирования необходимы, обеспечение оптимальной инициализации объектов и безопасного копирования в приложениях на языке C.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3