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函数后及时释放内存,以保证程序的正确性和性能。

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

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

相关文章

使用lwip的perf进行测速TCP不稳定的一些相关配置项

在使用lwIP的perf工具进行TCP性能测试时&#xff0c;TCP不稳定可能涉及以下配置问题&#xff1a; 缓冲区大小&#xff08;Buffer Size&#xff09;&#xff1a;lwIP中的TCP性能受到发送和接收缓冲区大小的影响。如果缓冲区过小&#xff0c;可能导致数据包丢失或延迟增加&#x…

《BackTrader量化交易图解》第8章:plot 绘制金融图

文章目录 8. plot 绘制金融图8.1 金融分析曲线8.2 多曲线金融指标8.3 Observers 观测子模块8.4 plot 绘图函数的常用参数8.5 买卖点符号和色彩风格8.6 vol 成交参数8.7 多图拼接模式8.8 绘制 HA 平均 K 线图 8. plot 绘制金融图 8.1 金融分析曲线 BackTrader内置的plot绘图函…

Hibernate实战之操作MySQL数据库(2024-1-8)

Hibernate实战之操作MySQL数据库 2024.1.8 前提环境&#xff08;JavaMySQLNavicatVS Code&#xff09;1、Hibernate简介1.1 了解HQL 2、MySQL数据库建表2.1 编写SQL脚本2.2 MySQL执行脚本 3、Java操作MySQL实例&#xff08;Hibernate&#xff09;3.1 准备依赖的第三方jar包3.2 …

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

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

大数据StarRocks(六) :Catalog

StarRocks 自 2.3 版本起支持 Catalog&#xff08;数据目录&#xff09;功能&#xff0c;实现在一套系统内同时维护内、外部数据&#xff0c;方便您轻松访问并查询存储在各类外部源的数据。 1. 基本概念 内部数据&#xff1a;指保存在 StarRocks 中的数据。 外部数据&#xf…

用css给宽高不固定的矩形画对角线

.kong{width: 200rpx;height: 76rpx;background: linear-gradient(to bottom right, #E5E5E5 0%, rgba(0, 0, 0, 0.1) calc(50% - 1px),#175CFF 50%, rgba(0, 0, 0, 0.1) calc(50% 1px),rgba(0, 0, 0, 0.1) 100%);}参考&#xff1a; https://blog.csdn.net/weixin_38779534/a…

1.1map

unordered_map和map的使用几乎是一致的&#xff0c;只是头文件和定义不同 #include<iostream> #include<map>//使用map需要的头文件 #include<unordered_map>//使用unordered_map需要的头文件 #include<set>//使用set需要的头文件 #include<uno…

web前端(html)练习

第一题 1. 用户名为文本框&#xff0c;名称为 UserName&#xff0c;长度为 15&#xff0c;最大字符数为 20。 2. 密码为密码框&#xff0c;名称为 UserPass&#xff0c;长度为 15&#xff0c;最大字符数为 20。 3. 性别为两个单选按钮&#xff0c;名称为 sex&#xff0c;值分…

【linux】tcpdump 使用

tcpdump 是一个强大的网络分析工具&#xff0c;可以在 UNIX 和类 UNIX 系统上使用&#xff0c;用于捕获和分析网络流量。它允许用户截取和显示发送或接收过网络的 TCP/IP 和其他数据包。 一、安装 tcpdump 通常是默认安装在大多数 Linux 发行版中的。如果未安装&#xff0c;可…

使用lwip的perf进行测速TCP会有较多的duplicate ack的原因分析

在使用lwIP的perf工具进行TCP测速时&#xff0c;出现较多的重复确认&#xff08;duplicate ACK&#xff09;可能是由于以下原因导致的&#xff1a; 丢包或乱序&#xff1a;重复确认通常是由于网络中的数据包丢失或乱序到达引起的。当接收方收到一个乱序的数据包时&#xff0c;它…

imazing破解版百度云2.17.3(附激活许可证下载)

iMazing是一款强大的 iOS 设备管理软件&#xff0c;不管是 iPhone、iPad 或 iPod Touch 设备&#xff0c;只要将 iOS 设备连接到计算机&#xff0c;就可以处理不同类型的数据。 iPhone 和 iPad 备份 借助 iMazing 的独有 iOS 备份技术&#xff08;无线、隐私和自动&#xff09…

系列十三、查询数据库中某个库、表、索引等所占空间的大小

一、information_schema数据库 1.1、概述 information_schema数据库是MySQL出厂默认带的一个数据库&#xff0c;不管我们是在Linux中安装MySQL还是在Windows中安装MySQL&#xff0c;安装好后都会有一个数据库information_schema&#xff0c;这个库中存放了其他库的所有信息。 …

【UE Niagara学习笔记】02 - 制作燃烧的火焰

目录 效果 步骤 一、添加资产 二、制作材质 三、制作粒子 3.1 循环播放 3.2 粒子生成的数量 3.3 粒子的生命周期和初始大小 3.4 火焰高度 3.5 火焰范围 3.6 火焰颜色 效果 步骤 一、添加资产 1. 在虚幻商城中搜索“M5 VFX Vol2. Fire and Flames(Niagara)”…

网络协议与攻击模拟_01winshark工具简介

一、TCP/IP协议簇 网络接口层&#xff08;没有特定的协议&#xff09; 物理层&#xff1a;PPPOE宽带拨号&#xff08;应用场景&#xff1a;宽带拨号&#xff0c;运营商切网过来没有固定IP就需要拨号&#xff0c;家庭带宽一般都采用的是拨号方式&#xff09;数据链路层网络层…

kettle的基本介绍和使用

1、 kettle概述 1.1 什么是kettle Kettle是一款开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;绿色无需安装&#xff0c;数据抽取高效稳定。 1.2 Kettle核心知识点 1.2.1 Kettle工程存储方式 以XML形式存储以资源库方式存储…

【React源码 - Fiber架构之Reconciler】

前言 React16架构可以分为三层也是最核心的三个功能分别是&#xff1a; Scheduler&#xff08;调度器&#xff09;—调度任务的优先级&#xff0c;高优任务优先进入Reconciler(16新增)Reconciler&#xff08;协调器&#xff09;—负责找出变化的组件Renderer&#xff08;渲染…

Android readelf 工具查找函数符号

ELF&#xff08;Executable and Linkable Format&#xff09;是一种执行文件和可链接文件的格式。它是一种通用的二进制文件格式&#xff0c;用于在各种操作系统中存储可执行程序、共享库和内核模块。 Android 开发当中的 so 库本质上就是一种特殊类型的 ELF 文件&#xff0c;…

crash分析ramdump

我们需要在PC机上运行crash,从源码来编译, 可以从Redhat社区下载源码。 解压后&#xff0c;进入目录后使用一下命令&#xff1a; make targetarm64 make install这样就安装好了crash了。 crash介绍 crash主要是用来离线分析linux内核内存转存文件&#xff0c;它整合了gdb…

计算机基础面试题 |17.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

e2studio开发三轴加速度计LIS2DW12(1)----轮询获取加速度数据

e2studio开发三轴加速度计LIS2DW12.1--轮询获取加速度数据 概述视频教学样品申请源码下载通信模式管脚定义IIC通信模式速率新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原…