面向对象程序设计(C++)模版初阶

1. 函数模版

1.1 函数模版概念 

       函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本,可以类比函数参数,函数模版就是将函数参数替换为特定类型版本


1.2 函数模版格式

template<typename T1,typename T2,.......,typeneme Tn>

其中 typename 可以替换为 class ,但是切记不可以替换为 struct

接下来以一个Swap函数为例(C++库里已经定义好了swap函数,可以直接使用,这里只是做演示)

#include<iostream>
using namespace std;
template <class T>
void Swap(T& x, T& y)
{T tmp = x;x = y;y = tmp;
}int main()
{int x = 1, y = 2;double i = 13.14, j = 5.20;Swap(x, y);Swap(i, j);cout << "x = " << x << "\t" << "y = " << y << endl;//x = 2 , y = 1cout << "i = " << i << "\t" << "j = " << j << endl;//i = 5.20 , j = 13.14return 0;
}


1.3 函数模版原理

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器。在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应 类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此


1.4 函数模版实例化

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

如上面的Swap函数举例就是隐式实例化,是通过实际输入的参数类型进行实例化,较为简单

#include<iostream>
using namespace std;
template <class T>
void Swap(T& x, T& y)
{T tmp = x;x = y;y = tmp;
}int main()
{int x = 1, y = 2;double i = 13.14, j = 5.20;Swap(x, y);//隐式实例化Swap(i, j);//隐式实例化cout << "x = " << x << "\t" << "y = " << y << endl;//x = 2 , y = 1cout << "i = " << i << "\t" << "j = " << j << endl;//i = 5.20 , j = 13.14return 0;
}

2. 显示实例化:在函数名后的<>中指定模板参数的实际类型

以Add函数为例,如果输入的参数不是同一类型就需要显示实例化,比如

#include<iostream>
using namespace std;template<class T>
T Add(const T& left, const T& right)
{return left + right;
}int main()
{int x = 2;double y = 3.14;//显示实例化cout << Add<int>(x, y) << endl;//5cout << Add<double>(x, y) << endl;//5.14return 0;
}

当然也可以使用推到实例化以及定义一个新的函数模版来实现不同参数的Add函数

#include<iostream>
using namespace std;template<class T>
T Add(const T& left, const T& right)
{return left + right;
}
//新的函数模版
template<class T1,class T2>
T1 Add(const T1& left, const T2& right)
{return left + right;
}int main()
{int x = 2;double y = 3.14;//显示实例化cout << Add<int>(x, y) << endl;//5cout << Add<double>(x, y) << endl;//5.14//推到实例化cout << Add(x, (int)y) << endl;cout << Add((double)x, y) << endl;//新的函数模版cout << Add(x, y) << endl;//5return 0;
}

1.5 函数模版匹配规则 

1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个       非模板函数,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一        个实例

#include<iostream>
using namespace std;template<class T>
T Add(const T& x, const T& y)
{return x + y;
}int Add(const int& x, const int& y)
{return (x + y) * 10;
}int main()
{int x = 1;int y = 2;//优先调用非模版函数cout << Add(x, y) << endl;//30return 0;
}

2. 模板函数不允许自动类型转换,但普通函数可以进行自动类型转换


2. 类模版

2.1 类模板的定义格式

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

接下来以一个 Stack 类为实例

//类模版
template <class T>
class Stack
{
public:Stack(int n = 4):_array(new T[n]),_size(0),_capacity(n){};~Stack() {delete[] _array;_array = nullptr;_capacity = _size = 0;};void Push(const T& x);
private:T* _array;size_t _capacity;size_t _size;
};
//在类外定义需要注意格式,要重新定义模版,此处的T可以是其他名字,只充当一个代号
template<class T>
void Stack<T>::Push(const T& x)
{//首先判断是否需要扩容if (_capacity == _size){//创建一个新数组,大小是原来数组的两倍,存储原来的数据T* tmp = new T[_capacity * 2];memcpy(tmp, _array, sizeof(T) * _size);delete[] _array;_array = tmp;_capacity *= 2;}_array[_size++] = x;
}int main()
{//int 类型的StackStack<int> st1;st1.Push(1);st1.Push(1);st1.Push(1);//double 类型的StackStack<double> st2;st2.Push(1.1);st2.Push(1.1);st2.Push(1.1);return 0;
}

