初识C++类的6个默认成员函数
目录
一、初始化和清理
二、拷贝复制
三、取地址重载
四、重要说明
五、注意事项
六、示例代码
在C++中,当一个类没有显式定义某些成员函数时,编译器会自动生成6个默认成员函数。这些函数可以分为以下几类:
一、初始化和清理
1、构造函数:在对象创建时完成初始化工作
-
如果没有定义,编译器生成默认构造函数(无参、函数体为空)
-
对于内置类型不做初始化,自定义类型会调用其默认构造函数
class Date {
public:// 构造函数Date() {// 初始化代码}
};
2、析构函数:在对象生命周期结束时完成清理工作
-
如果没有显式定义,编译器生成默认析构函数(函数体为空)
-
默认析构函数对内置类型不做处理,对于自定义类型成员,会调用其析构函数
class Date { public:// 析构函数~Date() {// 清理代码} };
二、拷贝复制
1、拷贝构造函数:使用同类对象初始化创建新对象
-
如果没有显式定义,编译器会生成默认的拷贝构造函数
-
默认生成的拷贝构造函数进行浅拷贝(逐成员拷贝、按字节拷贝)
-
对于指针成员需要自定义实现深拷贝
class Date { public:// 拷贝构造函数Date(const Date& d) {// 拷贝逻辑} };
2、赋值运算符重载:把一个对象赋值给另一个已存在的对象
-
如果没有显式定义,编译器会生成默认的赋值运算符,默认生成的进行浅拷贝
-
需要处理自赋值问题和释放原有资源
class Date { public:// 赋值运算符重载Date& operator=(const Date& d) {if (this != &d) {// 赋值逻辑}return *this;} };
三、取地址重载
1、普通对象取地址运算符重载:普通对象的取地址操作
-
默认实现返回对象地址
-
极少需要自定义实现
2、const对象取地址运算符重载:const对象的取地址操作
-
默认实现返回对象地址
-
极少需要自定义实现
class Date {
public:// 普通对象取地址Date* operator&() {return this;}// const对象取地址const Date* operator&() const {return this;}
};
-
这两个运算符通常不需要显式实现
-
编译器生成的默认版本就能满足大多数需求
四、重要说明
-
前4个成员函数(构造、析构、拷贝构造、赋值重载)最为重要,需要重点掌握
-
后2个取地址重载函数在实际开发中很少需要自定义实现
-
C++11新增了移动构造函数和移动赋值运算符,属于高级特性
-
默认生成的函数行为:
-
对于内置类型不做处理
-
对于自定义类型成员会调用其相应成员函数
-
五、注意事项
-
C++11之后新增了移动构造函数和移动赋值运算符
-
默认生成的函数行为可能不满足需求(特别是涉及资源管理时),需要显式实现
-
对于包含指针成员或需要资源管理的类,通常需要自定义拷贝构造函数和赋值运算符
六、示例代码
class Date {
private:int year;int month;int day;public:// 1. 构造函数Date(int y = 1970, int m = 1, int d = 1) : year(y), month(m), day(d) {}// 2. 析构函数~Date() {}// 3. 拷贝构造函数Date(const Date& other) : year(other.year), month(other.month), day(other.day) {}// 4. 赋值运算符重载Date& operator=(const Date& other) {if (this != &other) {year = other.year;month = other.month;day = other.day;}return *this;}// 5. 取地址运算符重载(通常不需要实现)Date* operator&() { return this; }const Date* operator&() const { return this; }
};