掌 握 模 板 与 内 存 管 理,你 就 是 下 一 个 C++ 编 程 大 神!代 码 冗 余?内 存 泄 漏?不 存 在 的!

掌 握 模 板 与 内 存 管 理,你 就 是 下 一 个 C++ 编 程 大 神!代 码 冗 余?内 存 泄 漏?不 存 在 的!

掌 握 模 板 与 内 存 管 理,你 就 是 下 一 个 C++ 编 程 大 神!代 码 冗 余?内 存 泄 漏?不 存 在 的!

💻作 者 简 介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C++。
💡个 人 主 页@笑口常开xpr 的 个 人 主 页
📚系 列 专 栏C++ 炼 魂 场:从 青 铜 到 王 者 的 进 阶 之 路

代 码 趣 语:swap 模 板 藏 着 偷 懒 的 智 慧:与 其 给 每 个 类 型 写 交 换 代 码,不 如 让 编 译 器 按 类 型 ‘ 抄 作 业 ’,抄 得 又 快 又 准。
💪代 码 千 行,始 于 坚 持,每 日 敲 码,进 阶 编 程 之 路。
📦gitee 链 接
gitee
在这里插入图片描述


         在 C++ 的 编 程 世 界 里, 内 存 管 理 与 代 码 复 用 始 终 是 开 发 者 绕 不 开 的 核 心 话 题。今 天,我 们 聚 焦 于 C++ 模 板 这 一 强 大 工 具,它 宛 如 代 码 世 界 的 “ 万 能 模 具 ”,打 破 类 型 束 缚,让 同 一 份 逻 辑 能 适 配 多 样 数 据 类 型;同 时 也 会 结 合 new/delete 底 层,帮 你 贯 通 内 存 管 理 与 通 用 编 程 的 关 键 脉 络,一 起 解 锁 更 高 效 的 C++ 编 程 姿 势。


模 板

交 换 函 数

实 现 通 用 的 交 换 函 数

voidSwap(int& left, int& right){ int temp = left; left = right; right = temp;}voidSwap(double& left, double& right){ double temp = left; left = right; right = temp;}voidSwap(char& left, char& right){ char temp = left; left = right; right = temp;}

缺 点

  1. 重 载 的 函 数 仅 仅 是 类 型 不 同,代 码 复 用 率 比 较 低,只 要 有 新 类 型 出 现 时,就 需 要 用 户 自 己 增 加 对 应 的 函 数。
  2. 代 码 的 可 维 护 性 比 较 低,一 个 出 错 可 能 所 有 的 重 载 均 出 错

定 义

         模 板 是 一 个 “代 码 蓝 图”,可 以 根 据 传 入 的 类 型 “生 成” 对 应 版 本 的 具 体 代 码。

核 心 价 值

         解 决 “同 逻 辑、不 同 类 型” 的 代 码 冗 余 问 题。

分 类

函 数 模 板

定 义

         定 义 一 个 通 用 函 数,参 数 类 型 通 过 模 板 参 数 指 定,编 译 器 会 根 据 传 入 的 实 参 类 型 自 动 生 成 对 应 版 本 的 函 数。

格 式

template<typename T> 

         使 用 template 和 typename 来 声 明 模 板,这 里 的 typename 也 可 以 使 用 class 来 代 替,不 可 以 使 用 struct。T 是 参 数 类 型,可 以 是 内 置 类 型 或 者 自 定 义 类 型,可 以 作 为 函 数 的 参 数 或 者 返 回 值。

多 个 类 型

template<typename T1,typename T2> 

代 码 示 例

#include<iostream> using namespace std; template<typename T>//T是模板参数,类似于形参,定义的是类型voidSwap(T& x1,T& x2){T tmp = x1; x1 = x2; x2 = tmp;} int main(){ int a =0; int b =1; double c =1.1, d =2.2;Swap(a, b); cout << a <<" "<< b << endl;Swap(c, d); cout << c <<" "<< d << endl;return0;}
在这里插入图片描述


         上 面 的 代 码 中,2 个 Swap 调 用 的 不 是 同 一 个 函 数,编 译 器 通 过 类 型 自 动 推 导 出 函 数。

在这里插入图片描述

函 数 模 板 的 原 理

         编 译 器 根 据 参 数 类 型 推 导 出 具 体 函 数。

在这里插入图片描述


         可 以 直 接 使 用 库 里 面 的 swap 模 板,库 里 面 的 swap 是 小 写。

在这里插入图片描述
#include<iostream> using namespace std; int main(){ int a =1; int b =2; cout << a <<" "<< b << endl;swap(a, b); cout << a <<" "<< b << endl;return0;}
在这里插入图片描述

函 数 模 板 的 实 例 化

隐 式 实 例 化
         编 译 器 根 据 实 参 推 演 模 板 参 数 的 实 际 类 型。

