Item 6 如何禁用编译器产生的函数

本文介绍如何通过声明私有的拷贝构造函数和赋值运算符来禁止类的对象被拷贝。此外,还提供了一个基类Uncopyable的实现方式,以帮助避免无意中的拷贝行为。

如果要禁用编译器自动产生的copy ctor和拷贝构造函数,一般用下面的方法:

class UniqueMoo { public: ... private: UniqueMoo(const UniqueMoo&); // 1. 只声明不定义,而且声明为私有,即可 UniqueMoo& operator = (const UniqueMoo&); // 1. 防止客户调用。用则产生编译错。若用 }; // 1. 于成员函数或友元函数,则产生链接错。

更明智的办法是定义一个空的基类:

class Uncopyable { protected: Uncopyable() {} ~Uncopyable() {} // 2. 虽然可派生,但不需要virtual private: Uncopyable(const Uncopyable&); Uncopyable& operator=(const Uncopyable&); }; class UniqueMoo: private Uncopyable { // 3. 私有继承比较好 ... };

1> 当客户/成员函数/友元函数要拷贝UniqueMoo对象时,编译器自动调用Uncopyable的拷贝函数,于是产生编译错误。
2> Uncopyable没有成员变量,所以在单重继承时,一般会有empty base class optimization。多重继承时则一般没有。
3> Boost里有现成的实现:noncopyable

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值