C++类禁止copy构造函数和copy assign操作符

        在C++类中,编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符,以及析构函数。注意,这些编译器产生出来的函数都是public的,为了阻止这些函数被创建出来,我们可以把它们声明为private,这样就阻止了编译器暗自创建其对应版本函数。

class Node
{
public:
	Node(int _data = 0) : data(_data) {}
	int get() const { return data; }
	void set(int _data) { data = _data; }

private:
	Node(const Node &);
	Node &operator=(const Node &);

	int data;
};
        在上面的class定义中,当程序企图拷贝Node对象时,编译器就会阻止该操作。这样的话,只要将copy构造函数和copy assign操作符声明为private就可以了,还有另外一种方式,我们可以专门定义一个阻止copying动作的base class。这个base class如下所示:

class Uncopyable
{
protected:
	Uncopyable() {} // 允许derived对象构造和析构
	~Uncopyable() {}
private:
	Uncopyable(const Uncopyable &); // 阻止copying
	Uncopyable &operator=(const Uncopyable &);
};

class Node : private Uncopyable
{
public:
	Node(int _data = 0) : data(_data) {}
	int get() const { return data; }
	void set(int _data) { data = _data; }

private:
	int data;
};
        这样的话,在程序中,甚至在member函数或friend函数中,尝试拷贝Node对象,编译器就会试着生成一个copy构造函数或copy assign操作符,这些函数的“默认版本”会尝试调用其base class的对应函数,但是这些调用会被阻止,因为它们是private的,即阻止了该类对象的copy操作。


参考资料:

        1、《Effective C++ 第3版》 条款6

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值