#include<iostream> using namespace std; template<classT>TAdd(constT& left,constT& right){return left + right;} int main(){ int a1 =10, a2 =20; double d1 =10.1, d2 =20.2; cout <<Add(a1, d1)<< endl;return0;}
在这里插入图片描述


         代 码 报 错 是 因 为 a1 和 d1 的 类 型 不 同,模 板 参 数 列 表 中 只 有 一 个 T,编 译 器 无 法 确 定 此 处 到 底 该 将 T 确 定 为 int 或 者 double 类 型 而 报 错,在 模 板 中,编 译 器 一 般 不 会 进 行 类 型 转 换 操 作。 下 面 有 两 种 解 决 方 法。

方 法 1
         在 参 数 前 面 添 加 强 制 类 型 转 换。

#include<iostream> using namespace std; template<classT>TAdd(constT& left,constT& right){return left + right;} int main(){ int a1 =10, a2 =20; double d1 =10.1, d2 =20.2; cout <<Add(a1,(int)d1)<< endl; cout <<Add((double)a1, d1)<< endl;return0;}
在这里插入图片描述


         不 同 的 强 制 类 型 转 换,得 到 的 结 果 是 不 一 样 的。

方 法 2
         显 示 类 型 转 换,在 函 数 名 后 的 < > 中 指 定 模 板 参 数 的 实 际 类 型

#include<iostream> using namespace std; template<classT>TAdd(constT& left,constT& right){return left + right;} int main(){ int a1 =10, a2 =20; double d1 =10.1, d2 =20.2;//cout << Add(a1, a2) << endl;//cout << Add(d1, d2) << endl;//强制类型转换//cout << Add(a1, (int)d1) << endl;//cout << Add((double)a1, d1) << endl;//显示实例化 cout << Add<int>(a1, d2)<< endl;//隐式类型转换 cout << Add<double>(a1, d2)<< endl;return0;}
在这里插入图片描述


         Add 函 数 中,使 用 const 是 因 为 隐 式 类 型 转 换 会 产 生 临 时 变 量,临 时 变 量 具 有 常 性。

特 殊 情 况
         有 些 函 数 无 法 自 动 推 导,只 能 显 示 实 例 化。

#include<iostream> using namespace std; template<typename T>T*Alloc(int n){returnnewT[n];} int main(){ double* p1 = Alloc<double>(10);return0;}

泛 型 编 程

         使 用 模 板 来 完 成 的,代 码 针 对 广 泛 的 类 型。

类 模 板

格 式

