一般学习如何使用智能指针和C ++ ......假设我有以下类:
template<typename T>
class MyClass {
public:
MyClass(const T& def_val)
private:
std::unique_ptr<T> default_val;
};
如果我只想在default_val类成员中给出的值存储指向类型为T的对象的指针,那么实现构造函数的惯用方法是什么?我的理解是,我根本不需要定义析构函数,因为unique_ptr会自动清理它自己吗?
答案 0 :(得分:3)
您编写代码的方式,MyClass只能存储指向构造函数参数的副本的唯一指针:
MyClass::MyClass(const T& def_val)
: default_val(new T(def_val))
{
}
这意味着T必须是可复制的。
我的理解是,我根本不需要定义析构函数,因为unique_ptr会自动清理它自己?
正确。这是unique_ptr
的两个主要目的之一,第二个是保证它只有一个所有者。
答案 1 :(得分:3)
如果你正在使用C ++ 11,你还可以添加一个接受rvalue ref的构造函数
template<typename T>
class MyClass {
public:
MyClass(T&& def_val) : default_val(new T(std::move(def_val))) {}
MyClass::MyClass(const T& def_val) : default_val(new T(def_val)) {}
private:
std::unique_ptr<T> default_val;
};
现在你同时接受const ref,生成副本或temporaries