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)