【C++】模版(初阶)

【C++】模版(初阶)

目录

一. 函数模版

1. 格式 原理

2. 函数模版的实例化

二. 类模板


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(char& left, char& right) { char temp = left; left = right; right = temp; }

使用函数重载太麻烦

模具,填充不同类型,生成具体类型的代码

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础

一. 函数模版

1. 格式 原理

template<typename T1, typename T2, ......, typename Tn>
返回类型 函数名(参数列表)
{ }

typename是用来定义模板参数关键字也可以使用class,不能使用struct

模板参数作用范围:紧跟的 { }

template<typename T> // 模板参数 -- 类型 void Swap(T& left, T& right) { T temp = left; left = right; right = temp; } template<typename T1, typename T2> T1 Func (const T1& x, const T2& y) { cout << x << " " << y << endl; return x; }

int main() { int a = 0, b = 1; double c = 1.1, d = 2.2; Swap(a, b); Swap(c, d); // Date d1(1949, 10, 1), d2(2015, 7, 3); Func(1, 2); Func(1, 2.2); return 0; }

调用的是模版实例化出的函数(模板就是将本来应该我们做的重复的事情交给了编译器 )


C++库里面有。不需要写Swap,也不用写模版。直接使用

int main() { int a = 0, b = 1; double c = 1.1, d = 2.2; swap(a, b); swap(c, d); // Date d1(1949, 10, 1), d2(2015, 7, 3); return 0; }

2. 函数模版的实例化

隐式实例化:让编译器根据实参 推演模板参数的实际类型
显示实例化:在函数名后的<>中 指定模板参数的实际类型

template<typename T> T Add(const T& left, const T& right) { return left + right; } template<typename T> T* Alloc(int n) { return new T[n]; } 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, d1) << endl; 报错:编译器无法确定T的类型 // 解决方案1:用户自己强制转换 cout << Add(a1, (int)d1) << endl; cout << Add((double)a1, d1) << endl; // 解决方案2:显示实例化 cout << Add<int>(a1, d1) << endl; cout << Add<double>(a1, d1) << endl; // 有些函数无法自动推,只能显示实例化 double* p1 = Alloc<double>(10); return 0; }

类型转换会产生临时变量(常性)。Add(a1, (int)d1) 这里不是把 d1 传给 right,所以 Add 要加 const

二. 类模板

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

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

构造函数不一定用T这个参数,所以类模板都无法通过推演实例化,类都是显示实例化


template<class T> class Stack { public: Stack(int capacity = 4) { _a = new T[capacity]; _capacity = capacity; _size = 0; } void Push(const T& Date) { // CheckCapacity(); _a[_size] = Date; _size++; } ~Stack() { if (_a) { free(_a); _a = nullptr; _capacity = 0; _size = 0; } } private: T* _a; int _capacity; int _size; }; int main() { Stack<int> s1; // int Stack<double> s2; // double Stack<char> s3; // char // Stack<int, double>s4; 多个模板参数 return 0; }

类模板的声明和定义分离是别致的

类模板的声明和定义最好不要分离到 2个文件,会报错(后面讲)

template<class T> class Stack { public: Stack(int capacity = 4); void Push(const T& Date); ~Stack() { if (_a) { free(_a); _a = nullptr; _capacity = 0; _size = 0; } } private: T* _a; int _capacity; int _size; }; template<class T> Stack<T>::Stack(int capacity) { _a = new T[capacity]; _capacity = capacity; _size = 0; } template<class T> void Stack<T>::Push(const T& data) { // CheckCapacity(); _a[_size] = data; _size++; }

本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注
小编会以自己学习过程中遇到的问题为素材,持续为您推送文章

Read more

【C++】第十三节—stack、queue、priority_queue、容器适配器(介绍和使用+模拟实现+OJ题)

【C++】第十三节—stack、queue、priority_queue、容器适配器(介绍和使用+模拟实现+OJ题)

hello,我是云边有个稻草人 C++-本节课所属专栏—持续更新中—欢迎订阅! 目录 一、stack的介绍和使用 1.1 stack介绍 1.2 stack的使用 1.3 stack代码题 【最小栈】 【栈的压入弹出序列】  【逆波兰表达式求值】  1.4 stack的模拟实现 二、queue的介绍和使用 2.1 queue - C++ Reference 2.2 queue的使用 2.3 queue的模拟实现 三、priority_queue的介绍和使用  3.1 priority_queue - C++ Reference—文档介绍 3.

By Ne0inhk
【C++算法刷题营地】—— 【string类面试题】Cyber顶级骇客带你速刷 C++ string类 中的常见算法题

【C++算法刷题营地】—— 【string类面试题】Cyber顶级骇客带你速刷 C++ string类 中的常见算法题

⚡ CYBER_PROFILE ⚡ /// SYSTEM READY /// [WARNING]: DETECTING HIGH ENERGY 🌊 🌉 🌊 心手合一 · 水到渠成 >>> ACCESS TERMINAL <<<[ 🦾 作者主页 ][ 🔥 C语言核心 ][ 💾 编程百度 ][ 📡 代码仓库 ] --------------------------------------- Running Process: 100% | Latency: 0ms 索引与导读 * 一、字符串转换 * 1)字符串转换整数 * 关键点拨 * 完整代码 * 最直接的替代接口:stoi * 小试牛刀:整数转字符串 * 2)字符串相加 * 关键点拨 * 完整代码 * 3)仅仅反转字母 * 关键点拨 * 完整代码 * 4)反转字符串 * 4.

By Ne0inhk
C++零基础小白学习知识点【基础版详解】

C++零基础小白学习知识点【基础版详解】

✅ 纯白话拆解+代码示例+实战场景,零基础能直接照着敲 ✅ 技术适配:基于C++23(LTS长期支持版,企业主流),聚焦高性能开发、嵌入式、游戏开发核心场景 ✅ 条理清晰:从“环境搭建→基础语法→核心特性→实战入门”层层拆解,每个知识点落地到代码 ✅ 核心目标:小白不仅“懂概念”,更能“写得出、跑得起”,掌握C++入门核心能力 一、前置准备:先搞定环境和核心认知 1. C++是什么? C++是在C语言基础上扩展的面向对象编程语言,2026年仍是高性能开发、嵌入式、游戏引擎、金融高频交易的首选语言——简单说: * 快:接近硬件级别的执行效率,比Python/Java快5-10倍; * 强:兼顾“面向过程”和“面向对象”

By Ne0inhk