如果不想让编译器主动生成类成员函数,
可以将其声明为private同时不定义它。
class ObjectNotCopy
{
public:
...
private:
ObjectNotCopy(const ObjectNotCopy&);
ObjectNotCopy& operator = (const ObjectNotCopy&);
}
如果程序进行了拷贝构造或者拷贝赋值,编译报错, 因为它们被声明为private。
如果成员函数或者友元函数调用了它们,链接报错,因为它们只有声明没有定义。
进一步,可将链接错误提前,转为编译错误,只需定义一个NonCopyable基类,
class NonCopyable
{
private:
NonCopyable(const NonCopyable&);
NonCopyable& operator(const NonCopyable&);
};
然后让ObjectNotCopy继承NonCopyable即可。
class ObjectNotCopy : public NonCopyable
{
... //
}
ObjectNotCopy不再需要声明拷贝构造函数和拷贝赋值函数。
当编译器想为ObjectNotCopy产生拷贝构造函数和拷贝赋值函数时,由于需要调用基类相应的函数都是private无法调用,因此编译器放弃为其生成这些函数(声明和定义都没有)。
代码中试图调用拷贝构造或者拷贝赋值ObjectNotCopy,即会产生编译报错。
请记住:
- 为驳回编译器自动(暗自)提供的技能,可将相应的成员函数声明为private并且
不予实现。使用像NonCopyable这样的base class 也是一种做法。