C++类和动态内存分配

目录

1. C++类的基本概念与使用

2. 动态内存分配与指针

3. 类与动态内存分配的结合应用

4. 注意事项与最佳实践

5.一个简单的示例代码


 

在C++编程中,类是一种重要的概念,它允许我们将数据和操作封装在一起,以实现更加模块化和可维护的代码。而动态内存分配则提供了在程序运行时动态创建和释放内存的能力,使我们能够更灵活地管理内存资源。本文将探讨C++类与动态内存分配的相关知识,并介绍如何在实际编程中正确使用它们。

1. C++类的基本概念与使用

类是C++中的一种用户定义类型,它可以包含数据成员和成员函数。通过类,我们可以将相关的数据和操作封装在一起,形成一个独立的实体。以下是一个简单的示例:

class Student {
private:
    int id;
    string name;
public:
    void setId(int studentId) {
        id = studentId;
    }
    void setName(string studentName) {
        name = studentName;
    }
    void display() {
        cout << "Student ID: " << id << endl;
        cout << "Student Name: " << name << endl;
    }
};

在上面的示例中,我们定义了一个名为Student的类,它有两个私有数据成员id和name,以及三个公有成员函数setId、setName和display。通过这些成员函数,我们可以设置和获取学生的ID和姓名,并展示学生的信息。

要使用类,我们需要先创建类的对象。例如:

Student s;
s.setId(123);
s.setName("John Doe");
s.display();

上述代码中,我们首先创建了一个名为s的Student对象,然后通过成员函数setId和setName设置对象的属性值,最后调用display函数来显示学生的信息。

2. 动态内存分配与指针

动态内存分配是指在程序运行时根据需要动态地申请和释放内存空间,以支持灵活的内存管理。在C++中,我们可以使用关键字new来进行动态内存分配,而关键字delete则用于释放已分配的内存。下面是一个示例:

int* p = new int; // 分配一个整型变量的内存空间
*p = 123; // 设置变量的值
cout << *p << endl; // 输出变量的值
delete p; // 释放内存空间

在上述代码中,我们首先使用new运算符动态地分配了一个整型变量的内存空间,并将其地址保存在指针变量p中。然后,我们通过解引用操作符*来访问该内存空间,并对其进行赋值操作。最后,通过delete运算符释放了该内存空间,以防止内存泄漏。

3. 类与动态内存分配的结合应用

类和动态内存分配可以结合使用,以实现更灵活的内存管理和对象的动态创建。例如,在类中使用动态内存分配可以避免对象大小固定的限制,并允许根据需要创建多个对象。以下是一个示例:

class Array {
private:
    int* data;
    int size;
public:
    Array(int arraySize) {
        size = arraySize;
        data = new int[size];
    }
    ~Array() {
        delete[] data;
    }
};

在上述代码中,我们定义了一个名为Array的类,它有两个成员变量data和size。构造函数Array(int arraySize)使用动态内存分配创建了一个大小为arraySize的整型数组,并将其地址保存在data指针中。析构函数~Array()则通过delete[]运算符释放了该数组的内存空间,以免造成内存泄漏。

通过使用类和动态内存分配,我们可以在程序运行时根据需要创建多个Array对象,每个对象拥有不同大小的数组。

4. 注意事项与最佳实践

在使用类和动态内存分配时,我们需要注意以下几点:

  • 在类中使用动态内存分配时,务必在析构函数中释放已分配的内存,以防止内存泄漏。
  • 在使用动态内存分配时,要确保在不需要使用该内存时及时释放,以避免内存泄漏和资源浪费。
  • 对于动态分配的内存空间,要注意处理异常情况,确保在出现异常时能正确释放已分配的内存。
  • 在设计类的时候,要合理地管理和使用动态内存分配,避免过度依赖动态内存,以确保程序的可维护性和性能。

