C++函数自动生成规则

一个类的构造函数包括:

  • 默认构造函数(无参数构造函数)
  • copy构造函数
  • move构造函数

相关的赋值操作符:

  • copy赋值操作符
  • move赋值操作符

上述方法或者操作符,在某些情况下编译器都会自动生成:

  1. 没有定义任何一种构造函数,自动生成默认构造函数。
    1)如果有自定义的其他构造函数,需要手动添加默认构造函数;
    2)或者使用=default显示增加默认实现;
    3)否则编译报错。
  2. 定义copy构造函数,不会自动生成move构造函数。
    1)move构造可编译通过,会调用copy构造执行。
  3. 定义move构造函数,不会自动生成copy构造函数。
    1)此时,copy构造不能编译。
  4. copy构造和copy赋值,以及move构造和move赋值不互斥,定义了一个,不会阻止编译器自动生成另一个。

一个类,成员类型,删除赋值构造,这个类的赋值构造也会默认删除。

class Base {
public:
    Base() {
        cout << "base ctor()\n";
    }

    Base(const Base& b) {
        cout << "base copy ctor()\n";
    }

    Base(Base&& b) noexcept {
        cout << "base move ctor()\n";
    }

    Base& operator=(const Base& b) {
        cout << "base copy =\n";
        return *this;
    }

    Base& operator=(Base&& b) noexcept {
        cout << "base move =\n";
        return *this;
    }

    ~Base() {
        cout << "base de-ctor\n";
    }
};

class Derive: public Base {
public:
    Derive() {
        cout << "derive: default\n";
    }

    Derive(const Derive& d): Base{d} {
        cout << "derive: copy ctor\n";
    }

//    Derive& operator= (const Derive& d) {
//        cout << "derive: copy =\n";
//            return *this;
//    }

//    Derive(Derive&& d): Base{move(d)} {
//        cout << "derive: move ctor\n";
//    }
//    Derive& operator= (Derive&& d) {
//        cout << "derive: move =\n";
//        return *this;
//    }

    ~Derive() {
        cout << "derive: de-ctor\n";
    }
};

你可能感兴趣的:(c++,开发语言)