template<class T1, class T2, ..., class Tn> class 类模板名 { //类内成员定义 }; 

         类 模 板 可 以 定 义 多 个 模 版 参 数。

代 码 示 例

         类 模 板 只 能 显 示 实 例 化,不 能 传 递 参 数。

#include<iostream> using namespace std; template<typename T>classStack{public:Stack(size_t capacity =3){ cout <<"StackInt(size_t capacity = 3)"<< endl; _array =newT[capacity];//只需要个数 _capacity = capacity; _size =0;}voidPush(constT& data){ _array[_size]= data; _size++;}~Stack(){ cout <<"~StackInt()"<< endl;if(_array){free(_array); _array =NULL; _capacity =0; _size =0;}}private:T* _array; int _capacity; int _size;}; int main(){ Stack<int> s1;//int Stack<double> s1;//doublereturn0;}

类 模 板 的 实 例 化

         类 模 板 实 例 化 与 函 数 模 板 实 例 化 不 同,类 模 板 实 例 化 需 要 在 类 模 板 名 字 后 跟 < >,然 后 将 实 例 化 的 类 型 放 在 < > 中 即 可,类 模 板 名 字 不 是 真 正 的 类,而 实 例 化 的 结 果 才 是 真 正 的 类。

         普 通 类,类 名 和 类 型 一 样,类 模 板,类 名 和 类 型 不 一 样。例 如:类 名:Stack,类 型:Stack< T >。

         template< typename T > 的 作 用 范 围 是 下 一 个 函 数 或 者 类。

在这里插入图片描述

总 结

         模 板 的 出 现,让 C++ 代 码 摆 脱 了 重 复 冗 余 的 枷 锁,无 论 是 函 数 模 板 实 现 通 用 逻 辑 复 用,还 是 类 模 板 构 建 灵 活 数 据 结 构,都 极 大 提 升 了 编 程 效 率 与 代 码 可 维 护 性。掌 握 这 些 知 识,就 像 拿 到 了 C++ 进 阶 的 密 钥,助 力 我 们 写 出 更 简 洁、更 高 效、更 具 扩 展 性 的 代 码,在 编 程 之 路 上 走 得 更 远、更 稳,去 探 索 更 广 阔 的 代 码 天 地。

Read more

Java SpringBoot+Vue3+MyBatis 宠物领养系统系统源码|前后端分离+MySQL数据库

Java SpringBoot+Vue3+MyBatis 宠物领养系统系统源码|前后端分离+MySQL数据库

摘要 随着社会经济的快速发展和人们生活水平的提高,宠物已经成为许多家庭的重要成员。然而,流浪动物数量不断增加,宠物领养需求与供给之间的信息不对称问题日益突出。传统的线下领养方式效率低下,信息传播范围有限,难以满足现代社会对高效、透明宠物领养服务的需求。因此,开发一款基于互联网的宠物领养系统具有重要的现实意义。该系统能够为宠物救助机构、领养者和宠物爱好者提供一个便捷的信息交流平台,有效解决宠物领养过程中的信息孤岛问题。关键词:宠物领养、信息不对称、流浪动物、互联网平台、救助机构。 本系统采用前后端分离架构,前端基于Vue3框架实现响应式用户界面,后端使用Java SpringBoot框架提供高效稳定的API服务,数据持久化层采用MyBatis框架与MySQL数据库交互。系统核心功能包括宠物信息展示、领养申请管理、用户权限控制以及数据统计分析。用户可通过分类筛选、关键词搜索快速找到目标宠物,并在线提交领养申请。管理员后台支持对宠物信息、用户申请及系统数据的全方位管理。系统还集成了第三方支付接口实现在线捐赠功能,为救助机构提供可持续运营支持。关键词:Vue3、SpringBoot、MyB

By Ne0inhk
【C++】模板的两大特性

【C++】模板的两大特性

文章目录 * 前言 * 1. 关于 typename 的使用场景 * 2. 模板的分离编译问题 * 2.1 简述程序编译链接的过程 * 2.1.1 预处理 * 2.1.2 编译 * 2.1.3汇编 * 2.1.4 链接 * 2.2 模板分离编译为什么会链接报错 * 2.2.1 什么是分离编译 * 2.2.2 模板分离编译存在的问题 * 3. 解决办法 前言 本文探讨了C++模板编程中的两个关键问题。第一部分介绍了typename在模板中的特殊使用场景,指出当模板参数访问内嵌类型时必须使用typename关键字来消除编译器歧义。第二部分分析了模板分离编译导致链接错误的原因,通过对比普通函数和模板函数的编译链接过程,解释了模板定义必须放在头文件中才能被实例化的原理。文章结合代码示例和编译链接过程图解,帮助读者理解模板编译机制和常见错误的解决方法。 1.

By Ne0inhk
计算机毕业设计必看必学~基于Springbooterp ERP仓储管理系统设计与实现的设计与实现,原创定制程序、单片机、java、PHP、Python、小程序、文案全套、毕设成品等!

计算机毕业设计必看必学~基于Springbooterp ERP仓储管理系统设计与实现的设计与实现,原创定制程序、单片机、java、PHP、Python、小程序、文案全套、毕设成品等!

Springbooterp  ERP仓储管理系统设计与实现 摘  要 ERP仓储管理系统是一种信息技术工具,用于有效管理和控制仓库内物品。本文旨在研究ERP仓储管理系统的功能、优势以及对企业运营的影响。首先,探讨了ERP仓储管理系统带来的优势,如提高工作效率、精确控制库存和降低库存损耗。分析了ERP仓储管理系统对企业运营的影响,包括提高客户满意度、优化供应链管理和改善企业决策等方面。然后,介绍了ERP仓储管理系统的功能模块,包括仓库信息管理、库存信息管理、入库信息管理、出库信息管理、客户和供应商信息管理等。其次,最后,总结了ERP仓储管理系统的重要性,并强调了进一步研究和实践的价值。通过该研究,企业可以更好地了解和应用ERP仓储管理系统,提高仓储管理水平,提升竞争力。此外,学术界也可以借鉴研究成果,推动相关领域的发展和创新。 关键词:ERP仓储管理系统;SpringBoot框架;Java语言;Mysql数据库 Design and Implementation of Springboot ERP Warehouse Management System Abstract

By Ne0inhk
Java SpringBoot+Vue3+MyBatis 企业信息管理系统系统源码|前后端分离+MySQL数据库

Java SpringBoot+Vue3+MyBatis 企业信息管理系统系统源码|前后端分离+MySQL数据库

摘要 在当今信息化快速发展的时代,企业信息管理系统的需求日益增长。传统的手工管理方式已无法满足企业对高效、精准数据管理的需求,尤其是在数据量庞大、业务流程复杂的场景下。企业信息管理系统通过数字化手段,能够显著提升数据存储、查询和分析的效率,降低人工操作的错误率。此外,随着互联网技术的普及,企业对系统的可扩展性、安全性和用户体验提出了更高要求。因此,开发一套基于现代技术栈的企业信息管理系统,成为解决企业管理痛点的有效途径。关键词:企业信息管理、数字化、效率、可扩展性、安全性。 本系统采用Java SpringBoot作为后端框架,结合Vue3前端框架和MyBatis持久层框架,实现了前后端分离的架构设计。后端通过SpringBoot提供RESTful API接口,前端通过Vue3构建动态交互界面,MyBatis负责与MySQL数据库的高效交互。系统功能包括用户权限管理、企业信息录入与查询、数据统计分析等模块。用户权限管理实现了角色分级和权限控制,确保数据安全;企业信息模块支持多条件筛选和分页显示;数据统计模块通过可视化图表展示关键指标。系统具备高内聚、低耦合的特点,便于后续功能扩展和

By Ne0inhk