Effective C++ Term 5 了解C++默默编写的函数

首先提一句,C++默默编写的函数都是 publicinline

default 构造函数

如果你没有声明任何构造函数,则编译器会为你声明一个 default 构造函数。
一旦你编写了一个构造函数(包括拷贝构造函数),则编译器不会再为你生成 default 构造函数
但要注意,一般情况下,编译器仍会自动生成 copy 构造函数和 assignment operator (除非涉及到引用类型或 const 类型等编译器无法处置的情况)

copy 构造函数

将来源对象的每个 non-static 成员变量拷贝到目标对象

  • 若成员变量是内置类型,则会将每一个 bits 进行拷贝
  • 若成员变量是非内置类型,诸如 std::string 或 用户自定义类型,则会调用相应的类型的 copy 构造函数

assignment operator

与 copy 构造函数类似,assignment operator 会将来源对象的每个 non-static 成员变量拷贝到目标对象,但拷贝方式与 copy 构造函数略有区别

  • 若成员变量是内置类型,则会将每一个 bits 进行拷贝(这点相同)
  • 若成员变量是非内置类型,诸如 std::string 或 用户自定义类型,则会调用相应的类型的 assignment operator
class MyClass {
public:
    MyClass() {}  // 因为声明了 copy 构造函数,编译器不再生成 default 构造函数,需要自行编写

    MyClass &operator=(const MyClass &) {
        cout << "Invoking MyClass assignment operator" << endl;
        return *this;
    }

    MyClass(const MyClass &) {
        cout << "Invoking MyClass copy constructor" << endl;
    }
};


class Base {
public:
    MyClass myclass;
};

int main(int agc, char *argv[]) {
    Base base1;
    Base base2 = base1;  // copy constructor
    Base base3;
    base3 = base1;  // assignment operator
    return 0;
}

输出:

Invoking MyClass copy constructor
Invoking MyClass assignment operator

析构函数

当然,编译器会暗自生成一个析构函数

你可能感兴趣的:(Effective C++ Term 5 了解C++默默编写的函数)