当前位置: 首页 > news >正文

C++20练习代码

一.类的定义练习)(类的基本操作)

1.1String类定义

完成了String类的基本操作的定义,并进行检验。其中有些注意点:

1.显示类型转换static_cast<>();

2.NRVO:

具名返回值优化编译器会直接消除掉 result 这个局部变量的存在感,直接在外部调用者接收返回值的地方构造对象。零拷贝,零额外的析构,效率极高。 这在 C++17 中甚至被写入了语言标准(强制 RVO),保证一定不会发生拷贝。

3.strlen(char*)、strcpy(char*,char*)//赋值第二个字符串到第一个字符串中、strcmp(char*,char*)//一一比较两个字符串的每个字符的ASCII码

strcat(char*,char*)//追加第二个字符串到第一个字符串后面。

4.stong_ordering::(less\greater\equal)重载函数<=>时使用非常标准。

5.new,delete;new[],delete[];malloc,free成对使用绝不可混搭。

6.noexcept 指明函数绝不会返回报错

7.std::move()用作移动语义

#define _CRT_SECURE_NO_WARNINGS #include<cstring> #include<iostream> #include<compare> class String { public: //默认构造函数 String() { size = 0; ch = new char[1]; ch[0] = '0'; } //赋值构造函数 String(const char* c) { if (c) { size = static_cast<int>(std::strlen(c)); ch = new char[size+1]; std::strcpy(ch, c); } else { size = 0; ch = new char[1]; ch[0] = '\0'; } } String(const String& c)//拷贝构造函数 { size = c.size; ch = new char[size + 1]; std::strcpy(ch, c.ch); } //移动构造函数 String(String&&s)noexcept//告诉编译器这个过程绝不会抛出异常 { ch = s.ch; size = s.size; std::cout << "调用了移动构造\n"; s.ch = nullptr; s.size = 0; } ~String() { delete[] ch;//析构数组 } //拷贝赋值运算符 String& operator=(const String& s) { if (this != &s) {//两阶段解析机制,但这里是两个指针在进行比较。 delete[] ch; size = s.size; std::strcpy(ch, s.ch); } return *this; } //移动赋值运算符 String& operator=(String&& s) noexcept { if (this != &s) { delete[]ch; ch = s.ch; size = s.size; std::cout << "调用了移动构造\n"; s.ch = nullptr; s.size = 0; } return *this; } String& operator=(const char* s) { if (s) { delete[] ch; size = static_cast<int>(std::strlen(s)); ch = new char[size + 1]; std::strcpy(ch, s); } return *this; } //+重载 String operator+(const char* c) { String result;//默认构造函数 if (c) { result.size = this->size + static_cast<int>(std::strlen(c)); delete[] result.ch; result.ch = new char[result.size + 1]; std::strcpy(result.ch, this->ch); std::strcat(result.ch, c);//追加 } else { result = *this; } return result;//NRVO(具名返回值优化编译器会直接消除掉 result 这个局部变量的存在感,直接在外部调用者接收返回值的地方构造对象。零拷贝,零额外的析构,效率极高。 这在 C++17 中甚至被写入了语言标准(强制 RVO),保证一定不会发生拷贝。) } //重载两个String类相加 String operator+(const String& s)const { String result; result.size = size + s.size; delete[] result.ch; result.ch = new char[result.size + 1]; std::strcpy(result.ch, ch); std::strcat(result.ch, s.ch); return result; } //实现将一个String类与一个C风格字符串相加 std::strong_ordering operator<=>(const String& S) const { int cmp = std::strcmp(this->ch, S.ch);//将字符一个个比较 if (cmp < 0) { return std::strong_ordering::less; } if (cmp > 0) { return std::strong_ordering::greater; } return std::strong_ordering::equal; } bool operator==(const String& S) const { return std::strcmp(this->ch, S.ch) == 0; } //返回底层C风格字符串 const char* c_str()const { return ch; } //返回字符串长度 int length()const { return size; } private: int size; char* ch; }; int main() { String s1; String s2{ "Hello" }; String s3{ s2 }; s1 = "World"; String s4 = s2 + "C++"; String s5 = { "Good " }; String s6 = { "morning" }; String s7 = s5 + s6; String s8{ "keepworking" }; String s9 = std::move(s8);//移动构造 String s10{ "realword" }; s8 = std::move(s10); std::cout << "s2:" << s2.c_str() << std::endl; std::cout << "s1:" << s1.c_str() << std::endl; std::cout << "s4:" << s4.c_str() << std::endl; std::cout << "s7:" << s7.c_str() << std::endl; std::cout << "s9:" << s9.c_str() << std::endl; std::cout << "s8:" << s8.c_str() << std::endl; if ((s2 <=> s1) == std::strong_ordering::less) { std::cout << s2.c_str() << "is less than" << s1.c_str() << std::endl; } return 0; }

