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 实际上调用的是构造函数,从而丧失了目标功能。