[C++基础]构造函数和析构函数

💖💖💖欢迎来到我的博客,我是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++知识
下期再见
玉桂狗拿气球

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿梦Anmory

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值