首页 > 编程语言 >C++面向对象-构造函数与析构函数

C++面向对象-构造函数与析构函数

时间:2022-09-06 07:44:30浏览次数:65  
标签:ps SeqStack 函数 与析构 cout 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;
}

标签:ps,SeqStack,函数,与析构,cout,C++,构造函数
From: https://www.cnblogs.com/anqwjoe/p/16660346.html

相关文章

  • C++数据结构课程设计
    C++数据结构课程设计《数据结构》课程设计指导书一、课程设计的目的课程设计为学生提供了一个独立实践的机会,将课本上的理论知识和实际问题结合起来,锻炼学生分析、解决......
  • C++11~C++20 新基础类型
    目录整数类型longlong(C++11)字符类型char16_t和char32_t(C++11)C++11为什么要引入char16_t和char32_t?字符类型char8_t(C++20)参考资料整数类型longlong(C++11)C++1......
  • C++基础入门:C++初始
    1.C++环境:Clion搭建下载链接:clion官方网址1.1点击下载1.2下载对应版本1.3安装步骤:1.3.1下载完毕后,打开exe文件,进入安装界面,点击【Next>】1.3.2选择安装目录......
  • 如何高效解决 C++内存问题,Apache Doris 实践之路|技术解析
    导读:ApacheDoris使用C++语言实现了执行引擎,C++开发过程中,影响开发效率的一个重要因素是指针的使用,包括非法访问、泄露、强制类型转换等。本文将会通过对Sanitizer......
  • leetcode 6356 最长回文子串长度,最长回文子串 C/C++ 动态规划方案 同样的用例,测试执
    对dp变量需要执行初始化,否者LeetCode会出现同样的用例,单独执行可以通过,提交代码执行不通过的情况。 下面是找最长回文串的动态规划代码。class Solution {public:......
  • 青少年C++编程CSP/NOIP
    C++基础篇C++算法篇数据结构&算法深入信息学竞赛初赛篇信息学竞赛复赛篇信息学等级考试篇C++提高篇https://study.163.com/series/1202896601.htm?inLoc=android_ss_ssjg&u......
  • Qt-C2429:语言功能"嵌套命名空间定义"需要编译器标志"/std:c++latest"
     问题现象:今天早上在给同事讲代码时,打开工程,发现之前可以编译的工程,在未修改代码,未修改SDK的情况下,无法编译。并且提示如下:C2429:语言功能"嵌套命名空间定义"需要编译器......
  • 9.构造函数和析构函数
    文章内容构造函数和析构函数的由来?构造函数和析构函数的基本语法C++编译器构造析构方案PK对象显示初始化方案构造函数的分类以及调用默认的构造函数构造函数调用......
  • C++中#ifdef和#endif的用法
    一般情况下,源程序中所有的代码都会参与编译。但有时希望对其中一部分内容只在满足一定条件时才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。条件编......
  • Source Insight导入C++标准库符号
    1、对GNUC++头文件一般放在/user/include目录下。本环境是在/usr/include/c++/9目录下,其它环境类似。2、拷贝此目录到本地,用于创建工程。3、打开SourceInsight,以此目录......