1.2.Vector类

二.类的继承及多态练习

三.模板练习

3.1类模板

3.2模板函数

3.3模板对象(lambda)

3.4模板变量

3.5别名

3.6编译时if(if constexpr)

四.类型转换练习

五.错误处理练习

六.

http://www.jsqmd.com/news/757051/

相关文章:

  • Julia高性能数据转换引擎Kaimon.jl:声明式映射与编译期优化实践
  • 2026 新闻发布平台权威测评:十大主流渠道实力排名与企业选型指南 - 博客湾
  • 7个步骤掌握ComfyUI-Manager:彻底告别节点管理烦恼
  • 魔兽争霸3卡顿问题终结者:WarcraftHelper让你的经典游戏重获新生
  • 2026 耳机推荐|六款蓝牙耳机全场景实测横评(通勤 / 运动 / 办公 / 游戏) - GrowthUME
  • 如何快速使用IronyModManager:Paradox游戏模组管理的完整指南
  • 从‘屎山’到‘新大陆’:一线架构师教你如何评估并落地遗留系统的四种演化路径
  • Tiled地图编辑器完全指南:三步打造专业级2D游戏地图
  • Windows Defender终极控制:开源工具defender-control技术深度解析与完全指南
  • 利用AI自动生成Git提交信息:commitgpt工具详解与实践指南
  • AI模型源代码泄露事件剖析:技术验证、法律风险与开发者防护指南
  • 实用指南:使用XUnity.AutoTranslator轻松实现Unity游戏实时翻译
  • 2026年3月浙江艺术技校推荐,艺术技校有哪些优选实力品牌 - 品牌推荐师
  • 实测Taotoken多模型路由在高峰时段的延迟与稳定性表现
  • 智能图像检索技术:PhotoBench系统解析与应用
  • RandOpt随机优化算法:原理、实现与性能对比
  • 实战演练:基于快马平台生成yolo智慧教室学生行为分析系统
  • 10分钟完成Ghidra逆向分析环境的专业部署指南
  • 【MySQL】JDBC编程
  • 2026 网络媒体发稿渠道权威测评TOP5:企业全域增长选型指南 - 博客湾
  • Browserbase Skills
  • FigmaCN中文汉化插件:让Figma界面秒变中文的终极解决方案
  • 体验 Taotoken 按 token 计费模式带来的精细化成本控制感受
  • 2026年无锡市封装打包胶带厂家直供热线,品质保证等你来询 - GrowthUME
  • 自感作为新自由主义的微观界面——岐金兰论“感受”如何成为治理术的最后疆域
  • 用Markdown构建结构化个人技能知识库:从原理到实践
  • 网盘直链下载助手终极教程:5分钟掌握浏览器下载网盘文件的完整方法
  • Windows Defender终极控制指南:开源工具defender-control完全解析
  • 跨平台B站客户端wiliwili:5个实用技巧让您在不同设备上畅享高清视频体验
  • OpenIM Server 企业级离线部署实战指南:从零构建安全内网即时通讯系统