若不想使用编译器自动生成的函数,应该明确拒绝

 

 

方法是:可以将对应的函数在类中进行声明,这样编译器就不会自动去生成。可行具体方案如下:


(1).将这个函数在该类中声明为private,并不进行定义。
(但当本类成员函数或者友元函数进行调用时,编译期不会出错,连接时才开始出错)




代码示例:

 

 

class HomeForSale
{
	public:
		...
	
	private:
		...
		HomeForSale(const HomeForSale &);     // 参数并非必要,这里不去实现,所以不写
		HomeForSale& operator= (const HomeForSale &);


}

 

 

 

 

 

 

 

(2).将该函数专门用一个基类里面进行声明为private,并不进行定义。
然后进行继承,继承类不用再写该函数。(这可以保证当本类成员函数或者友元函数进行调用时,在编译期就可以发现错误)
 

 

原理概述:

如果某个基类将copying函数声明为private,编译器将拒绝为其继承类生成一个copying函数。毕竟编译器为继承类所产生的copying函数想象中可以处理基类成分,但它们当然无法调用继承类无权调用的成员函数。编译器两手一摊,无能为力。


代码示例:

 

 

class Uncopyable
{
	protected:
		Uncopyable(){}              // 允许继承对象的构造和析构函数
		~Uncopyable(){}             // 析构函数不一定得是virtual

	private:
		Uncopyable(const Uncopyable&);    // 阻止拷贝
		Uncopyable& operator=(const Uncopyable&);

}



class HomeForSale : private Uncopyable       // 不一定都是public 继承
{
	// class 不再声明拷贝构造函数和赋值操作符
	...
}

 

 

 

 

 

 

这行得通,因为只要任何人,甚至是成员函数或友元函数,尝试拷贝,编译器便试着生成一个copy构造函数和一个copy assigenment 操作符,这些函数的“编译器生产版”会尝试调用其 base class 的对应兄弟,那些调用会被编译器拒绝,因为其 base class 的拷贝函数是private

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值