条款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,编译错误。