C++学习笔记——string类和new函数

目录

string类

1.功能增强

1.1 子字符串提取

1.2 字符串拼接

1.3 大小写转换

1.4 字符串比较

2.性能优化

3.使用示例

下面是一个简单的使用示例,展示了如何使用改进后的String类:

NEW函数

2.1NEW函数的基本用法

2.2NEW函数的注意事项

2.3避免悬空指针


string类

引言: 在C++编程中,字符串处理是一个常见且重要的任务。标准库提供了std::string类来处理字符串,但有时候我们需要更多的功能或者更高的性能。为此,我们可以自定义一个改进后的String类,通过添加额外的功能和优化性能来满足我们的需求。本文将介绍C++中改进后的String类,它具有更强大和更高效的字符串处理能力。

1.功能增强

在改进后的String类中,我们可以添加一些额外的功能,以便更方便地处理字符串。例如:

1.1 子字符串提取

我们可以添加一个函数来提取字符串中指定位置和长度的子字符串。

1.2 字符串拼接

我们可以实现字符串之间的拼接操作,方便将多个字符串合并成一个。

1.3 大小写转换

我们可以添加函数来实现字符串的大小写转换,例如将字符串全部转为大写或小写。

1.4 字符串比较

我们可以重载运算符来比较两个字符串是否相等,或者判断字符串的大小关系。

2.性能优化

除了功能增强外,我们还可以通过性能优化来提升String类的效率。

2.1 内存管理:我们可以改进内存的分配和释放策略,避免频繁的内存分配和释放操作,提高程序的性能。

2.2 字符串拷贝:我们可以优化字符串的拷贝操作,使用更高效的算法来提升性能。

2.3 字符串连接:当进行多个字符串的连接时,我们可以使用更有效的方式,避免频繁的内存分配和复制操作。

3.使用示例

下面是一个简单的使用示例,展示了如何使用改进后的String类:

  1. #include <iostream>
    #include "ImprovedString.h" // 改进后的String类的头文件int main() {ImprovedString str1("Hello");ImprovedString str2("World");// 字符串拼接ImprovedString result = str1 + " " + str2;std::cout << "拼接结果:" << result << std::endl;// 子字符串提取ImprovedString subStr = result.substr(0, 5);std::cout << "子字符串:" << subStr << std::endl;// 大小写转换ImprovedString upper = result.toUpper();ImprovedString lower = result.toLower();std::cout << "大写转换:" << upper << std::endl;std::cout << "小写转换:" << lower << std::endl;// 字符串比较if (str1 == str2) {std::cout << "str1与str2相等" << std::endl;} else if (str1 < str2) {std::cout << "str1小于str2" << std::endl;} else {std::cout << "str1大于str2" << std::endl;}return 0;
    }
    

在上述示例中,我们使用了改进后的String类来进行字符串的拼接、子字符串提取、大小写转换和字符串比较操作。通过使用这些功能,我们可以更方便地操作字符串,并且由于性能优化的存在,程序的运行效率也会得到提升。

NEW函数

在C++编程中,动态内存分配是一项重要的技术。它允许我们在程序运行时动态地分配和释放内存,而不需要提前知道需要多少内存。其中,NEW函数是C++提供的一个强大的工具,用于实现动态内存分配。本文将深入探讨NEW函数的使用方法、原理以及注意事项,帮助读者更好地理解和使用NEW函数。

2.1NEW函数的基本用法

在C++中,使用NEW函数可以动态地分配内存并返回指向该内存的指针。其基本用法如下:

int* ptr = new int;

上述代码中,NEW函数被用于分配一个整型变量的内存,并将返回的指针赋值给ptr。通过这样的方式,我们可以在程序运行时创建动态对象,而不需要提前知道对象的数量或大小。

EW函数的原理 NEW函数的原理涉及两个步骤:内存分配和对象构造。

  1.  内存分配 当调用NEW函数时,它首先会在堆内存中寻找足够大小的连续空闲内存块。如果找到了合适的内存块,就会将其标记为已占用,并返回指向该内存块的指针。如果没有足够的连续内存块,NEW函数会抛出std::bad_alloc异常。
  2. 对象构造 一旦获得了内存块,NEW函数会自动调用相应类型的构造函数来创建对象。例如,对于上述示例中的int类型,会调用int的默认构造函数来初始化该对象。

2.2NEW函数的注意事项

内存释放 使用NEW函数分配的内存必须显式释放,以避免内存泄漏。释放内存的方法是使用DELETE操作符,如下所示:

