Effective C++条款05~06

572 阅读2分钟

条款05:了解C++默默编写并调用了哪些函数

big three:

  • 拷贝构造函数
  • 拷贝赋值函数operator=
  • 析构函数

当我们像下面编写一个类的时候:

class Empty
{
public:
private:
};

我们可能会觉得,这个类是空的,没有任何内容。但是,实际上,我们这种想法是错误的,当我们这样声明一个类时,我们会得到一些编译器为我们的类自动声明的函数。他们包括:

class Empty
{
public:
    Empty() {......}                           //default构造函数
    Empty(const Empty& rhs) {......}           //copy构造函数
    ~Empty() {......}                          //析构函数

    Empty& operator=(const Empty& rhs) {......}//copy assignment操作符
};

这些函数在被调用时,他们才会被编译器创建出来。big three函数最好是在编写类的时候进行自己的定义,因为使用默认的函数的效率并没有自己编写的高。而且使用默认函数,容易导致各种问题。

 

需要记住的点:

           编译器可以暗自为class创建default构造函数、copy构造函数、copy assignment操作符以及析构函数。

 

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

编译器为我们创建的所有函数都是pubic,为了阻止这些函数被创建出来,我们需要自行声明它们。假如我们不想他们被任何人调用,我们可以将他们声明为private函数,并且不把他们定义出来,这样当别人进行调用时,就会发生错误。但是这样做的手段并不优雅,毕竟我们程序员写程序都为了高雅。所以我们可以这样做:

                  将copy构造函数和copy assignment操作符在一个专门为了阻止copying动作而设计的base class内。

 

 

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

class HomeForSale:private Uncopyable
{
    ...
};

通过构造一个基类,使得这个技术可以被其他类继承,代码的复用率更加高了,但是往往又有可能会导致多继承问题。所以,我们在实际使用上,应该根据实际情况进行取舍。

 

需要记住的点:

        为驳回编译器自动(暗自)提供的功能,可以将相应的成员函数声明为private并且不去实现它。使用像Uncopyable这样额的base class也是一种方法。