通过使用智能指针的"三规则",我有点困惑.如果我有一个类,其唯一的数据成员是智能指针,我是否需要显式定义析构函数,复制构造函数和赋值运算符?
我的理解是,由于智能指针将自动处理资源,因此我不需要显式定义析构函数,因此我不需要根据三个规则对其他两个执行此操作.但是,我不确定默认的复制构造函数是否足以用于智能指针,例如shared_ptr.
谢谢您的帮助!
Jon*_*rdy 12
默认的析构函数很好,因为析构函数shared_ptr将负责对象的释放.默认的复制构造函数可能是可接受的,具体取决于您的目的:当您复制拥有该对象的对象时shared_ptr,该副本将与原始对象共享所有权.默认赋值运算符自然也是如此.如果那不是你想要的,那么定义一个复制构造函数,否则就是克隆引用的对象.
简而言之,“不”。将代码分解为单一职责类的全部意义在于,您可以从“智能”构建块组成您的类,这样您就根本不需要编写任何代码。
考虑以下:
class Foo
{
std::shared_ptr<Bar> m_pbar;
std::string m_id;
};
Run Code Online (Sandbox Code Playgroud)
这个类自动具有尽可能好的复制和移动构造函数以及复制和移动赋值运算符,并且一切都得到了处理。
如果你想极端一点,你可以说,在大多数情况下,你可能根本不应该编写析构函数或复制构造函数- 如果你这样做,那么也许你最好将该功能分解为一个具有单一职责的单独类。