Effective C++ 学习笔记——条款06:若不想使用编译器自动生成的函数,就改名却拒绝

阻止拷贝构造函数与拷贝赋值运算符

这点属于一条技巧,主要针对于一些特定不允许实现拷贝构造函数(copy constructor)和拷贝赋值运算符(copy assignment operator)的场合。
举例说明,某个房地产公司所上架的房子没有重复的,因此在设计程序时,不允许将一座房子的信息拷贝给另一座房子,这就需要禁止使用拷贝构造函数和拷贝赋值运算符。

class HouseForSale{...};
HouseForSale h1;
HouseForSale h2;
HouseForSale h3(h2);        // 企图拷贝h1——禁止执行
h1 = h2;                    // 企图拷贝h2——也要禁止执行

存在问题:
如果是其他功能函数,不想使用不声明不实现就可以了。但是对于以上这两个功能,即使你不声明不定义,编译器是会为该类自动生成的(条款05)。

解决方法:
因为编译器为类自动生成的函数都是共有(public)的,我们就可以把这些函数声明为私有(private),这样它的对象就无权调用。
其次,只声明不定义,因为如果有定义,本类和友元函数(friend functions)还是可以调用它们。

class House{
public:
    ....
private:
    House(const House&);               //只有声明,不要定义
    House& operator=(const House&);    //因为不会被用到,就不必再给参数想一个名字了
};

这种解决方法已经被大家所接受了,C++源码中也运用该方法。

更好的解决方案:
当一个父类将拷贝函数声明为私有时,编译器会拒绝为它的子类生成拷贝函数。
因此我们可以专门使用一个父类,在其中声明拷贝操作为私有,并让我们的类继承自它。

class Uncopyable{
protected:
    Uncopyable();                               // 允许 drived 对象构造和析构
    ~Uncopyable();
private:
    Uncopyable(const Uncopyable&);              // 将拷贝函数转移至私有
    Uncopyable& operator=(const Uncopyable&);
};
// 为阻止 HomeForSale 对象被拷贝,需要继承 Uncopyable
class House:public Uncopyable{...};             // 公有继承

总结:

当不想让编译器为类自动生成某些函数时,把这些不想要的函数声明在此类的私有成员中,或者更好使用像如上例子的一个父类,并让我们的类公有继承。

你可能感兴趣的:(Effective,C++学习笔记,c++)