在 C++ 中,类不仅是数据的封装,更重要的是它的成员函数管理对象的生命周期和行为。理解类的核心函数,有助于我们写出安全、性能高效的代码。今天,我们来聊聊 C++ 类的核心函数:构造函数、析构函数、拷贝构造函数、赋值运算符重载以及默认成员函数。
1. 默认成员函数
默认成员函数是指用户没有显式实现时,编译器自动生成的函数。常见的有六种,其中前四种最重要:
-
默认构造函数
-
拷贝构造函数
-
赋值运算符重载
-
析构函数
C++11 以后,还增加了:
-
移动构造函数
-
移动赋值运算符
学习默认成员函数,我们关注两点:
-
编译器自动生成的函数行为是否满足需求
-
如果不满足需求,我们该如何自己实现
2. 构造函数
构造函数是特殊的成员函数,用于对象实例化时初始化对象,而不是创建对象空间。特点如下:
-
函数名与类名相同
-
无返回值(也不要写
void) -
对象实例化时自动调用
-
可以重载
-
若未显式定义,编译器会生成无参默认构造函数
-
无参构造、全缺省构造、编译器默认构造,统称为默认构造函数,调用时不传实参即可
-
默认构造函数对内置类型不做初始化,对自定义类型成员会调用其默认构造函数
#include <iostream>
using namespace std;
class Date
{
public:
// 默认构造函数
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
void print()
{
cout << "Date: " << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year,;
int _month,;
int _day;
};
int main() {
Date date1; // 调用默认构造函数
Date date2(2025, 11, 15); // 使用自定义参数初始化
date1.print();
date2.print();
return 0;
}
Date: 1900-1-1
Date: 2025-11-15
在上面的代码中,Date 类的构造函数提供了默认参数值,因此可以在创建对象时不传递任何参数,或者传递自定义的年月日。
3. 析构函数
析构函数用于对象生命周期结束时清理资源,特点如下:
-
函数名为
~类名 -
无参数、无返回值
-
一个类只能有一个析构函数
-
对象生命周期结束时自动调用
-
对内置类型成员不做处理,对自定义类型成员会自动调用其析构函数
-
若类中没有资源申请,析构函数可以不写
4. 拷贝构造函数
拷贝构造函数是构造函数的特殊形式,用于用一个对象初始化另一个对象。特点:
-
构造函数重载的一种
-
第一个参数必须是类类型的引用,其他参数需有默认值
-
自定义类型对象进行拷贝传参或返回时,会调用拷贝构造
-
若未显式定义,编译器会生成默认拷贝构造:
-
内置类型:值拷贝/浅拷贝
-
自定义类型:调用其拷贝构造
-
5. 赋值运算符重载
赋值运算符 = 用于已有对象间的赋值,与拷贝构造不同,它是针对已存在对象。特点:
-
必须重载为成员函数
-
参数建议写成
const 类类型& -
建议返回
类类型&,支持连续赋值 -
编译器默认生成的赋值运算符:
-
内置类型:值拷贝/浅拷贝
-
自定义类型:调用其赋值运算符重载
-
-
如果类显式定义了析构函数且释放了资源,通常需要手动实现赋值运算符重载
| 函数类型 | 作用 | 默认行为 | 是否需自定义 |
|---|---|---|---|
| 构造函数 | 初始化对象 | 内置类型未初始化,自定义类型调用默认构造 | 必要时使用初始化列表 |
| 析构函数 | 清理资源 | 内置类型忽略,自定义类型调用析构 | 有资源时必须自定义 |
| 拷贝构造函数 | 用对象初始化另一个对象 | 内置类型浅拷贝,自定义类型调用拷贝构造 | 有指针或资源时需自定义 |
| 赋值运算符重载 | 对已存在对象赋值 | 内置类型浅拷贝,自定义类型调用赋值重载 | 有资源时需自定义 |
C++类核心函数详解
4万+

被折叠的 条评论
为什么被折叠?



