【C++STL】新手也能会:string 模拟实现保姆级指南!

构造函数

代码语言:javascript

AI代码解释

//无参的默认构造 string::string() :_str(new char[1]{'\0'}) ,_size(0) ,_capacity(0) {} //带参的构造 string::string(const char* str) :_size(strlen(str)) //,_size(strlen(str)) //,_capacity(strlen(str)) { cout << "构造" << endl; _capacity = _size; _str = new char[_size+1];//开跟str一样大的空间 还要加1 给\0预留空间 memcpy(_str, str, _size+1); }

带参的构造中有一个细节:不要使用三个strlen 因为strlen效率不高。因为初始化列表有一个按照声明顺序初始化的逻辑,所以初始化列表与声明顺序是有关联关系的,如果实在不好在初始化列表初始化那就在函数体内部初始化。

1.2析构函数

代码语言:javascript

AI代码解释

//析构函数 string::~string() { delete[] _str; _str = nullptr; _size = 0; _capacity = 0; }
1.3拷贝构造

代码语言:javascript

AI代码解释

//拷贝构造 string::string(const string& s) { //开辟新空间 _str = new char[s._capacity+1]; //拷贝旧数据 memcpy(_str, s._str, s._size+1); _size = s._size; _capacity = s._capacity; }

拷贝构造要注意开辟空间和拷贝数据的时候一定不要忘记给\0预留一个空间,因为**string**内部的**_size(有效数据个数)**它指向的是最后一个数据的下一个位置的数据也就是**\0**,而且字符串一般以**\0**作为结束的标识符。

1.4赋值重载

代码语言:javascript

AI代码解释

