10构造函数与析构函数

构造函数和析构函数

#include<iostream>
using namespace std;

class seqStack {
private:
	int* _pstack;
	int _size;
	int _top;

public:
	seqStack(int size) {
		_size = size;
		_pstack = new int[size];
		_top = -1;
	}
	~seqStack() {
		delete[]_pstack;
		_pstack = nullptr;
	}
	int full() {
		return _top == _size - 1;
	}
	void resize() {
		int* newstack = new int[2 * _size];
		for (int i = 0; i < _size; i++) {
			newstack[i] = _pstack[i];
			//这里要慎用memcpy和realloc,参考深拷贝与浅拷贝
		}
		_pstack = newstack;
		_size *= 2;
	}
	int empty() {
		return _top == -1;
	}
	void push(int val) {
		if (full()) {
			resize();
		}
		_pstack[++_top] = val;
	}
	void pop() {
		if (empty()) {
			return;
		}
		cout << _pstack[_top--] << endl;
	}
};

int main() {
	seqStack st(4);
	for (int i = 0; i < 10; i++) {
		st.push(rand() % 100);
	}
	cout << sizeof(st) <<endl;
	while (!st.empty()) {
		st.pop();
	}
    //st是栈上的对象。离开作用域(本函数),析构自动调用。
	return 0;
}
  • 构造函数可以带参,可以重载。
  • 析构函数不带参数,只能有一个。
  • 构造和析构类似入栈和出栈,先构造后析构,后构造先析构。
  • 堆上的类对象,不会在程序结束后自动释放,需要手动释放。因此一定要手动调用析构函数
int main() {
	seqStack* st = new seqStack(4);
	for (int i = 0; i < 10; i++) {
		st->push(rand() % 100);
	}
	cout << sizeof(st) <<endl;
	while (!st->empty()) {
		st->op();
	}
    delete st;
    //st是栈上的指针对象,但它指向的堆上的对象会一直占据空间。
	return 0;
}
  • 栈上初始化一个类对象,两步:开内存,调用构造函数。
  • 堆上new一个类对象,两步:malloc申请一段空间,调用构造函数。
  • free和delete都用来释放堆上申请的空间,它们在释放类对象的区别是什么?delete释放类对象是两步:
    • 调用此类的析构函数。
    • free类对象的指针。
posted @   SIo_2  阅读(7)  评论(0)    收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 独立项目运营一周年经验分享
· 一款开源免费、通用的 WPF 主题控件包
· 神解释:为什么程序员怕改需求?
· 【定时任务核心】究竟是谁在负责盯着时间,并在恰当时机触发任务?
· 独立开发,这条路可行吗?
点击右上角即可分享
微信分享提示