C++ string 类从原理到实战
一、引言在 C 编程中string是处理字符串的核心类相较于 C 风格字符数组它自动管理内存、提供丰富操作接口极大提升了开发效率与代码安全性。本文将从深浅拷贝原理、string底层模拟实现、标准库string常用函数详解、迭代器与容器实战、字符串数字相加案例等维度全面梳理string类的核心知识形成从原理到实战的完整体系。二、浅拷贝与深拷贝的基本概念2.1 浅拷贝浅拷贝仅复制对象成员变量的值若成员包含指针仅拷贝指针地址使多个对象指向同一块内存。问题对象析构时同一块内存会被重复释放导致程序崩溃或悬空指针。本质位拷贝只拷贝指针不拷贝指向的数据。2.2 深拷贝深拷贝会为指针成员重新分配独立内存并复制原数据使每个对象拥有专属内存空间互不干扰。优势避免内存重复释放、数据篡改等问题是string类的默认拷贝机制。本质重新开辟内存 数据拷贝。三、C 中 string 类的默认行为C 标准库std::string的拷贝构造函数、赋值运算符均实现深拷贝修改一个对象不会影响另一个#include iostream #include string using namespace std; int main() { string original Hello, World!; string copy1(original); // 拷贝构造深拷贝 string copy2 original; // 赋值运算符深拷贝 copy1[0] h; // 修改copy1original、copy2不受影响 cout original endl; // Hello, World! cout copy1 endl; // hello, World! cout copy2 endl; // Hello, World! return 0; }四、自定义字符串类 MyString 实现深浅拷贝 核心功能4.1 基础框架构造、析构、深浅拷贝#include iostream #include cstring #include assert.h using namespace std; class MyString { private: char* _str; size_t _size; size_t _capacity; public: // 构造函数 MyString(const char* str ) { if (str nullptr) str ; _size strlen(str); _capacity _size; _str new char[_capacity 1]; strcpy(_str, str); } // 拷贝构造深拷贝 MyString(const MyString other) { _size other._size; _capacity other._capacity; _str new char[_capacity 1]; memcpy(_str, other._str, _size 1); } // 赋值运算符现代写法 MyString operator(MyString tmp) { swap(tmp); return *this; } // 移动赋值C11转移资源 MyString operator(MyString other) noexcept { if (this ! other) { delete[] _str; _str other._str; _size other._size; _capacity other._capacity; other._str nullptr; } return *this; } // 析构函数 ~MyString() { delete[] _str; _str nullptr; _size _capacity 0; } // 交换成员 void swap(MyString s) { std::swap(_str, s._str); std::swap(_size, s._size); std::swap(_capacity, s._capacity); } };4.2 比较运算符重载 !基于strcmp实现字典序比较bool operator(const MyString other) const { return strcmp(_str, other._str) 0; } bool operator(const MyString other) const { return strcmp(_str, other._str) 0; } bool operator(const MyString other) const { return !(*this other); } bool operator(const MyString other) const { return !(*this other); } bool operator(const MyString other) const { return strcmp(_str, other._str) 0; } bool operator!(const MyString other) const { return !(*this other); }4.3 resize 函数实现调整字符串长度支持缩小、扩大与填充字符void resize(size_t new_size, char fill_char \0) { if (new_size _size) { _size new_size; _str[_size] \0; } else { reserve(new_size); for (size_t i _size; i new_size; i) { _str[i] fill_char; } _size new_size; _str[_size] \0; } } // 预留容量 void reserve(size_t n) { if (n _capacity) { char* new_str new char[n 1]; strcpy(new_str, _str); delete[] _str; _str new_str; _capacity n; } }4.4 运算符重载字符串拼接支持MyString MyString、MyString const char*MyString operator(const MyString other) const { size_t new_size _size other._size; char* new_data new char[new_size 1]; strcpy(new_data, _str); strcat(new_data, other._str); MyString res(new_data); delete[] new_data; return res; } MyString operator(const char* str) const { size_t len strlen(str); size_t new_size _size len; char* new_data new char[new_size 1]; strcpy(new_data, _str); strcat(new_data, str); MyString res(new_data); delete[] new_data; return res; }4.5 迭代器实现简单模拟string迭代器本质是字符指针typedef char* iterator; typedef const char* const_iterator; iterator begin() { return _str; } iterator end() { return _str _size; } const_iterator begin() const { return _str; } const_iterator end() const { return _str _size; }五、标准库 string 常用函数详解5.1 初始化方式string s0; // 空字符串 string s1(hello); // 字面量初始化 string s2 s1; // 拷贝初始化 string s3(5, a); // 重复字符aaaaa5.2 容量与长度size()/length()返回字符串长度功能完全一致capacity()返回已分配内存容量reserve(n)预分配容量减少扩容shrink_to_fit()释放多余内存使容量等于长度clear()清空字符串内容不释放内存5.3 字符串操作拼接、append()查找find()、rfind()、find_first_of()未找到返回string::npos子串substr(pos, len)省略len取到末尾替换replace(pos, len, str)插入 / 删除insert()、erase()效率低少用字符访问[]不检查越界、at()越界抛异常5.4 数值与字符串转换数值→字符串to_string()C11标准通用字符串→整数atoi()C 风格、stoi()C11抛异常通用转换stringstream跨平台、支持任意类型5.5 输入输出cin以空格 / 换行分隔无法读取带空格字符串getline(cin, str)读取整行包含空格需处理前导换行符cin.ignore(); // 清空缓冲区换行 getline(cin, str);六、迭代器与容器配合6.1 string 遍历方式下标遍历for (size_t i 0; i s.size(); i) cout s[i];迭代器遍历string::iterator it s.begin(); while (it ! s.end()) cout *it;反向迭代器string::reverse_iterator rit s.rbegin(); while (rit ! s.rend()) cout *rit;范围 for 循环简洁推荐for (auto ch : s) cout ch;6.2 STL 算法配合需包含algorithmreverse(s.begin(), s.end()); // 反转 sort(s.begin(), s.end()); // 排序七、实战案例字符串数字相加处理超大数字超出整型范围模拟手工加法#include iostream #include string #include algorithm using namespace std; string addStrings(string num1, string num2) { int i num1.size() - 1, j num2.size() - 1; string res; int carry 0; while (i 0 || j 0 || carry) { int val1 i 0 ? num1[i--] - 0 : 0; int val2 j 0 ? num2[j--] - 0 : 0; int sum val1 val2 carry; carry sum / 10; res.push_back(sum % 10 0); } reverse(res.begin(), res.end()); return res; } // 测试 int main() { cout addStrings(123456789, 987654321) endl; // 1111111110 return 0; }八、总结深浅拷贝浅拷贝共享内存易崩溃深拷贝独立内存更安全string默认深拷贝。自定义string需实现构造、析构、拷贝构造、赋值运算符重载常用运算符与迭代器。标准string接口丰富优先使用、reserve优化性能注意find、substr边界。迭代器是 STL 容器通用访问方式配合算法可高效操作字符串。实战字符串数字相加核心为逆序逐位相加 处理进位 反转结果适用于超大数运算。本文覆盖string原理、实现、使用、实战全流程是 C 字符串编程的核心参考资料。

