一般情况下,编译器会生成以下函数:

  • default构造函数
  • 复制构造函数
  • 重载赋值操作符
  • 析构函数

这些函数并不是都会生成,而是当这些函数被调用,而又没有明确定义的情况下,编译器才会生成相应的函数

default构造函数

当没有明确定义构造函数时生成,但是只有明确定义了构造函数(无论是不是默认构造函数),都不会再生成

复制构造函数和重载赋值操作符

编译器默认生成的版本只是单纯地将来源对象中每个非静态成员拷贝给目标成员
在明确定义的复制构造函数或者赋值操作符中,一般都会先判断来源对象和目标对象是否是同一个对象
什么时候编译器不会默认生成重载赋值操作符函数?(复制构造函数可能也是一样)

  1. 当类中有static const成员时
  2. 基类中将赋值操作符函数声明为private

C++要实现不可复制基类要点

  1. 将复制构造函数和重载赋值操作符明确声明为private
  2. 只写函数声明,不可实现函数,即使是空的函数体
class Uncopyable
{
    //这两个函数声明为protected是因为既可以避免Uncopyable可以被实例化,但是又不会影响子类
    protected:
        Uncopyap(){}
        ~Uncopyable(){}
    private:
        Uncopyable(const Uncopyable &);// 这两个函数不可以实现
        Uncopyable &operator=(const Uncopyable &);
}

析构函数

生成的析构函数什么时候是virtual的?
当基类的析构函数被声明为virtual时, 这种情况下,析构函数的虚属性主要来自基类。