Item5: Explicitly disallow the use of compiler-generated functions you do not want--若不想使用编译器自动生成的函数,就该明确拒绝

时间:2022-09-06 12:52:34

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

    Uncopyableconst Uncopyable&);

    Uncopyable& operator = cosnt Uncopyable&);

}

 

class Student private Uncopyable

{

}

这个时候 无论任何人尝试调用拷贝Student函数,都会被编译器拒绝。另外也可以使用Boost提供的版本,那个class名为noncopyable,是个不错的家伙。

 

请记住:

为驳回编译器自动提供的技能,可将相应的成员函数声明为private并且不予实现。使用像Uncopyable这样的base class也是一种做法。