OK!!我们知道在声明一个类的时候,会同时生成Copy构造函数和copy assign 操作符函数。可是有时候类的对象是独一无二的,我们不希望有它的副本,当然就不希望它的拷贝成功了。
这个时候该怎么办呢??private可提供了一个好的方法。如下:
class Student
{:
private:
Student(const Student&);
Student operator= (const Student&);
}
这个时候 当客户企图拷贝Student对象的时候,编译器会阻扰他。
但是如果你不小心在member函数和friend函数之内这样做了,轮到连接器发出抱怨。当然我们希望将这个错误早点找到,我们可以专门为copy动作而 设计一个base class:
class Uncopyable
{
protected:
Uncopyable(){}
~ Uncopyable(){}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator = (cosnt Uncopyable&);
}
class Student: private Uncopyable
{
}
这个时候 无论任何人尝试调用拷贝Student函数,都会被编译器拒绝。另外也可以使用Boost提供的版本,那个class名为noncopyable,是个不错的家伙。
请记住:
为驳回编译器自动提供的技能,可将相应的成员函数声明为private并且不予实现。使用像Uncopyable这样的base class也是一种做法。