相关新闻

URL (Uniform Resource Locator) 深度全景指南

URL (Uniform Resource Locator) 深度全景指南

1. 核心概念与历史背景1.1 定义与地位URL (Uniform Resource Locator),即统一资源定位符,是 URI (Uniform Resource Identifier) 的一个子集。URI:用于唯一标识一个资源(是什么)。URL:不仅标识资源&#xf…

2026/7/7 4:11:22 阅读更多 →
java工具:《获取指定日期的第二天同一时间》

java工具:《获取指定日期的第二天同一时间》

文章目录一、介绍二、代码一、介绍 这段代码定义了一个名为 getTSpecifyDateBegin 的静态方法,其核心功能是获取指定日期第二天的同一时刻。 方法逻辑解析: 接收参数:该方法接收一个 Date 类型的参数 date,作为基准日期。时间偏…

2026/7/3 9:07:40 阅读更多 →
【理财类-01-01】20260607“微信”货币基金(每天没有生成0.01元利息的)的词频统计

【理财类-01-01】20260607“微信”货币基金(每天没有生成0.01元利息的)的词频统计

背景需求为了最大化利用资金,我在微信的腾讯理财通里买“活期”的48只货币基金,每只150元,预估每天能获得1分钱利息。但是根据往期结果,1、每天都有几只货币基金是0元(偶尔一天)2、有几只货币基金的七天年化…