2.2 类模板的实例化

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

int main()
{//int 类型的StackStack<int> st1;st1.Push(1);st1.Push(1);st1.Push(1);//double 类型的StackStack<double> st2;st2.Push(1.1);st2.Push(1.1);st2.Push(1.1);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BUG 太多?苹果罕见“重新推送”ios18 beta 4测试版

在刚刚过去的周末&#xff0c;苹果公司面向开发者&#xff0c;重新发布了 iOS / iPadOS 18 Beta 4 更新&#xff0c;内部版本号从 22A5316j 变为 22A5316k&#xff0c;目前尚不清楚两个 Beta 4 版本更新之间的区别。 此次更新包大小仅为251M左右&#xff0c;是 更新。 对于已经…

精品PPT | 微信云原生大数据平台构建及落地实践.pptx

一、大数据上云概述 1.为什么大数据要上云 2.微信大数据平台架构演进 二、大数据上云基础建设 1.统一编排 2.Pod 设计及大数据配套能力 3.计算组件云环境适配 三、稳定性及效率提升 1.K8S 集群稳定性与弹性配额 2.可观测性与智能运维

基于OpenCV C++的网络实时视频流传输——Windows下使用TCP/IP编程原理

1.TCP/IP编程 1.1 概念 IP 是英文 Internet Protocol &#xff08;网络之间互连的协议&#xff09;的缩写&#xff0c;也就是为计算机网络相互连接进行通信而设计的协议。任一系统&#xff0c;只要遵守 IP协议就可以与因特网互连互通。 所谓IP地址就是给每个遵循tcp/ip协议连…

[QT开发_音乐播放器项目笔记01]

目录 一&#xff1a;常用类 26 QByteArray 是 Qt 框架中的一个类&#xff0c;用于处理字节数组。它提供了动态大小的字节数组&#xff0c;可以用于存储和操作二进制数据&#xff0c;比如文件内容、网络数据等。 QT项目记录&#xff1a; 一&#xff1a;常用类 26 QByteArray…

【JavaScript】详解JavaScript语法

文章目录 一、变量和数据类型二、运算符三、条件语句四、循环语句五、函数六、对象和数组七、ES6新特性八、实际应用案例 JavaScript是一门广泛应用于Web开发的编程语言。掌握JavaScript语法是成为前端开发者的第一步。本文将详细介绍JavaScript的基本语法&#xff0c;包括变量…

Python技能达到这个水平,高薪就业不是梦

一&#xff0c;高薪就业的必备基础 要达到高薪就业的水平&#xff0c;Python开发者通常需要具备以下几方面的技能和经验&#xff1a; 如需Python籽料直接戳&#xff1a; 2024年最新python教程全套&#xff0c;学完即可进大厂&#xff01;&#xff08;附全套视频 下载&#xf…

软件测试必备 - 14个接口与自动化测试练习网站

随着互联网和移动应用的快速发展,接口和自动化测试的重要性日益凸显。越来越多的企业开始重视API测试,因为它不仅能提升开发效率,还能确保系统的稳定性和安全性。这些练习网站为测试人员提供了宝贵的资源,帮助他们掌握必要的技能,应对日益复杂的测试需求。 在软件测试的世…

【Linux】TCP全解析:构建可靠的网络通信桥梁

文章目录 前言1. TCP 协议概述2. TCP报头结构3. 如何理解封装和解包呢&#xff1f;4. TCP的可靠性机制4.1 TCP的确认应答机制 4.2 超时重传机制5. TCP链接管理机制5.1 经典面试题&#xff1a;为什么建立连接是三次握手&#xff1f;5.2 经典面试题&#xff1a;为什么要进行四次挥…

Java每日一题 ~ 盛最多水的容器

. - 力扣&#xff08;LeetCode&#xff09; 1.题目解析 本题的要求就是&#xff1a;给定数组索引之间的差值为宽&#xff0c;元素值中小的为边长求面积。 2.算法分析 思路一&#xff1a;暴力枚举 暴力法的思路是对所有可能的容器组合进行穷举&#xff0c;计算它们能容纳的水…

[硬件]—电感传感器

电感传感器 1.概述 工作基础&#xff1a;电磁感应&#xff0c;即利用线圈自感或互感的改变来实现非电量测量。工作原理&#xff1a; 被测物理量&#xff08;非电量&#xff1a;位移、振动、流量&#xff09;&#xff1b;线圈自感系数L/互感系数M&#xff1b;电压或电流&#…

0729作业+梳理

一、作业 1.写一个日志文件&#xff0c;将程序启动后的每一秒时间写入到文件中 代码&#xff1a; #include<myhead.h> #include<time.h> //判断原本文件中的行数 int len_txt(FILE *fp) { char buf0; int count 1; while(1) { buffgetc…

计算是守恒与对称的,谋算(算计)是变通与破缺的

计算通常涉及到严格的数学或逻辑规则&#xff0c;这些规则保证了信息或量的守恒和对称性。例如&#xff0c;数学运算如加减乘除都遵循特定的规律&#xff0c;确保了结果的准确性和一致性。相比之下&#xff0c;谋算&#xff08;或称算计&#xff09;更多指策略性的考虑或具有权…

Redis 缓存中间件

目录 概念 安装redis redis基本命令 给redis添加密码 基础数据类型 string类型 list列表类型 set创建&#xff08;一个键对应一个值&#xff09; set 创建数据 get 获取数据 keys * 展示所有的键 exists 判断键值是否存在 type 查看数据的类型 del 删除键 rename…

学习008-02-04-03 Group List View Data(组列表查看数据)

Group List View Data&#xff08;组列表查看数据&#xff09; This lesson explains how to group the Employee List View data by department and position. 本课介绍如何按部门和职位对员工列表视图数据进行分组。 Note Before you proceed, take a moment to review the …

机械学习—零基础学习日志(高数15——函数极限性质)

零基础为了学人工智能&#xff0c;真的开始复习高数 这里我们将会学习函数极限的性质。 唯一性 来一个练习题&#xff1a; 再来一个练习&#xff1a; 这里我问了一下ChatGPT&#xff0c;如果一个值两侧分别趋近于正无穷&#xff0c;以及负无穷。理论上这个极限值应该说是不存…

2024下《系统架构设计师》案例简答题,刷这些就够了!

2024年软考下半年已经越来越近了&#xff0c;不知道今年备考架构的同学们准备得怎么样了呢&#xff1f; 简答题一直是架构拿分的重点区域&#xff0c;对于许多考生来说&#xff0c;也往往是最具挑战性的部分。今天我就把那些重要的案例简答题类型整理汇总给大家&#xff0c;希望…

02 Go语言操作MySQL基础教程_20240729 课程笔记

概述 如果您没有Golang的基础&#xff0c;应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728 基础不好的同学每节课的代码最好配合视频进行阅读和学习&#xff0c;如果基础比较扎实&#xff0c;则阅读本教程巩固一下相…

Qt Designer,仿作一个ui界面的练习(二):部件内容的填充

有了完成了布局的基本框架设计之后&#xff0c;对各个部件逐步完成内容的填充。 一、还是从顶边栏开始&#xff1a; 1、在顶边栏的topLogo里面拖入一个QLabel&#xff08;标签&#xff09;&#xff0c;命名为logoImage&#xff0c;删除标签的文字。 2、右键点击topLogo&#x…

计算机三级嵌入式(三)——嵌入式系统硬件组成

目录 考点1 嵌入式最小硬件系统 考点2 基于 ARM 内核的典型嵌入式应用系统硬件组成 考点3 ARM 的 AMBA 总线体系结构及标准 考点4 基于 ARM 内核的嵌入式芯片的硬件组成 考点5 存储器层次结构 考点6 存储器分类 考点7 存储器主要性能指标 考点8 片内存储器 考点9 外部…

IndexError: list index out of range

IndexError: list index out of range 目录 IndexError: list index out of range 【常见模块错误】 【解决方案】 原因分析 解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身…