Effective C++:条款06:若不想使用编译器自动生成的函数,就该明确拒绝。

(一)当你不希望编译器自动生成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也是一种做法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值