delete ptr;

数组分配 除了单个对象外,NEW函数还可以用于分配数组。数组的分配方式如下:

int* arr = new int[10];

在释放数组内存时,需要使用DELETE[]操作符,如下所示:

delete[] arr;

2.3避免悬空指针

当使用NEW函数分配内存后,要注意及时将指针赋值为nullptr或释放内存。否则,可能会导致悬空指针问题,造成内存泄漏或访问非法内存。

下面是一个简单的示例,展示了NEW函数的使用:

#include <iostream>class MyClass {
public:MyClass() {std::cout << "构造函数被调用" << std::endl;}~MyClass() {std::cout << "析构函数被调用" << std::endl;}
};int main() {MyClass* ptr = new MyClass;delete ptr;return 0;
}

在上述示例中,我们使用NEW函数动态地分配了一个MyClass对象的内存,并在程序结束前使用DELETE操作符释放了内存。通过观察输出结果,可以清楚地看到构造函数和析构函数的调用顺序。

结论: NEW函数是C++中强大且灵活的动态内存分配工具,它能够在程序运行时动态地分配和释放内存。通过合理使用NEW函数,我们可以更好地管理内存,避免内存泄漏和悬空指针问题。同时,我们也要注意在使用NEW函数后及时释放内存,以保证程序的正确性和性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

密码学:一文读懂非对称加密算法 DH、RSA

文章目录 前言非对称加密算法的由来非对称加密算法的家谱1.基于因子分解难题2.基于离散对数难题 密钥交换算法-DH密钥交换算法-DH的通信模型初始化DH算法密钥对甲方构建DH算法本地密钥乙方构建DH算法本地密钥DH算法加密消息传递 典型非对称加密算法-RSARSA的通信模型RSA特有的的…

建模软件Rhinoceros mac介绍说明

Rhinoceros mac是一款3D设计软件“犀牛”&#xff0c;在当今众多三维建模软件中&#xff0c;Rhinoceros 版因为其体积小、功能强大、对硬件要求低而广受欢迎&#xff0c;对于专业的3D设计人员来说它是一款不错的3D建模软件&#xff0c;Rhinoceros Mac中文版能轻易整合3DS MAX与…

Git命令+github仓库克隆

Git github Git常用命令 开始 git init #创建仓库 git status #查看仓库的状态 git status -s #简单的查看仓库的状态 git ls-files #查看暂存区的内容 git reflog #查看操作的历史记录 暂存区 git add git add <file&g…

网安入门11-文件上传(前后端绕过,变形马图片马)

Upload-Labs Upload-Labs是一个使用PHP语言编写、专注于文件上传漏洞的闯关式网络安全靶场。练习该靶场可以有效地了解并掌握文件上传漏洞的原理、利用方法和修复方案。 思考&#xff1a;他只让我传一个.jpg的图片&#xff0c;我想传一个.php的木马&#xff0c;两者什么区别 …

如何计算指标波动贡献率?(附Pandas实现)

大家好&#xff0c;我是阿粥 “为什么这个月销售额提升了30%&#xff1f;” “为什么转化率又降了&#xff0c;同比竟然降低了42%&#xff0c;什么原因导致的呢&#xff1f;” 这些都是数据分析师在工作中经常会遇到的问题&#xff0c;甚至有些基础岗的数据分析师要花80%以上的…

静态S5在项目管理中的应用与案例分享

静态S5作为一种强大的数据分析工具&#xff0c;不仅在数据处理和可视化方面表现出色&#xff0c;还在项目管理中发挥着重要作用。本篇将通过实际案例分享&#xff0c;探讨静态S5在项目管理中的应用与优势。 一、静态S5在项目管理中的应用 项目进度管理&#xff1a;静态S5通过…

软件测试|深入理解SQL CROSS JOIN:交叉连接

简介 在SQL查询中&#xff0c;CROSS JOIN是一种用于从两个或多个表中获取所有可能组合的连接方式。它不依赖于任何关联条件&#xff0c;而是返回两个表中的每一行与另一个表中的每一行的所有组合。CROSS JOIN可以用于生成笛卡尔积&#xff0c;它在某些情况下非常有用&#xff…

SpringBoot-自定义监听器

Spring Boot提供了强大的事件模型&#xff0c;其中包括多种内置监听器&#xff0c;同时也支持开发者自定义监听器。通过实现ApplicationListener接口&#xff0c;开发者可以创建自己的监听器&#xff0c;并在Spring Boot应用程序中进行配置。这样一来&#xff0c;在特定的应用程…

