欢迎阅读新一期的c++模块————构造函数和析构函数
??个人主页:-Joker-
🏷?专栏:C++
📜代码仓库:c_code
🌹🌹欢迎大佬们的阅读和三连关注,顺着评论回访🌹🌹
在之前C语言的学习中中我们通常会使用一个函数Init来对对象进行初始化,而在C++中为我们提供了一个新的函数来进行初始化————构造函数
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象,
即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数
,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。
`
在C++中,我们将不给出实参的构造函数统称为默认构造函数
在C++中,我们可以这样来使用默认构造函数
例如
class Date
{
private:
int _year;
int _month;
int _day;
public:
Date()
{
_year = 2023;
_month = 12;
_day = 31;
}
void Display();
};
在上面的代码中,Date()就是对我们的默认构造函数,它的作用是初始化我们的_year等对象。
另外,在当我们忘记写显示构造函数的时候,编译器会自动默认给我们写上一个无参的构造函数(默认构造函数),但是编译器给我们的是一个不含任何语句的默认构造函数,所以,如果我们需要在默认构造函数内进行赋值,就必须手动写默认构造函数。另外,如果我们写了显示构造函数的话,编译器就不会帮我们自动添加默认构造函数了
和函数一样,构造函数也分为了含参和不含参。
例如
Date(int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}
这个Date就是一个含参的构造函数,但是需要注意,在默认构造函数中,我们可以不添加参数,但是当我们一旦添加了含参的构造函数以后,我们就需要在定义对象的时候添加参数。这里同样可以通过缺省参数的方式来自己添加需要传的参数,可以部分缺省,也可以全缺省。
Date(int year=2023,int month=1,int day=1)
{
_year = year;
_month = month;
_day = day;
}
构造函数同样也支持函数重载(函数名需要保持一致,但是参数类型和顺序必须不一致)。
Date(int year=2023,int month=1,int day=1)
{
_year = year;
_month = month;
_day = day;
}
Date(long long year=2023,int month=12,long long day=31
{
_year=year;
_month=month;
_day=day;
}
析构函数的作用和构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)。
我们在定义析构函数的时候要在函数名前面加上‘~”,并且和构造函数相同,析构函数也没有参数、返回值和类型。
class stack
{
private:
int top;
int* a;
int capacity;
public:
stack(int n);
void pushstack(int *p,int x);
~stack();
~stack()就是一个析构函数。
在我们写类和对象时,如果没有添加析构函数,编译器就会默认给我们添加一个析构函数-默认析构函数,但是他和默认构造函数不同,默认构造可以进行操作,而默认析构函数什么也不会做。
当我们需要对空间资源进行开辟的时候,我们需要写一个析构函数来对我们所开辟的空间进行资源释放。另外,如果我们不需要申请资源,我们也可以选择不写析构函数,但是如果有申请就必须写上,不然会造成资源的浪费或泄露。
构造函数和析构函数的调用顺序为:
先构造的后析构,后构造的先析构 |
class DateTime
{
public:
DateTime()
{
cout << "DateTime()" << endl;
}
~DateTime()
{
cout << "~DateTime()" << endl;
_hours = 0;
_minutes = 0;
_seconds = 0;
}
private:
int _hours;
int _minutes;
int _seconds;
};
class Date
{
private:
int _year = 2023;
int _month = 12;
int _day = 31;
// 自定义类型
DateTime dt;
};
int main()
{
Date d1;
Date d2;
return 0;
}
一般来说,如果在全局范围定义对象,那么它的构造函数在本文件模块中的所有函数执行之前调用,如果一个程序包含多个文件,那么它的构造函数的调用顺序是不确定的,当main函数结束或者调用exit结束程序时,调用析构函数!
如果定义局部对象,那么定义时自动调用构造函数。函数调用结束时,自动调用析构函数!
以上就是关于构造函数和析构函数的内容,今年的最后一片博客了!各位佬们麻烦支持一波,顺着评论回访🌹🌹🌹