码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2021-06-24 18:14:54      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:功能   编译器   prot   函数   就会   赋值运算符重载   派生   重载   opera   

我们先定义一个房地产类

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&);
}

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

  • 将相应的成员函数声明为私有并不予实现
  • 利用一个基类实现私有功能,并让不允许拷贝的类作为派生类

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

标签:功能   编译器   prot   函数   就会   赋值运算符重载   派生   重载   opera   

原文地址:https://www.cnblogs.com/destinyzk/p/14926103.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!