string& string::operator=(string& s) { //防止给自己赋值 if (this != &s) { //开新空间拷贝旧数据 char* tmp = new char[s._size + 1]; memcpy(tmp, s._str, s._size + 1); delete[] _str; _str = tmp; _size = s._size; _capacity = s._capacity; } return *this; }

对于拷贝构造和赋值重载还有一些现代写法,现代写法相比于传统的写法更加简洁。内部的逻辑其实就是调用std里面的swap交换底层的成员变量来实现的,如果想了解请点击:

1.5再探深浅拷贝问题

之前在类和对象时我们说过如果一个有资源的类我们在没有显示写拷贝构造和赋值重载的时候,使用编译器默认生成的拷贝构造那么完成的就是浅拷贝:

www.dongchedi.com/article/7592326493200482841
www.dongchedi.com/article/7592329049750995481
www.dongchedi.com/article/7592327070701961753
www.dongchedi.com/article/7592322906135413273
www.dongchedi.com/article/7592308231180026392
www.dongchedi.com/article/7592331190716498457
www.dongchedi.com/article/7592320610865676825
www.dongchedi.com/article/7592326493201007129
www.dongchedi.com/article/7592322714795688510
www.dongchedi.com/article/7592327392942178841
www.dongchedi.com/article/7592319617927283225
www.dongchedi.com/article/7592327476282638873
www.dongchedi.com/article/7592319094112846360
www.dongchedi.com/article/7592326854393152025
www.dongchedi.com/article/7592319386741244441
www.dongchedi.com/article/7592321316729504281
www.dongchedi.com/article/7592319724022039102
www.dongchedi.com/article/7592327140348379672
www.dongchedi.com/article/7592319412238418457
www.dongchedi.com/article/7592319724022137406
www.dongchedi.com/article/7592319070578917950
www.dongchedi.com/article/7592317677180486168
www.dongchedi.com/article/7592331430680953368
www.dongchedi.com/article/7592317943112057368
www.dongchedi.com/article/7592312482736685593
www.dongchedi.com/article/7592326787452011070
www.dongchedi.com/article/7592320171805934142
www.dongchedi.com/article/7592312175293891097
www.dongchedi.com/article/7592326095602221593
www.dongchedi.com/article/7592313460353466942
www.dongchedi.com/article/7592315921234985497
www.dongchedi.com/article/7592318584517493310
www.dongchedi.com/article/7592313903104164377
www.dongchedi.com/article/7592314981853905432
www.dongchedi.com/article/7592327419139654169
www.dongchedi.com/article/7592312482736620057
www.dongchedi.com/article/7592327392941589017
www.dongchedi.com/article/7592313382368297497
www.dongchedi.com/article/7592317900531548734
www.dongchedi.com/article/7592315372943327769
www.dongchedi.com/article/7592311873639432729
www.dongchedi.com/article/7592316979160121918
www.dongchedi.com/article/7592312719127511577
www.dongchedi.com/article/7592316786557616664
www.dongchedi.com/article/7592327116290032153
www.dongchedi.com/article/7592326416835002904
www.dongchedi.com/article/7592313347400270360

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

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

相关文章

ISNet红外小目标检测:突破形状感知技术边界

ISNet红外小目标检测&#xff1a;突破形状感知技术边界 【免费下载链接】ISNet CVPR2022 ISNet: Shape Matters for Infrared Small Target Detection 项目地址: https://gitcode.com/gh_mirrors/is/ISNet 红外小目标检测技术在军事侦察、安防监控、工业检测等领域具有重…

全面掌握GLM数学库:从入门到精通实战指南

全面掌握GLM数学库&#xff1a;从入门到精通实战指南 【免费下载链接】glm OpenGL Mathematics (GLM) 项目地址: https://gitcode.com/gh_mirrors/gl/glm GLM&#xff08;OpenGL Mathematics&#xff09;是一个专为图形软件设计的C数学库&#xff0c;它完美遵循OpenGL着…

【C++STL】一文掌握 String 核心接口:从基础到实用!

&#xff0c;STL简介1.1 什么是STL&#xff1f;STL的概念&#xff1a;STL&#xff08;Standard Template Library&#xff09;是C标准库的核心组成部分&#xff0c;提供了一套通用的模板类和函数&#xff0c;用于实现常见的数据结构和算法。1.2 STL的六大组件STL的六大组件是它…

OpenSCAD从入门到精通:程序员必备的3D建模完全指南

OpenSCAD从入门到精通&#xff1a;程序员必备的3D建模完全指南 【免费下载链接】openscad OpenSCAD - The Programmers Solid 3D CAD Modeller 项目地址: https://gitcode.com/gh_mirrors/op/openscad 在数字化设计日益普及的今天&#xff0c;3D建模已成为众多领域不可…

如何通过ms-swift实现会议纪要自动生成?

如何通过 ms-swift 实现会议纪要自动生成&#xff1f; 在现代企业中&#xff0c;一场跨部门战略会议可能持续数小时&#xff0c;产生上万字的语音转写文本。会后&#xff0c;助理需要花费近半天时间整理重点议题、决策项和待办任务——这不仅耗时&#xff0c;还容易遗漏关键信息…

【C++】如何搞定 C++ 内存管理?

一&#xff0c;C/C的内存分布1.1C/C内存分布在C语言阶段学习的时候&#xff0c;总会有一些问题就是我们写过的各种各样的代码&#xff0c;局部变量&#xff0c;全局变量&#xff0c;静态变量等它们到底是存在哪的呢&#xff1f;相信有很多人在学C/C的时候会有这些疑问&#xff…

如何快速安装rEFInd主题美化:终极极简风格配置指南

如何快速安装rEFInd主题美化&#xff1a;终极极简风格配置指南 【免费下载链接】refind-theme-regular 项目地址: https://gitcode.com/gh_mirrors/ref/refind-theme-regular rEFInd主题美化是提升系统启动界面视觉效果的重要方式&#xff0c;通过极简风格设计能够实现…

ChronoEdit-14B:物理推理AI图像编辑黑科技

ChronoEdit-14B&#xff1a;物理推理AI图像编辑黑科技 【免费下载链接】ChronoEdit-14B-Diffusers 项目地址: https://ai.gitcode.com/hf_mirrors/nvidia/ChronoEdit-14B-Diffusers 导语 NVIDIA最新发布的ChronoEdit-14B模型&#xff0c;通过突破性的时间推理能力&…

ms-swift支持语言学习口语对话练习

ms-swift赋能语言学习&#xff1a;打造智能口语对话教练 在AI技术席卷各行各业的今天&#xff0c;教育领域正经历一场静默而深刻的变革。尤其是语言学习——这个长期依赖“背单词练听力外教课”的传统模式&#xff0c;正在被大模型驱动的智能系统重新定义。想象这样一个场景&am…

5个关键步骤实现Grok-2大语言模型本地化部署

5个关键步骤实现Grok-2大语言模型本地化部署 【免费下载链接】grok-2 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/grok-2 想要在本地环境中运行强大的Grok-2大语言模型吗&#xff1f;通过HuggingFace生态系统&#xff0c;您可以轻松实现这一目标。本文将带您…

使用ms-swift进行银行信贷风险建模

使用 ms-swift 构建智能信贷风控系统&#xff1a;从技术选型到生产落地 在银行风控一线工作的工程师都知道&#xff0c;一个贷款申请背后可能藏着几千字的客户描述、多页征信报告摘要、通话录音转写文本&#xff0c;甚至还有上传的工资流水截图。如何高效理解这些复杂信息&…

【C++】C++类和对象—(中)

前言&#xff1a;在上一篇类和对象(上)的文章中我们已经带领大家认识了类的概念&#xff0c;定义以及对类和对象的一些基本操作&#xff0c;接下来我们要逐步进入到类和对象(中)的学习。我们将逐步的介绍类和对象的核心——类和对象的六个默认成员函数。(注意&#xff1a;这六个…

IBM Granite-4.0:23万亿token的多语言代码神器

IBM Granite-4.0&#xff1a;23万亿token的多语言代码神器 【免费下载链接】granite-4.0-h-small-base 项目地址: https://ai.gitcode.com/hf_mirrors/unsloth/granite-4.0-h-small-base 导语 IBM最新发布的Granite-4.0-H-Small-Base模型以23万亿token的训练规模和多语…

使用ms-swift进行短视频内容审核模型训练

使用 ms-swift 构建短视频内容审核系统&#xff1a;从模型训练到生产落地 在抖音、快手、TikTok 等平台日均处理数十亿条视频的今天&#xff0c;内容安全早已不是“人工关键词过滤”能应对的挑战。一个用户上传的15秒短视频&#xff0c;可能包含衣着暴露的画面、隐喻低俗的文案…

【C++】类和对象—(下) 收官之战

前言&#xff1a;上一篇文章我们向大家介绍了类和对象的核心六个成员函数中的4个&#xff0c;其余两个以及初始化列表&#xff0c;static成员&#xff0c;内部类&#xff0c;匿名对象等会在本篇文章介绍&#xff01;一&#xff0c;运算符重载1.1什么是运算符重载&#xff1f;类…

Keil5 IDE搭建从零实现——适合初学者的实践教程

从零搭建Keil5开发环境&#xff1a;手把手带你点亮第一颗LED 你是不是也曾在搜索“keil5安装教程”时&#xff0c;被一堆碎片化、步骤跳跃甚至版本过时的内容搞得一头雾水&#xff1f;下载失败、激活卡顿、编译报错……明明只是想写个简单的GPIO控制程序&#xff0c;却在环境搭…

Lance数据库终极指南:如何实现100倍性能提升的向量检索

Lance数据库终极指南&#xff1a;如何实现100倍性能提升的向量检索 【免费下载链接】lance lancedb/lance: 一个基于 Go 的分布式数据库管理系统&#xff0c;用于管理大量结构化数据。适合用于需要存储和管理大量结构化数据的项目&#xff0c;可以实现高性能、高可用性的数据库…

Keil MDK入门要点:时钟配置向导使用教程

Keil MDK实战入门&#xff1a;手把手教你用好时钟配置向导你有没有遇到过这样的情况&#xff1f;刚写完UART初始化代码&#xff0c;串口却输出一堆乱码&#xff1b;或者接上USB设备&#xff0c;电脑死活识别不了。排查半天&#xff0c;最后发现——原来是系统时钟没配对&#x…

终极视频画质革命:本地AI让模糊影像重获新生

终极视频画质革命&#xff1a;本地AI让模糊影像重获新生 【免费下载链接】SeedVR-7B 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/SeedVR-7B 还在为那些珍贵的家庭录像画质模糊而遗憾吗&#xff1f;那些记录着重要时刻的视频&#xff0c;因为年代久远…

【C++】类和对象——(上)

前言&#xff1a;结束了C入门的学习紧接着就步入到了C类和对象的学习&#xff0c;类和对象比C入门更具有挑战性&#xff0c;类和对象相比C语言就像是进入了一个完全不同的世界&#xff0c;让我们一起探索一下c类和对象的奥妙。一&#xff0c;类1.1类的概念C 中的类&#xff08;…