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

时间:2021-06-24 18:14:54   收藏:0   阅读:0

我们先定义一个房地产类

class HomeForSale{}

我们认为一个房地产应该是独一无二的,所以不希望他被拷贝或者赋值。所以我们希望下面的语句是错误的,编译器应该不予通过

int main() {
    HomeForSale h1;
    HomeForSale h2;
    HomeForSale h3(h1);	// wrong
    h1 = h2	// wrong
}

那如何实现呢?

上述的两个语句分别调用了HomeForSale类的拷贝构造函数和赋值运算符重载函数。通常来讲,如果我们不实现一个函数,那么编译器在调用的时候自然会报错。但是这两个函数非常特殊,如果我们自己不定义,编译器自己会给我们定义。那现在的问题就是怎么阻止编译器自己定义。

编译器自己定义方法都是public的,所有人都能用。如果我们自己声明一个私有的,那么外面的人调用时候就会出错。这可以算一个解决方案。但是它不绝对安全。因为HomeForSale这个类自己也可能会进行赋值和拷贝。

为了解决这个问题,我们可以考虑设计一个UNcopyable基类。

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

我们将不可复制这一个功能下放到基类。这样即使我们的派生类想要赋值,基类也不会允许。

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!