2026/5/17 12:18:23 阅读更多 →

最新新闻

2026高性价比数字人平台怎么选?从预算、口型、批量出片到商用权限一次讲清(CSDN投稿优化版)

2026高性价比数字人平台怎么选?从预算、口型、批量出片到商用权限一次讲清(CSDN投稿优化版)

2026高性价比数字人平台怎么选?从预算、口型、批量出片到商用权限一次讲清(CSDN投稿优化版) 很多人在选数字人平台时,第一反应是先看价格:哪个更便宜、哪个试用门槛更低、哪个看起来“最划算”。但真正进入使用阶段以后…

2026/7/7 4:11:39 阅读更多 →
技术咨询:针对面向互联网的Fortinet设备的FortiBleed凭据曝光活动

技术咨询:针对面向互联网的Fortinet设备的FortiBleed凭据曝光活动

近期 Bitdefender Labs 发布官方安全预警:名为 FortiBleed 的大规模凭据窃取攻击活动正在全球扩散,本次风险不存在可修复系统漏洞,没有官方补丁能够彻底封堵。截至 6 月 19 日,攻击者已从 194 个国家约 86644 台独立设备中盗取管理…

2026/7/7 4:11:39 阅读更多 →
TransTac透明触觉皮肤:紫外编码+视觉触觉融合的新型力感知技术

TransTac透明触觉皮肤:紫外编码+视觉触觉融合的新型力感知技术

1. 项目概述:这不是一块普通“果冻”,而是一套能“看见”压力的透明皮肤你有没有试过把手指按在手机屏幕上,屏幕却只识别到一个点?或者机器人抓取一颗鸡蛋时,明明看着很稳,指尖一松就碎了?问题不…

2026/7/7 4:09:39 阅读更多 →
2026年量化软件选择,先按能力基础看工具

2026年量化软件选择,先按能力基础看工具

已有量化经验者谈 AI 提效时,常常会先关注 AI 能做什么,却忽略了自己正在使用什么样的软件工具。工具类型决定了策略如何表达、如何调试、如何迭代。如果这个基础没有选稳,AI 提供的帮助也不容易转化成持续效率。工具要跟着当前任务走对已有经…

2026/7/7 4:09:39 阅读更多 →
BsMax插件:3ds Max用户无缝迁移Blender的终极解决方案

BsMax插件:3ds Max用户无缝迁移Blender的终极解决方案

BsMax插件:3ds Max用户无缝迁移Blender的终极解决方案 【免费下载链接】BsMax BsMax Blender Addon (UI simulator/ Modeling/ Rigg & Animation/ Render Tools and ... 项目地址: https://gitcode.com/gh_mirrors/bs/BsMax 如果你是从3ds Max转向Blende…

2026/7/7 4:05:38 阅读更多 →
NLP 文本分类落地:数据标注质量比模型架构更重要

NLP 文本分类落地:数据标注质量比模型架构更重要

NLP 文本分类落地:数据标注质量比模型架构更重要 一、BERT 微调到 95% 准确率,上线就是不好使:谁在骗你? 你做了标准操作:选预训练模型 → 加载领域数据 → Fine-tune 三 epoch → 测试集 95%。一切都符合预期&#xf…

2026/7/7 4:03:37 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