python 函数中字典的修改会影响函数外字典的值

def modify_dict(d):d[key] new valueprint(函数中字典d的位置,id(d))# 创建一个字典 original_dict {key: old value} print(函数外字典的位置,id(original_dict))# 调用函数来修改字典 modify_dict(original_dict)# 输出原始字典的值&#xff0c;可以看到它已经被修改了 pr…

一种DevOpts的实现方式:基于gitlab的CICD(二)

写在之前 前文已经搭建了基于gitlab的cicd环境&#xff0c;现在我们来更近一步&#xff0c;结合官网给出的案例来详细介绍如何一步一步实现CI的过程。 基于gitlab搭建一个前端静态页面 环境依赖&#xff1a; gitlabgitlab runner&#xff08;docker版本&#xff09; 环境达吉…

04、Kafka ------ 各个功能的作用解释(Cluster、集群、Broker、位移主题、复制因子、领导者副本、主题)

目录 启动命令&#xff1a;CMAK的用法★ 在CMAK中添加 Cluster★ 在CMAK中查看指定集群★ 在CMAK中查看 Broker★ 位移主题★ 复制因子★ 领导者副本和追随者副本★ 查看主题 启动命令&#xff1a; 1、启动 zookeeper 服务器端 小黑窗输入命令&#xff1a; zkServer 2、启动 …

【REST2SQL】06 GO 跨包接口重构代码

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 对所有关系数据的操作都只有CRUD&#xff0c;采用Go 的接口interface{}重构代码…

Large Language Models Paper 分享

论文1&#xff1a; ChatGPTs One-year Anniversary: Are Open-Source Large Language Models Catching up? 简介 2022年11月&#xff0c;OpenAI发布了ChatGPT&#xff0c;这一事件在AI社区甚至全世界引起了轰动。首次&#xff0c;一个基于应用的AI聊天机器人能够提供有帮助、…

属性动画的使用

文章目录 1 概述2 创建属性动画页面3 属性动画参数调整延时播放时间delay的设置onFinish回调函数的使用 4 关闭属性动画页面5 参考 1 概述 属性动画&#xff0c;是最为基础的动画&#xff0c;其功能强大、使用场景多&#xff0c;应用范围较广。常用于如下场景中&#xff1a; …

第九节HarmonyOS 常用基础组件12-TextTimer

1、描述 通过文本显示计时信息并控制其计时器状态的组件。 2、接口 TextTimer(options?: {isCountDown?: boolean, count?: number, controller?: TextTimerController}) 3、参数 参数名称 参数类型 必填 描述 isCountDown boolean 否 是否倒计时。默认值&#…

Kafka与RabbitMQ的区别

消息队列介绍 消息队列&#xff08;Message Queue&#xff09;是一种在分布式系统中进行异步通信的机制。它允许一个或多个生产者在发送消息时暂时将消息存储在队列中&#xff0c;然后由一个或多个消费者按顺序读取并处理这些消息。 消息队列具有以下特点&#xff1a; 异步通…

64.网游逆向分析与插件开发-游戏增加自动化助手接口-优化自动助手与游戏焦点的切换

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;自动化助手UI与游戏菜单的对接-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;617ac3477ef18273fb9cc2…

Linux文件系统与日志服务管理

目录 一.Linux文件系统 1.inode表和block &#xff08;1&#xff09;inode &#xff08;2&#xff09;block 2.查看inode号命令 3.Linux系统文件三种主要时间属性 4.磁盘空间还剩余很多但无法继续创建文件 5.inode大小 二.日志 1.日志保存位置 2.日志文件的分类 &a…

Selenium 学习(0.17)——软件测试之流程图绘制方法

病假5天&#xff0c;出去野20天&#xff0c;成功错过了慕课网上的期末考试。 害&#xff0c;都怪玩乐太开心了…… 反正咱又不指着全靠这个行当来吃饭&#xff0c;错过也就错过了&#xff0c;立的Flag能抢救一下还是要抢救一下吧。【这个其实早都会画了&#xff0c;而且基本也正…

Mac robotframework+pycharm运行suite报错情况:ImportError: No module named request

报错实例&#xff1a; 当前Preferences–>Tool–>External Tools Suite配置&#xff0c;显示使用的python为2.7版本&#xff0c;robotframework安装在当前版本的python中&#xff1a; 但是我pycharm现在的环境配置的python为3.11&#xff0c;当前使用的RF与当前使用的py…