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

[C++入门]简化的艺术---对模版的初步探索

        

目录

一,函数模版

运行结果​编辑

运行结果

二,类模板

1、基本语法

2、int数组展开

3、string数组展开


        在古代,印刷术没有发明出来之前,知识的传播极其不方便,在C语言中也是,对于一个函数,不同的参数类型,需要反复地CV修改,那么在C++中,就出现了极其方便的工具,来简化操作,提高效率。

一,函数模版

首先我们就拿swap函数来举例,当然在后续引入数据库之后,就可以直接使用了,这里我们拿来举例子

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
void Swap(double& left, double& right)
{double temp = left;left = right;right = temp;
}
void Swap(string& left, string& right)
{string temp = left;left = right;right = temp;
}
int main()
{int  a = 1, b = 2;double x = 1.1,y = 2.2;string m = "abc", n = "qwe";swap(a, b);swap(x, y);swap(m, n);cout << a << " " << b << endl << x << " " << y<<endl<<m<<"  "<<n;}

运行结果

写起来很不方便,换个类型就得再写一遍参数列表,那么怎么解决这个问题呢

答案就是用函数模版,让编译器去替咱们干活

template <class T>
void mySwap(T& a, T& b) {T temp = a;a = b;b = temp;
}int main() {int x = 10, y = 20;mySwap(x, y);  cout << "x=" << x << ", y=" << y << endl;  double m = 1.5, n = 2.5;mySwap<double>(m, n);  cout << "m=" << m << ", n=" << n;  return 0;
}

运行结果

二,类模板

1、基本语法

template <typename T>  // 模板声明
class 类名 {
public:// 成员声明(使用T作为类型)
};

这里我们拿一个动态数组进行举例

在这个数组中,我在类内定义了打印,在类外重载了下标访问,实例化了两个数组进行演示

template <typename T, int size>  
class Array {
private:T arr[size];
public:T& operator[](int index) { }void print() {for (int i = 0; i < size; ++i) {cout << arr[i] << " ";}cout << endl;}
};
template <typename T, int size>
T& Array<T, size>::operator[](int index) {if (index < 0 || index >= size) {throw out_of_range("Index out of range");}return arr[index];
}
int main() {Array<int, 5> intArr; for (int i = 0; i < 5; ++i) {intArr[i] = i * 10;}intArr.print();Array<string, 3> strArr; strArr[1] = "Template";strArr[2] = "Magic";strArr.print();return 0;
}

2、运行结果

在这里对main中的两个实例化对象进行展开

2、int数组展开

class Array_int_5 {
private:int arr[5];  // 固定5个int的内存
public:int& operator[](int index) { if (index < 0 || index >= size) {throw out_of_range("Index out of range");}return arr[index]; }void print() {    for (int i = 0; i < size; ++i) {cout << arr[i] << " ";}cout << endl;
} }
};

这就是编译器对int数组的展开,其中intArr[i]=i*10展开是

intArr.operator[](i) = i * 10

其中 throw out_of_range 是C++中特有的处理问题的一种方式,抛异常,在数组下标范围错误时,就会弹出一下警告

3、string数组展开

class Array<string, 3> {string arr[3];
public:string& operator[](int index) {if (index < 0 || index >= 3)throw out_of_range("Index out of range");return arr[index];}void print() {    for (int i = 0; i < size; ++i) {cout << arr[i] << " ";
}
};

具体内容和上边类似,string的相关讲解将会在下一篇文章更新

以上就是本篇博客的全部内容啦,欢迎大家在评论区讨论交流!!!

http://www.lqws.cn/news/126235.html

相关文章:

  • powershell 安装 .netframework3.5
  • Linux基本指令(三)
  • 程一笑的AI梦何时醒?
  • Kafka深度技术解析:架构、原理与最佳实践
  • Spring Boot 从Socket 到Netty网络编程(上):SOCKET 基本开发(BIO)与改进(NIO)
  • 【dynamic-datasource】动态数据源切换失效的深度解析与解决方案
  • SQL进阶之旅 Day 14:数据透视与行列转换技巧
  • App 上线后还能加固吗?iOS 应用的动态安全补强方案实战分享(含 Ipa Guard 等工具组合)
  • 【Zephyr 系列 8】构建完整 BLE 产品架构:状态机 + AT 命令 + 双通道通信实战
  • 使用PyInstaller将Python脚本打包成可执行文件
  • AD四层板的层叠设计
  • 组件库二次封装——透传问题
  • ESP32S3 LVGL超大字体
  • 【八股消消乐】如何解决SQL线上死锁事故
  • 缓存控制HTTP标头设置为“无缓存、无存储、必须重新验证”
  • Java高级 | 【实验四】Springboot 获取前端数据与返回Json数据
  • QT开发技术【ffmpeg + QAudioOutput】音乐播放器
  • 前端判断内容文字是否溢出容器,创建临时元素来模拟文本实际宽度
  • Windows 12确认没了,Win11 重心偏移修Bug
  • kubernetes》》k8s》》kubectl proxy 命令后面加一个
  • Python爬虫实战:研究urlparse库相关技术
  • 艾利特协作机器人:重新定义工业涂胶场景的精度革命
  • 第5篇《中间件负载均衡与连接池管理机制设计》
  • HDFS分布式存储 zookeeper
  • 42、响应处理-【源码分析】-浏览器与PostMan内容协商完全适配
  • 第二章 2.2 数据存储安全风险之数据存储风险分析
  • flask功能使用总结和完整示例
  • MVCC理解
  • 证券交易柜台系统解析与LinkCounter解决方案开发实践
  • NLP学习路线图(二十三):长短期记忆网络(LSTM)