在 C++ 面向对象编程里,类的默认成员函数是个绕不开的概念。很多时候我们没显式写某些函数,编译器却悄悄生成了它们。这篇文章就聊聊这六个默认成员函数:构造函数、析构函数、拷贝构造函数、赋值运算符重载,还有两个取地址运算符重载。
默认成员函数概览
默认成员函数就是用户没写、编译器自动补全的那些。一个类如果不写任何成员函数,编译器会生成以下六个:
- 构造函数
- 析构函数
- 拷贝构造函数
- 赋值运算符重载
- 普通取地址运算符重载
- const 取地址运算符重载
这六个里,前四个是核心,得自己拿捏;后两个多数场景下编译器生成的版本就够用了。另外,C++11 之后还多了移动构造和移动赋值,不过今天先不展开。
构造函数
构造函数负责对象实例化时的初始化,相当于替代了以前手动调用的 Init 函数,而且系统会自动调用它。
几个关键点:
- 函数名必须和类名一致。
- 没有返回值,连
void都不能写。 - 对象创建时系统自动触发。
- 可以重载。
- 如果没显式定义,编译器会生成无参的默认构造函数;一旦你写了带参的,编译器就不再提供无参版本了。
- 编译器生成的构造函数对内置类型成员初始化是不确定的(可能是随机值),对自定义类型成员则会调用其默认构造函数。
来看个具体的例子:
#include <iostream>
using namespace std;
class Date {
public:
// 无参构造函数
Date() { _year = 1; _month = 1; _day = 1; }
// 带参构造函数
Date(int year, int month, int day) {
_year = year; _month = month; _day = day;
}
// 全缺省构造函数不能与无参构造同时存在
// Date(int year = 1, int month = 1, int day = 1) { ... }
void Print() {
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
{
Date d1;
;
;
}


