💖💖💖欢迎来到我的博客,我是anmory💖💖💖
又和大家见面了
欢迎来到C++探索系列
作为一个程序员你不能不掌握的知识
先来自我推荐一波
个人网站欢迎访问以及捐款
推荐阅读
如何低成本搭建个人网站
专栏:动画详解leetcode算法题
C语言知识
构造函数
构造函数是特殊的成员函数,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使⽤的局部对象是栈帧创建时,空间就开好了),⽽是对象实例化时初始化对象。
例如,当我们对函数没有传任何参数或者参数没有全部都传过去时,就会调用默认构造函数
请看以下代码
#include <iostream>
using namespace std;
class Date
{
public:
// 无参的默认构造函数
// 当没有这个默认构造函数的时候,调用系统的默认构造函数,没有初始化
Date()
{
_year = 1;
_month = 1;
_day = 1;
}
void Print()
{
cout << _year << "/" << _month << "/" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;// 调用默认构造函数
d1.Print();
return 0;
}
那么,这里面哪个是默认构造函数呢?
Date()
{
_year = 1;
_month = 1;
_day = 1;
}
这个就是默认构造函数了,当我们没有传递任何参数时,编译器会自动调用这个函数,为年月日赋值
那么,构造函数具有以下特点
- 函数名必须和类名相同
- 无参数构造函数,带参构造函数,全缺省构造函数都叫默认构造函数
- 没有返回值
- 可以重载
下面,我们来看看其他更多的构造函数吧
// 带参的默认构造函数
Date(int year,int month,int day)
{
_year = year;
_month = month;
_day = day;
}
// 带参的全缺省默认构造函数
Date(int year = 2024,int month = 7, int day = 18)
{
_year = year;
_month = month;
_day = day;
}
析构函数
析构函数与构造函数功能相反,析构函数不是完成对对象本⾝的销毁,⽐如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了,不需要我们管,C++规定对象在销毁时会⾃动调⽤析构函数,完成对象中资源的清理释放⼯作。析构函数的功能类⽐我们之前Stack实现的Destroy功能,⽽像Date没有Destroy,其实就是没有资源需要释放,所以严格说Date是不需要析构函数的
那么,我们用一个栈来举例,用两个栈来实现队列
#include<iostream>
using namespace std;
typedef int STDataType;
class Stack
{
public:
Stack(int n = 4)
{
_a = (STDataType*)malloc(sizeof(STDataType) * n);
if (nullptr == _a)
{
perror("malloc申请空间失败");
return;
}
_capacity = n;
_top = 0;
}
~Stack()
{
cout << "~Stack()" << endl;
free(_a);
_a = nullptr;
_top = _capacity = 0;
}
private:
STDataType* _a;
size_t _capacity;
size_t _top;
};
// 两个Stack实现队列
class MyQueue
{
public:
//编译器默认⽣成MyQueue的析构函数调⽤了Stack的析构,释放的Stack内部的资源
// 显⽰写析构,也会⾃动调⽤Stack的析构
/*~MyQueue()
{}*/
private:
Stack pushst;
Stack popst;
};
int main()
{
Stack st;
MyQueue mq;
return 0;
}
在这个程序中,
MyQueue
调用完成后,就会调用析构函数,来销毁栈
析构函数的特点:
- 在类名之前加上
~
- 无参数,无返回值
- 对象生命周期结束时,会自动调用析构函数
- 不写析构函数可能会造成内存泄漏
结语
💖💖💖非常感谢各位的支持💖💖💖
我们共同进步
本系列持续更新,关注我,带你了解更多C++知识
下期再见