有时候,我们可能希望某些类在设计上是不可复制的,因为复制行为可能导致不可预测的行为。例如管理了某些共享资源,复制会导致重复使用或资源泄露。此外,如果类对象包含指向动态分配内存的指针,复制可能导致资源管理问题,例如内存泄漏或二次释放。通过创建不可复制基类,可以确保派生类也不能被复制,从而避免上述问题
C++中可能导致复制操作有两个主要函数:复制构造函数和拷贝构造函数,因此在实现不可复制基类时需要避免外部对这两个函数的调用。C++11引入了右值引用和移动语义的概念。这里要说明一点,右值引用是为了直接转移资源所有权避免复制构造的过程,从而提高性能。例如对象B是用对象A来初始化的,对象B有一个new出来的数组,在明确知道之后不需要使用到对象A后,可以直接将A对象中new出来的数组的所有权转移给B,避免了B对象调用new操作符。
#pragma once
class Uncopyable {
public:
// 默认的构造和析构函数
Uncopyable() = default;
~Uncopyable() = default;
// 删除默认的拷贝构造和赋值运算符
Uncopyable(const Uncopyable&) = delete;
Uncopyable& operator=(const Uncopyable&) = delete;
// 删除右值引用的拷贝构造和赋值运算符
Uncopyable(Uncopyable&&) = delete;
Uncopyable& operator=(Uncopyable&&) = delete;
};
上面的右值引用中取消了const的使用,这是由于右值引用是为了转移资源的所有权,而const限制了对象的可修改性,因此无法使用const关键字。