一、构造函数
构造函数是一个特殊的成员函数,其名字与类名相同,创造类的类型对象时编译器自动调用,其主要完成初始化工作,即给每个数据成员一个合适的初始值,并且在对象整个生命周期内只调用一次。
特性
构造函数是特殊的成员函数,需要注意的是构造函数的工作为初始化对象,而不是开空间去创建对象。
特征:
1. 函数名与类名相同
2. 无返回值
3. 对象实例化时编译器自动调用对应的构造函数
4. 构造函数可以重载
#include <iostream>
using namespace std;
class Date {
public:
//1.无参构造函数
Date()
{
_year = 0;
_month = 0;
_day = 0;
}
//2.带参构造函数 (参数可以和缺省参数相结合)
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;//调用无参构造函数
Date d2(2023, 11, 6);//调用带参构造函数
//注意:在调用无参构造函数时,不要加(),直接按照上文调用即可。
return 0;
}
5. 如果在类中,没有进行显式定义构造函数,则C++编译器自动生成一个无参的默认构造函数,一旦像我们上文那样显示进行定义构造函数(无参的也算显式),则编译器就不会再自动生成了。
6. C++默认自动生成的构造函数其在对对象初始化时,对于内置类型不做处理,对于自定义类型会去再调用它的构造函数。内置类型包括 int , char , double等自带的类型。自定义类型就是我们 自己定义的类型。
从上图中可看出,其d1对象的内置类型并没有进行初始化。C++针对内置类型不做初始化打了个补丁:即内置类型成员变量在类中声明时可给默认值。
即:
此时也算完成了初始化对象。
7. 无参的构造函数和全缺省的构造函数和编译器默认自动生成的构造函数,这三种都称为默认构造函数,无参的构造函数和全缺省的构造函数这两种其只能存在一个。
其只能存在一个。
二、析取函数
析取函数与构造函数功能相反,其完成对对象中资源(对象内的变量、申请的空间等)的清理工作。注意:析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。对象在销毁时会自动调用析构函数。
特性
1、 析构函数的函数名是在类型前加上字符 ~。
2、 没有参数和返回值类型。
3、 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。特别注意:析构函数不能重载。
4、 对象在生命周期结束时编译器会自动调用析构函数。
对象销毁时自动调用。
5、 对于编译器默认自动生成的析构函数,其与构造函数相类似,在对对象进行资源清理时,对于内置类型不做处理,对于自定义类型的成员其会去调用它的析构函数。
自定义类型成员会去调用它的析构函数。
6、 如果类中没有申请资源时,析构函数可以不写,可以直接使用编译器默认生成的析构函数。有资源申请时(new、malloc等等)一定要写析构函数,否则会造成资源(内存)泄露。