总结: C++类与动态内存分配是面向对象编程中的重要概念,通过合理运用它们,我们可以写出更加模块化、可维护和灵活的代码。在使用类和动态内存分配时,我们需要注意正确释放内存、处理异常情况,并合理管理内存资源。通过深入理解和灵活运用C++类与动态内存分配,我们可以提高程序的效率和可靠性,实现更复杂的功能和需求。

5.一个简单的示例代码

实现了图书管理系统中的添加图书和查询图书功能,并使用了C++类和动态内存分配:

#include <iostream>
#include <string>
using namespace std;

// 定义Book类
class Book {
private:
    int id;
    string name;
    string author;
    string press;
    string isbn;
    double price;
public:
    // 构造函数
    Book(int bookId, string bookName, string bookAuthor, string bookPress, string bookIsbn, double bookPrice) {
        id = bookId;
        name = bookName;
        author = bookAuthor;
        press = bookPress;
        isbn = bookIsbn;
        price = bookPrice;
    }
    // 获取图书ID
    int getId() const {
        return id;
    }
    // 获取图书名称
    string getName() const {
        return name;
    }
    // 获取图书作者
    string getAuthor() const {
        return author;
    }
    // 获取图书出版社
    string getPress() const {
        return press;
    }
    // 获取图书ISBN号
    string getIsbn() const {
        return isbn;
    }
    // 获取图书价格
    double getPrice() const {
        return price;
    }
};

// 定义BookList类
class BookList {
private:
    Book** books;  // 二级指针
    int size;
public:
    // 构造函数
    BookList() {
        books = new Book*[10];  // 动态分配10个Book指针的内存空间
        size = 0;
    }
    // 添加图书
    void add(Book* book) {
        books[size++] = book;
    }
    // 查询图书
    Book* search(string keyword) const {
        for (int i = 0; i < size; i++) {
            if (books[i]->getName() == keyword || books[i]->getAuthor() == keyword || books[i]->getIsbn() == keyword) {
                return books[i];
            }
        }
        return nullptr;
    }
};

// 主函数
int main() {
    // 创建BookList对象
    BookList bookList;

    // 添加图书
    Book* book1 = new Book(1, "C++ Primer", "Stanley Lippman", "Addison-Wesley Professional", "978-0321714114", 89.99);
    bookList.add(book1);
    Book* book2 = new Book(2, "Effective C++", "Scott Meyers", "Addison-Wesley Professional", "978-0321334879", 54.99);
    bookList.add(book2);

    // 查询图书
    string keyword;
    cout << "请输入要查询的图书名称、作者或ISBN号:";
    cin >> keyword;
    Book* result = bookList.search(keyword);
    if (result != nullptr) {
        cout << "查询结果:" << endl;
        cout << "图书ID:" << result->getId() << endl;
        cout << "图书名称:" << result->getName() << endl;
        cout << "图书作者:" << result->getAuthor() << endl;
        cout << "图书出版社:" << result->getPress() << endl;
        cout << "图书ISBN号:" << result->getIsbn() << endl;
        cout << "图书价格:" << result->getPrice() << endl;
    } else {
        cout << "未找到符合条件的图书。" << endl;
    }

    // 释放内存
    delete book1;
    delete book2;

    return 0;
}

在上述代码中,我们定义了一个Book类来表示图书信息,包括ID、名称、作者、出版社、ISBN号和价格等属性。我们还定义了一个BookList类来表示图书列表,包含添加和查询图书的功能。在BookList类中,我们使用了二级指针books来动态分配内存空间,并使用add函数向列表中添加图书,使用search函数来查询符合条件的图书。在主函数中,我们创建了BookList对象,并添加了两本图书,然后根据关键字查询图书,最后释放了动态分配的内存空间。

需要注意的是,在程序中使用动态内存分配时,我们需要确保在不需要使用该内存时及时释放,以避免内存泄漏和资源浪费。在上述代码中,我们使用了delete运算符来释放动态分配的内存空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/304021.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

运用AI翻译漫画(二)

