Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpOpCpRT 44 of 150 menu
◀ ▶

Правило трех в C++

Правило трех: если класс сам освобождает ресурс в деструкторе, ему обычно нужны и конструктор копирования, и оператор присваивания с глубоким копированием. Иначе сгенерированные копии снова делят один указатель.

Все три функции работают с одним полем int*: деструктор снимает буфер, конструктор копирования создает свой блок при появлении нового объекта, оператор присваивания заменяет буфер у уже живущего объекта.

Запишем класс User с тремя функциями:

class User { public: int* data; User() { data = new int[1]; data[0] = 7; } User(const User& other) { data = new int[1]; data[0] = other.data[0]; } User& operator=(const User& other) { if (this != &other) { delete[] data; data = new int[1]; data[0] = other.data[0]; } return *this; } ~User() { delete[] data; } };

Сейчас создадим объект, скопируем его и присвоим другому:

int main() { User user1; User user2 = user1; User user3; user3 = user1; std::cout << user2.data[0] << "\n"; std::cout << user3.data[0] << "\n"; return 0; }

Соберите класс Holder по правилу трех для одного int в new[], скопируйте объект и выведите число из копии.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить