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

news2024/9/21 0:43:18

目录

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.coloradmin.cn/o/1369923.html

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

相关文章

大数据毕业设计:图书推荐系统+可视化+Django框架 图书管理系统 (附源码+论文)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

Vue3插件开发教程:步步指导如何编写Vue3插件

关注⬆️⬆️⬆️⬆️ 专栏后期更新更多前端内容 文章目录 Vue3 插件插件注册形式插件主要的场景使用插件Vue3 插件 插件 (Plugins) 是一种能为 Vue 添加全局功能的工具代码。 插件注册形式 一个插件可以是一个拥有 install() 方法的对象,也可以直接是一个安装函数本身。 i…

数 据 分 析 1

1.使用Wireshark查看并分析靶机桌面下的capture.pcapng数据包文件&#xff0c;找到黑客的IP地址&#xff0c;并将黑客的IP地址作为Flag值&#xff08;如&#xff1a;172.16.1.1&#xff09;提交&#xff1b;172.16.1.41 查找&#xff1a;tcp.connection.syn 2.继续分析captu…

SpringBoot 如何增强PageHelper入参的健壮性

PageHelper.startPage(int pageNum, int pageSize, boolean count) 参数为外部输入&#xff0c;故存在异常输入场景。比如 pageNum 和 pageSize 输入的值 负数 或者 0&#xff0c;所以引入PageUtils来对入参进行判断矫正&#xff0c;从而避免引入异常。 第1步&#xff1a;支持…

Windows无线网络分析报告

概述信息 客户现场有一套大屏展示系统&#xff0c;它是通过戴尔小主机、无线网络、电视机的方式来工作。大屏展示的内容非常实时&#xff0c;对于内容的刷新也比较高。客户反馈最近经常会出现网络抖动的情况&#xff0c;但远程检查又无法发现问题点。 此时&#xff0c;Window…

mysql基础-常用函数汇总

目录 1. 查询技巧 2. 时间函数 2.1 now() 2.2 current_date() 2.3 时间差timestampdiff&#xff08;&#xff09;与datediff&#xff08;&#xff09; 2.4 其他时间函数 3. 字符函数 3.1 截取函数 3.2 分割函数 3.3 left与right函数 3.4 其他函数 4. 数字函数 5. …

Python进阶之元类

Python进阶之元类 目录 什么是元类&#xff1f; 元类的调用流程 根据类自定义元类 __new__方法以及参数 ----------cls ----------name ----------bases ----------attrs __call__方法 生成对象的完整代码 什么是元类&#xff1f; 在python面向对象中&#xff0c;我们知道所有…

Redis:原理速成+项目实战——Redis实战5(互斥锁、逻辑过期解决缓存击穿问题)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战4&#xff08;解决Redis缓存穿透、雪崩、击穿&#xff09; &#x1f4da;订阅专…

web左侧伸缩菜单栏/导航栏

效果展示&#xff1a; 百度网盘链接下载全部资源&#xff1a; http://链接&#xff1a;https://pan.baidu.com/s/1ZnKdWxTH49JhqZ7Xd-cJIA?pwd4332 提取码&#xff1a;4332 html/JQuery代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head&g…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷②

2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷2 目录 需要竞赛软件包环境以及备赛资源可私信博主&#xff01;&#xff01;&#xff01; 2023年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项赛卷2 模块一 …

Spring MVC自定义类型转换器!!!

使用场景 在index.jsp里面添加日期类型 <form action"account/saveAccount" method"post">账户名称&#xff1a;<input type"text" name"name"><br/>账户金额&#xff1a;<input type"text" name&quo…

TCP的这些特性你知道吗?(滑动窗口篇)

如果每次 [发送方] 需要等待接受方返回数据才能发送下一条数据&#xff0c;会导致网络通信的效率非常的低&#xff0c;于是在TCP中 引入了窗口这个概念&#xff0c;即使在往返时间较长的情况下&#xff0c;它也不会降低网络通信的效率。有了窗口&#xff0c;并不代表可以无限 接…

windows rtmp发送数据流程抓包

一、connect 返回Window Acknowledgement Size&#xff1a; 返回Set Peer Bandwidth 二、 releaseStream 三、 FCPublish 四、 createStream 五、 _checkbw 六、 FCPublish返回 七、createStream 八、 _checkbw返回 九、发送关键帧 十、发送视频帧 十一、FCUnpublish 十二、del…

【Verilog】运算符

系列文章 数值&#xff08;整数&#xff0c;实数&#xff0c;字符串&#xff09;与数据类型&#xff08;wire、reg、mem、parameter&#xff09; 系列文章算术运算符关系运算符相等关系运算符逻辑运算符按位运算符归约运算符移位运算符条件运算符连接和复制运算符 算术运算符 …

生成模型 | 2024年新年新论文:audio2photoreal[正在更新中]

本博客主要包含了20240103新出的论文From Audio to Photoreal Embodiment: Synthesizing Humans in Conversations论文解释及项目实现~ 论文题目&#xff1a;20240103_From Audio to Photoreal Embodiment: Synthesizing Humans in Conversations 论文地址&#xff1a;2401.018…

Python2048小游戏核心算法(python系列26)

前言&#xff1a;做核心算法之前我们可以玩一玩这个小游戏来了解一下规则。2048在线试玩 运行效果&#xff1a; 代码案例&#xff1a; # 2048小游戏# 1.将列表中零移动到列表的末尾 def move_zeroes():x 0for i in range(len(list_nums)):if list_nums[i] ! 0:list_nums[x],…

python 基础笔记

基本数据类型 函数 lamda 匿名函数 成员方法 类 类与对象 构造方法 魔术方法 私有成员 私有方法 继承 注解 变量注解 函数注解 Union类型 多态 参考链接&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了_哔哩哔哩_bilib…

小测一下HCL中VSR的转发性能

正文共&#xff1a;555 字 10 图&#xff0c;预估阅读时间&#xff1a;1 分钟 上次我们在HCL中导入了NFV的自定义镜像&#xff08;如何在最新版的HCL 5.10.0中导入NFV镜像&#xff1f;&#xff09;&#xff0c;但是当时没有测试转发性能&#xff0c;最近HCL又更新了V5.10.1版本…

用golang 实现给图片添加文字水印

package mainimport ("fmt""github.com/golang/freetype""image""image/draw""image/jpeg""io""os""time" )func main() {// 打开原始图片file, err : os.Open("004.jpeg")if err …

[Vulnhub靶机] DriftingBlues: 5

[Vulnhub靶机] DriftingBlues: 5靶机渗透思路及方法&#xff08;个人分享&#xff09; 靶机下载地址&#xff1a; https://download.vulnhub.com/driftingblues/driftingblues5_vh.ova 靶机地址&#xff1a;192.168.67.24 攻击机地址&#xff1a;192.168.67.3 一、信息收集 …