类默认成员函数 - 析构函数

析构函数与构造函数就是功能截然相反的两个函数了,析构函数就是将对象内部的资源进行清理(如malloc开辟的等)

值得注意的是  -- 很多人误以为析构函数是销毁对象 ---对象的销毁工作是由编译器完成的

我们现在说说析构函数的有那些特性  -----1.还是重析构函数的名

 1.析构的函数名是在类名前加~   ——如下代码

class Data
{
public:
	//构造函数
	Data(int year=2022, int month = 2, int day = 5)
	{
		_year = year;
	    _month = month;
	    _day = day;
	}

	//析构函数
	~Data()
	{
		cout << "~Data()" << endl;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Data D1(2023, 1, 9);

	return 0;
}

2.无参数无返回值(构造函数是无返回值)

3.对象声明周期结束是,C++编译系统自动调用析构函数

class Stack
{
private:
	int* _a;
	size_t _top;
	size_t _capacity;
public:
	Stack(int capacity = 4)
	{
		_a = (int*)malloc(sizeof(int) * capacity);
		if (_a == nullptr)
		{
			cout << "malloc fail" << endl;
			exit(-1);
		}
		_capacity = capacity;
		_top = 0;
	}

	//析构函数
	~Stack()
	{
		free(_a);
		_a = nullptr;
		_top = _capacity = 0;
	}

};

int main()
{
	//自动调用构造函数
	Stack s1;
	Stack s2(20);

	return 0;
}

用上面代码验证第三点 --- 在return 0 处按f11分析跳进了`~Stack析构函数

 并且一旦对象声明周期结束  -- 直接将s1和s2的内部资源进行清理

出前

 出后

 4.一个类只有析构函数,若显示未定义,相同会自动生成默认的析构函数

只有一个析构函数是因为析构函数不能重构(必须无参)

如果我们不写析构函数,编译器会自动默认生成析构函数  和  构造函数类似
对于内置成员类型不做处理
对于自定义类型会去调用它的析构函数

那么编译器默认生成的析构函数和构造函数就没有用了嘛   -->   其实是有很大作用的  (如在用两个栈实现队列)

class Stack
{
private:
	int* _a;
	size_t _top;
	size_t _capacity;
public:
	Stack(int capacity = 4)
	{
		_a = (int*)malloc(sizeof(int) * capacity);
		if (_a == nullptr)
		{
			cout << "malloc fail" << endl;
			exit(-1);
		}
		_capacity = capacity;
		_top = 0;
	}
};

class MyQueue {
public:
	void push(int x) {

	}

	int pop() {

	}

	int peek() {

	}

	bool empty() {

	}

private:
	//自定义类型  --- 自动调用他们的构造函数(进行初始化) 
	//对象内资源销毁时自动调用析构函数
	Stack Push1;
	Stack Pop;
};



int main()
{
	//我们没有在MyQueue定义构造函数和析构函数
	//我们可以直接使用默认的析构函数和默认的构造函数对Push1和Pop进行清理和初始化
	MyQueue q1;

	return 0;
}

这样在我们实现两个栈时,不需要对Push栈和[Pop栈进行分别的初始化和销毁了--更方便了

这里就是我们默认析构函数和构造函数作用一个最直接的体现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值