NonCopyable 是 C++ 用于阻止派生类生成拷贝构造和拷贝赋值函数的一个通用类,在很多地方都有使用,例如 arm、boost等,在 effective c++ 中也有讲到,以下是一种使用方法:
class NonCopyable {
private:NonCopyable(const NonCopyable &);NonCopyable& operator=(const NonCopyable &);
protected:NonCopyable() {}~NonCopyable() {}
};class Derive : public NonCopyable {};
将拷贝构造和拷贝赋值设为私有成员,子类无法访问,通过该方式实现上述功能,当然更合理的写法是采用 delete 操作符
class NonCopyable {
public:NonCopyable(const NonCopyable &) = delete;NonCopyable& operator=(const NonCopyable &) = delete;
protected:NonCopyable() = default;~NonCopyable() = default;
};class Derive : public NonCopyable {};
这样显示的告诉编译器,禁止生成拷贝构造和拷贝赋值函数。可以做实现验证这一点:
class NonCopyable {
public:NonCopyable(const NonCopyable &) = delete;NonCopyable& operator=(const NonCopyable &) = delete;
protected:NonCopyable() = default;~NonCopyable() = default;
};class Derive : public NonCopyable {
public:Derive(int _a) : a(_a) {}Derive() {}Derive(const Derive& tmp) : NonCopyable(tmp) {std::cout << "copy constructor has call\n";this->a = tmp.a;}Derive& operator=(const Derive& tmp) : NonCopyable(tmp) {NonCopyable::operator=(tmp);std::cout << "copy assignment has call\n";this->a = tmp.a;return *this;}
private:int a;
}
这是一个正确的测试案例,注意 Derive 类的拷贝构造和拷贝赋值写法,如果省略掉基类信息(NonCopyable),那么在调用 Derive 的拷贝构造和拷贝赋值时,NonCopyable 实际上调用的是构造函数,从而丧失了目标功能。