构建代码 构建这个PC桌面应用&#xff0c;我们需要几个步骤&#xff1a; 在得到第一次的显示结果后&#xff0c;经过测试&#xff0c;有很大可能会根据结果再对界面进行调整&#xff0c;实际上也是一个局部的软件工程中的迭代开发。 界面设计 启动Visual Studio 2017, 创建…

数据结构与算法 - 线性表

文章目录 第1关&#xff1a;实现一个顺序存储的线性表第2关&#xff1a;实现一个链接存储的线性表 第1关&#xff1a;实现一个顺序存储的线性表 编程要求 本关任务是实现 step1/Seqlist.cpp 中的SL_InsAt、SL_DelAt和SL_DelValue三个操作函数&#xff0c;以实现线性表中数据的…

[答疑]领域特定语言DSL属于伪创新吗(谷爱凌)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 Zeyu 2024-1-4 9:20 马丁福勒的领域特定语言DSL是否有阅读的价值&#xff1f;属于伪创新吗&#xff1f; UMLChina潘加宇 这个问题就有点伪创新 &#xff0c;让人误以为DSL是Fowler发…

本地部署Canal笔记-实现MySQL与ElasticSearch7数据同步

背景 本地搭建canal实现mysql数据到es的简单的数据同步&#xff0c;仅供学习参考 建议首先熟悉一下canal同步方式&#xff1a;https://github.com/alibaba/canal/wiki 前提条件 本地搭建MySQL数据库本地搭建ElasticSearch本地搭建canal-server本地搭建canal-adapter 操作步骤…

shp与数据库(插入数据)

前言 正文 geopandas与shp文件创建表和录入数据 解释一下上面的代码 查询cd2表的geometry字段 查看一下表 前一篇博客的冲突 问题的解决 POLYGON与MUTLIPOLYGON的说明 解决问题的代码 修改表的创建 shapefile和sqlalchemy插入数据 数据库查询 最后 前言 前一篇讲解…

与AI合作 -- 写一个modern c++单例工厂

目录 前言 提问 bard给出的答案 AI答案的问题 要求bard改进 人类智能 AI VS 人类 前言 通过本文读者可以学到modern C单例模式工厂模式的混合体&#xff0c;同时也能看到&#xff1a;如今AI发展到了怎样的智能程度&#xff1f;怎样让AI帮助我们快速完成实现头脑中的想法&…

【hcie-cloud】【17】华为云Stack灾备服务介绍【灾备方案概述、备份解决方案介绍】【上】

文章目录 前言灾备方案概述灾备的定义灾备的重要性故障和灾难对业务连续性带来的挑战灾备系统的衡量指标RTO与RPO分析 灾备等级标准数据中心容灾解决方案全景图云灾备服务总结架构华为云Stack灾备服务总览 备份解决方案介绍云备份服务介绍备份服务架构介绍云备份服务组件功能介…

界面原型设计工具有哪些?看看这9个

界面原型设计是现代设计师必备的技能之一。在设计数字产品或应用程序时&#xff0c;界面原型是将概念转化为具体可交互界面的重要步骤。对于新手小白来说&#xff0c;选择一款易于上手且功能强大的界面原型设计工具至关重要。本文将介绍 9 个常用的界面原型设计工具&#xff0c…

计算机体系结构动态调度(计分板及Tomasulo)学习记录

1.动态调度核心思想&#xff1a;允许就绪指令越过前方停顿指令&#xff0c;提前进入运行&#xff08;乱序执行&#xff09; 就绪指令指不存在资源冲突、操作数已就绪的指令&#xff0c;例如&#xff0c;计分板算法使用计分板来实现&#xff0c;Tomasulo使用保留站来实现&#…

苹果电脑交互式原型设计软件Axure RP 9 mac特色介绍

