首先提一句,C++默默编写的函数都是 public
且 inline
的
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
析构函数
当然,编译器会暗自生成一个析构函数
网友评论