在 C++ 面向对象编程中,类的默认成员函数是理解编译器行为的关键。当我们没有显式实现某些成员函数时,编译器会自动生成它们。本文将详细剖析这 6 个默认成员函数,包括构造函数、析构函数、拷贝构造函数、赋值运算符重载以及取地址运算符重载。
默认成员函数概览
默认成员函数是指用户未显式实现,由编译器自动生成的成员函数。一个类在不写任何成员函数的情况下,编译器会默认生成以下 6 个函数:
- 构造函数
- 析构函数
- 拷贝构造函数
- 赋值运算符重载
- 普通取地址运算符重载
- const 取地址运算符重载
其中前 4 个是我们需要重点掌握的,后两个在大多数情况下使用编译器自动生成的即可。另外,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) {
// _year = year; _month = month; _day = day;
// }
void Print() {
cout << _year << "/" << _month << "/" << _day << endl;
}
:
_year;
_month;
_day;
};
{
Date d1;
;
;
}


