【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

飞算 JavaAI 实战:从代码生成到架构优化的全场景应用指南

飞算 JavaAI 实战:从代码生成到架构优化的全场景应用指南

飞算JavaAI实战:从代码生成到架构优化的全场景应用指南 作为Java开发者,你是否还在为重复编写CRUD代码而烦恼?是否面对复杂业务逻辑无从下手?是否被祖传代码的维护工作压得喘不过气?飞算JavaAI的出现,为这些痛点提供了一站式解决方案。本文将通过丰富的代码示例,详细解析这款智能开发助手在日常开发中的实战应用,带你领略AI赋能Java开发的全新体验。 一、日常编码:从单行补全到模块生成 1.1 一键生成CRUD代码,效率提升15倍 在企业级应用开发中,数据实体的增删改查(CRUD)是最基础也最耗时的工作。飞算JavaAI能够根据简单指令,自动生成符合开发规范的完整代码体系。 实战案例:电商平台商品分类管理模块开发 只需输入指令: 帮我生成商品分类实体类(Category)的CRUD代码,使用Spring Boot + MyBatis框架,包含Service层、Controller层和Mapper层,要求代码符合阿里巴巴Java开发规范。 飞算JavaAI会依次生成完整的多层代码: 实体类定义: publicclassCategory{privateLong

By Ne0inhk
JAVA项目实战:用飞算 JavaAI 高效开发电商系统核心功能模块

JAVA项目实战:用飞算 JavaAI 高效开发电商系统核心功能模块

JAVA项目实战:用飞算 JavaAI 高效开发电商系统核心功能模块 * 一、前言 * 二、飞算JavaAI使用 * 三、需求分析与规划 * (一)功能需求 * (二)核心模块 * (三)技术选型 * 四、飞算JavaAI开发实录 * (一)初始化项目 * (二)商品管理模块开发 * (三)订单模块开发 * (四)用户中心模块开发 * 五、优化与调试心得 * (一)遇到的问题及解决 * (二)飞算JavaAI其他功能利用 * 六、成果展示与总结 * (一)工程结构图 * (二)核心代码片段 * (三)飞算JavaAI使用体会 * 七、总结评价 * 结束语 JAVA项目实战:用飞算 JavaAI 高效开发电商系统核心功能模块。本文围绕用飞算 JavaAI 开发电商系统核心功能模块展开。

By Ne0inhk
理解 JavaScript 中的“ / ”:路径、资源与目录、nginx配置、请求、转义的那些事

理解 JavaScript 中的“ / ”:路径、资源与目录、nginx配置、请求、转义的那些事

目录 理解 JavaScript 中的“ / ”:路径、资源与目录、nginx配置、请求、转义的那些事 一、路径中 / 的含义 1、 / 所扮演的角色 2、根据 URL 中的 / 判断是目录还是资源 3、相对路径 vs 绝对路径 4、相对路径中的 . 与 .. 二、Vue中 / 的特殊作用 1、Vue Router 中的 / 2、Vue 项目构建时的 base 配置 三、SEO 对 / 的敏感性 四、Nginx 中 / 的配置技巧 五、fetch 和 API

By Ne0inhk
Java网络聊天室——OverThinker-ChatRoom

Java网络聊天室——OverThinker-ChatRoom

—项目专栏— 🚀 Java Chatroom 实时聊天室系统 一个基于 Spring Boot 和 WebSocket 技术实现的轻量级实时聊天室项目。 ✨ 项目概述 这是一个采用 前后端分离 架构的 Web 聊天应用。它专注于提供一个稳定、实时的消息通信平台,支持用户认证、好友管理、以及核心的一对一私聊功能。 特性描述实时通信基于 WebSocket 实现,消息秒级推送。核心功能用户注册登录、好友列表、私聊会话、消息历史记录。后端架构Spring Boot 配合 MyBatis,快速构建 RESTful API。前端技术传统 HTML/CSS/JavaScript + jQuery,轻量易维护。 📸 界面展示 (Screenshots) 登录与注册 登录页面 注册页面 聊天主界面 ⚡ 项目体验说明 先看说明!

By Ne0inhk