Axure RP 9 for Mac是一款交互式原型设计软件&#xff0c;使用axure rp9以最佳的方式展示您的作品&#xff0c;优化现代浏览器并为现代工作流程设计。同时确保您的解决方案正确完整地构建。Axure RP 9 for Mac为您整理笔记&#xff0c;将其分配给UI元素&#xff0c;并合并屏幕注…

swing快速入门(三十九)进度对话框

&#x1f381;注释很详细&#xff0c;直接上代码 上一篇 &#x1f9e7;新增内容 &#x1f9e8;1.模拟耗时操作 &#x1f9e8;2.使用计时器更新进度对话框 &#x1f380;源码&#xff1a; package swing31_40;import javax.swing.*; import java.awt.event.ActionEvent; import …

【debug】为什么ansible中使用command出错

碎碎念 在使用ansible执行command的时候&#xff0c;遇到执行会出错的command 比如执行source打算读取环境变量的时候 错误提示为&#xff1a; 没有那个文件或目录:source 一开始以为是错误提示有问题&#xff0c;一直在testrc的路径上检查&#xff0c;但是同样一行命令使用…

C++八股学习心得.8

1.const知道吗&#xff1f;解释其作用 const 修饰类的成员变量&#xff0c;表示成员常量&#xff0c;不能被修改。 const修饰函数承诺在本函数内部不会修改类内的数据成员&#xff0c;不会调用其它非 const 成员函数。 如果 const 构成函数重载&#xff0c;const 对象只能调…

聊聊 Java 集合框架中的 ArrayList

其实 Java 集合框架也叫做容器&#xff0c;主要由两大接口派生而来&#xff0c;一个是 collection,主要存放对象的集合。另外一个是Map, 存储着键值对&#xff08;两个对象&#xff09;的映射表。 下面就来说说 List接口&#xff0c;List存储的元素是有序、可重复的。其下有三个…

配置git服务器

第一步&#xff1a; jdk环境配置 &#xff08;1&#xff09;搜索【高级系统设置】&#xff0c;选择【高级】选项卡&#xff0c;点【环境变量】 &#xff08;2&#xff09;在【系统变量】里面&#xff0c;点击【新建】 &#xff08;3&#xff09;添加JAVA_HOME环境变量JAVA_HO…

展台搭建的基本要求

一、选址及总平面布置 展厅人流量大&#xff0c;对选址和总平面布置的要求如下:展厅选址应位于市内或郊区交通便利的区域。大型展览馆应有足够的群众活动广场和停车面积 &#xff0c;并应有室外陈列场地。室外场地要考虑环境的绿化和美化。各功能分区之间联系方便又互不干扰。建…

实现LCM在docker之间的通信

目录 1.docker容器互联 新建网络 连接容器 2.设置环境变量 3.在两个docker之间实现通信 1.docker容器互联 新建网络 $ docker network create -d bridge test-net 连接容器 运行一个容器并连接到新建的 test-net 网络: $ docker run -itd --name lcm_1 --network tes…

极智项目 | 实战Paddle戴口罩检测

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多项目分享 大家好&#xff0c;我是极智视界&#xff0c;本文来介绍 实战 Paddle 戴口罩检测项目。 本文介绍的 实战 Paddle 戴口罩检测项目&#xff0c;提供完整的可以一键执行的项目工程源码&#xff0c;获取方式有两个…

AI红娘开启约会新时代;网易云音乐Agent实践探索;微软生成式AI课程要点笔记;ComfyUI新手教程;图解RAG进阶技术 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f440; Perplexity 官宣 7360 万美元B轮融资&#xff0c;打造世界上最快最准确的答案平台 https://blog.perplexity.ai/blog/perplexity-rais…

yyds,4 个 Pandas 必备神器!

Pandas是我们日常处理表格数据最常用的包&#xff0c;但是对于数据分析来说&#xff0c;Pandas的DataFrame还不够直观。 今天我们将介绍4个和Pandas相关的Python包&#xff0c;可以将Pandas的DataFrame转换交互式表格&#xff0c;让我们可以直接在上面进行数据分析的操作。 P…