5 规则指出,如果一个类具有用户声明的析构函数、复制构造函数、复制赋值构造函数、移动构造函数或移动赋值构造函数,则它必须具有其他 4 个。
但今天我突然意识到:什么时候需要用户定义的析构函数、复制构造函数、复制赋值构造函数、移动构造函数或移动赋值构造函数?
根据我的理解,隐式构造函数/析构函数对于聚合数据结构来说效果很好。然而,管理资源的类需要用户定义的构造函数/析构函数。
然而,是不是所有的资源管理类都可以使用智能指针转换成聚合数据结构呢?
Example:
// RAII Class which allocates memory on the heap.
class ResourceManager {
Resource* resource;
ResourceManager() {resource = new Resource;}
// In this class you need all the destructors/ copy ctor/ move ctor etc...
// I haven't written them as they are trivial to implement
};
vs
class ResourceManager {
std::unique_ptr<Resource> resource;
};
现在示例 2 的行为与示例 1 完全相同,但所有隐式构造函数都起作用。
当然不能复制ResourceManager
,但如果您想要不同的行为,则可以使用不同的智能指针。
要点是,当智能指针已经具有用户定义的构造函数时,您不需要用户定义的构造函数,因此隐式构造函数可以工作。
我认为拥有用户定义的构造函数的唯一原因是:
-
你不能在一些低级代码中使用智能指针(我非常怀疑这种情况)。
-
您正在实现智能指针本身。
但是,在正常代码中,我看不出有任何理由使用用户定义的构造函数。
我在这里错过了什么吗?