(一)当你不希望编译器自动生成copy构造函数跟copy assignment操作符时。意思就是说我们的目标是阻止对象copying!
有两种方法!第一种方法:
把copy构造函数跟copy assignment操作符在private中声明,并且不要定义!因为如果定义了的话,那么该class的member函数跟friend函数就可以调用copy构造函数跟copy assignment操作符了!
class HomeForSale {
public:
...
private:
...
HomeForSale(const HomeForSale&);
HomeForSale& operator=(const HomeForSale&); //<span style="color:#ff0000;">只有声明!
</span>};
这样的话,当用户企图拷贝HomeForSale对象的时候,编译器会报错!因为他们没法调用private函数。当该class的member函数跟friend函数要调用他们的时候,连接器就会报错!因为他们没有定义!用这种方法成功的实现了:阻止对象copying。
但是!我们如果能把连接时候的错误提前到编译的时候来发现!这是很好的事情! 所以有了第二种方法:
第二种方法:
我们设计一个专门为了阻止copying动作而设计的base class:
class Uncopyable {
public:
Uncopyable() { }
~Uncopyable() { }
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};
class HomeForSale : private Uncopyable {
... //这个时候该class就不要再声明copy构造函数或copy assignment操作符了!
}
这样的话!任何人———甚至是member函数跟friend函数尝试拷贝HomeForSale对象的时候,编译器就是试着生成HomeForSale的copy构造函数跟copy assignment操作符!这个时候就要先调用base class的copy构造函数跟copy assignment操作符!这时候编译器会拒绝这样的调用!因为其base class的拷贝函数是private!
以上两种方法可以成功的阻止对象的copying操作!!!
请记住:
为驳回编译器自动(暗自)提供的机能,可将相应的成员函数声明为private,并且不予实现。
使用像Uncopyable这样的base class也是一种做法。