C++面向对象-构造函数与析构函数
2022/9/7 1:41:37
本文主要是介绍C++面向对象-构造函数与析构函数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
以OOP实现一个顺序栈为例, 介绍构造函数与析构函数
#include <iostream> #include <iterator> using namespace std; /* 构造函数和析构函数 函数的名字和类名一样,没有返回值 */ class SeqStack { public: //构造函数有参数,可重载 SeqStack(int size = 10) { cout << this << " SeqStack()" << endl; _pstack = new int[size]; _top = -1; _size = size; } // void init(int size = 10) { // _pstack = new int[size]; // _top = -1; // _size = size; // } //析构函数不带参数,只能有一个,可手动调用释放堆内存 ~SeqStack() { cout << this << " ~SeqStack()" << endl; delete[] _pstack; _pstack = nullptr; } // void release() { // delete[] _pstack; // _pstack = nullptr; // } void push(int val) { if (full()) resize(); _pstack[++_top] = val; } void pop() { if (empty()) return; --_top; } int top() { return _pstack[_top]; } bool empty() { return _top == -1; } bool full() { return _top == _size - 1; } void resize() { int* ptmp = new int[_size * 2]; for (int i = 0; i < _size; ++i) { ptmp[i] = _pstack[i]; } delete[] _pstack; _pstack = ptmp; _size += 2; } private: int* _pstack; // 动态开辟数组,存储顺序栈的元素 int _top; //指向栈顶元素的位置 int _size; //数组扩容总大小 }; int main() { // 1. 开辟内存 // 2. 调用构造函数 SeqStack s; // s.init(5); //对象成员变量的初始化 for (int i = 0; i < 15; ++i) { s.push(rand() % 100); } while (!s.empty()) { cout << s.top() << " "; s.pop(); } cout << endl; // s.release(); //释放对象成员变量占用的外部堆内存(外部资源) //出作用域,对象自动进行析构 SeqStack s1(50); //堆上的一定要手动释放 SeqStack* ps = new SeqStack(60); ps->push(70); ps->push(80); ps->pop(); cout << ps->top() << endl; delete ps; //先调用ps->~SeqStack() 然后free(ps) // 先构造的后析构,后构造的先析构 // 开始运行... // 0x7fff9908e2d8 SeqStack() // 63 59 90 27 62 21 49 92 86 35 93 15 77 86 83 // 0x7fff9908e2b0 SeqStack() // 0x527510 SeqStack() // 70 // 0x527510 ~SeqStack() // 0x7fff9908e2b0 ~SeqStack() // 0x7fff9908e2d8 ~SeqStack() // 运行结束。 return 0; }
这篇关于C++面向对象-构造函数与析构函数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享