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

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

1、书中采用房子对象来举例,一套房子是一个独一无二的资源,不存在一模一样的两栋房子,因此是不支持拷贝操作。

class HomeForSale
{
……
};
HomeForSale h1;
HomeForSale h2;
HomeForSale h3(h1);//默认copy构造 出错
h1=h2;//默认copy assignment 出错

2、编译器默认生成的copy构造和copy assignment,访问权限都是public。如果我们想阻止使用这两个函数,我们可以声明它们为private。

class HomeForSale
{
public:
	……
private:
	HomeForSale(const HomeForSale&);
	HomeForSale& operator=(const HomeForSale&);
};

只声明,不实现。如果普通的调用会在编译阶段出现错误(无法访问private。但是友元和member函数却可以访问,这样的话错误会发生的链接阶段。 因为我们只是声明,没有实现。
3、错误越早出现越好,将错误拦截到编译阶段。
方法:可以通过继承来实现,在这设计一个不可以拷贝的类。

Ps:我们的代码会经过这4个环节,从而形成最终文件,c语言作为编译语言,用来向计算机发出指令。让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。

①. 预处理, 展开头文件/宏替换/去掉注释/条件编译 (test.i main .i)
②. 编译, 检查语法,生成汇编 (test.s main .s)
③. 汇编, 汇编代码转换机器码 (test.o main.o)
④. 链接 链接到一起生成可执行程序 ( a.out)

class Uncopyable{
{
protected:
	Uncopyable(){}
	~Uncopyable(){};
private:
	Uncopyable(const Uncopyable&);
	Uncopyable& operator=(const Uncopyable&);
};

然后让其他需要类继承它即可:

class HomeForSale:public Uncopyable
{
……
};

HomeForSale的对象调用copy构造或者copy assignment,会调用基类对应函数,由于基类的对应函数被声明为private,编译错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值