Правило трех в 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[],
скопируйте объект и выведите число из копии.