C++中的类模板

C++中的类模板

类模板

类模板在C++中是一种非常强大的工具,它允许程序员编写与数据类型无关的代码。简单来说,类模板允许你定义一个蓝图,这个蓝图可以用来生成具体类型的类。使用类模板可以提高代码的复用性,减少重复代码,使得代码更加简洁、易于理解和维护。

定义类模板

类模板的定义以关键字 template 开始,后面跟着模板参数列表。模板参数列表包含在尖括号 < > 中,里面定义了一个或多个模板参数。模板参数可以是类或者类型(比如 typename T 或者 class T),也可以是非类型参数(比如整型常量)。

template <typename T>
class Box {
public:T contents;void set(const T& value) {contents = value;}T get() {return contents;}
};

在这个例子中,Box 是一个类模板,它有一个模板参数 T。这意味着你可以用任意类型替换 T,从而生成该类型的 Box 类。

实例化类模板

当你使用一个类模板时,需要指定模板参数,这个过程称为模板实例化。实例化模板类时,你需要在类名后面加上模板参数,参数放在尖括号 < > 中。

Box<int> intBox;
Box<double> doubleBox;

在这里,我们创建了两个 Box 对象:一个用于整数,另一个用于双精度浮点数。每个对象都可以存储和返回其类型的值。

类模板的成员函数

类模板的成员函数通常在类定义内部定义,但也可以在外部定义。如果在外部定义成员函数,需要在函数定义之前加上 template <typename T>,并且在函数名前使用类模板的名称和模板参数列表。

template <typename T>
void Box<T>::set(const T& value) {contents = value;
}template <typename T>
T Box<T>::get() {return contents;
}

特化类模板

有时候,对于特定的数据类型,你可能希望类模板有不同的行为。这时候,可以使用模板特化。特化允许你为模板参数的特定类型定义一个特殊的类模板实现。

template <>
class Box<char> {
public:char contents;void set(const char& value) {contents = value + 1; // Just an example modification}char get() {return contents;}
};

这个例子展示了一个特化的 Box 类模板,它仅适用于 char 类型。对于 char 类型的 Boxset 函数有了不同的行为。

类模板是C++模板编程的基石,它提供了一种灵活的方式来创建可以操作任意类型的类。通过学习和使用类模板,你可以编写更通用、更高效的C++代码。

代码示例

#include <iostream>
#include <string>
using namespace std;// 定义一个Student类用于存储学生信息
class Student {string name; // 学生姓名double score; // 学生分数public:// 构造函数,允许带默认值,便于创建无特定信息的学生对象Student(string n="no", double s=33.3) {name = n;score = s;}// 声明友元函数,允许非成员函数访问私有成员// 重载<<运算符以便于直接输出Student对象friend ostream& operator<<(ostream& o, Student s);
};// 实现重载的<<运算符
ostream& operator<<(ostream& o, Student s) {cout << s.name << "," << s.score << endl; // 输出学生的姓名和分数,然后换行return o; // 返回ostream对象,支持链式调用
}// 定义一个模板类Vector,可用于存储任意类型的动态数组
template<typename T>
class Vector {T* data; // 指向数组的指针int capacity; // 数组的容量int n; // 数组当前存储的元素数量public:// 构造函数,初始化数组的容量和大小Vector(int cap=3) {data = new T[cap]; // 动态分配存储空间if (data == 0) { // 如果分配失败,则设置容量和大小为0cap = 0;n = 0;return;}capacity = cap; // 设置容量n = 0; // 初始化元素数量为0}// 向数组末尾添加一个元素void push_back(T e) {if (n == capacity) { // 如果当前大小已达容量cout << "增加容量" << endl; // 输出提示信息T* p = new T[2 * capacity]; // 申请新的两倍大小的数组if (p) {for (int i = 0; i < n; i++)p[i] = data[i]; // 复制旧数据到新数组delete[]data; // 释放旧数组data = p; // 更新指针指向新数组capacity = 2 * capacity; // 更新容量}else {return; // 如果新数组分配失败,直接返回}}data[n] = e; // 将新元素添加到数组末尾n++; // 元素数量增加}// 重载[]运算符,允许通过下标访问数组元素T operator[](int i)const {if (i < 0 || i >= n)throw"下标非法"; // 如果下标越界,抛出异常return data[i]; // 返回下标对应的元素}// 返回数组当前存储的元素数量int size() {return n;}
};int main() {// 创建一个Vector对象,用于存储Student对象Vector<Student> v;// 向Vector中添加Student对象v.push_back(Student("Li",45.7));v.push_back(Student("Ai", 45.7));v.push_back(Student("Bi", 45.7));// 遍历Vector并输出每个Student对象for (int i = 0; i < v.size(); i++)cout << v[i];cout << endl;// 继续向Vector中添加Student对象v.push_back(Student("Liu", 45.7));v.push_back(Student("Lsi", 45.7));// 再次遍历Vector并输出每个Student对象for (int i = 0; i < v.size(); i++)cout << v[i];cout << endl;return 0;
}

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

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

相关文章

字节跳动春招研发部分编程题汇总做题笔记---Java

3.雀魂启动&#xff01; 小包最近迷上了一款叫做雀魂的麻将游戏&#xff0c;但是这个游戏规则太复杂&#xff0c;小包玩了几个月了还是输多赢少。 于是生气的小包根据游戏简化了一下规则发明了一种新的麻将&#xff0c;只留下一种花色&#xff0c;并且去除了一些特殊和牌方式&…

Java基础知识总结(14)

map集合 /* java.util.Map接口中常用的方法 1、Map和Collection 没有继承关系 2、Map集合以key和value的方式存储数据&#xff1a;键值对key和valuea都是引用数据类型key和value都是存储对象的内存地址key起到主导地位&#xff0c;value是key的一个附属品 3、Map接口中常用的方…

GDAL实现大幅影像的快速读取

这里做个备份&#xff0c;原文链接 遥感影像小则几百兆&#xff0c;大则5,6GB&#xff0c;所以在使用GDAL进行图像读取时面临读写速度较慢的问题&#xff0c;我们可以深入研究gdal中RasterIO函数的机制&#xff0c;发现该函数是通过一行一行读取影像来实现影像读入内存的&…

【教学类-40-01】20240322 幼儿视力检查照片合成GIF

作品展示——GIF动图 背景需求&#xff1a; 2024年3月22日&#xff0c;中班幼儿视力检查&#xff0c;保健老师表扬我们班幼儿视力正常率高。 我为每位孩子拍照时&#xff0c;突然想把动作图用Python变成GIF图片&#xff0c;于是每位孩子都拍了多张“辨认视力表的不同手势”&a…

基于Springboot的西安旅游系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的西安旅游系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

动态规划(算法竞赛、蓝桥杯)--单调队列优化绿色通道

1、B站视频链接&#xff1a;E45 单调队列优化DP 绿色通道_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N5e410; int n,tim,w[N],f[N],q[N];bool check(int m){int h1,t0;for(int i1; i<n; i){while(h<t && f[q[t]]>f[i-…

visual studio卸载几种方法

1、控制面板卸载&#xff1b; 2、有时候会发现控制面板卸载会失败&#xff0c;无法卸载&#xff0c;这时候要先把下面目录的关于visual studio的都删除&#xff0c;然后重启电脑后&#xff0c;重新安装vs即可。

使用echart绘制拓扑图,树类型,自定义tooltip和label样式,可收缩

效果如图&#xff1a; 鼠标移上显示 vue3 - ts文件 “echarts”: “^5.4.3”, import { EChartsOption } from echarts import * as echarts from echarts/core import { TooltipComponent } from echarts/components import { TreeChart } from echarts/charts import { C…

复试专业前沿问题问答合集10-1——区块链与加密货币

复试专业前沿问题问答合集10-1——区块链与加密货币 区块链与加密货币安全以及6G通信的基础知识问答: 区块链以及加密货币相关的基础安全知识 包括区块链如何确保交易安全、共识机制的作用、加密货币钱包的保护措施、智能合约的工作原理以及如何防范潜在的网络攻击。这些知…

vue项目实现---用户在页面没有操作5分钟时退出登录

方案1: 后端处理 (1)用户切换页面或者点击按钮时需要发送请求接口,如果后端判断在5分钟之内没有请求,然后将前端的token失效 方案2: 前端处理 (1)在main.js中创建全局的事件监听器来实现对键盘抬起事件和鼠标点击事件的监听 试例:Vue 项目中全局监听键盘抬起事件和鼠标点击…

【笔记】KaiOS SPN显示逻辑

更新流程code 1、gonk/dom/system/gonk/radio/RadioInterfaceLayer.jsm handleNetworkStateChanged -> requestNetworkInfo() -> handleRilResponse的getOperator -> handleOperator handleNetworkStateChanged:网络状态变化请求网络信息 this.requestNetworkInfo…

实用福利网站分享

1.http://www.w3school.com.cn w3school&#xff0c;很好的在线web学习网站&#xff0c;免费 2.https://sklearn.apachecn.org sklearn文档&#xff0c;虽然是文档&#xff0c;但能学到很多很多具体的机器学习例子和知识 3.http://www.runoob.com 菜鸟教程&#xff0c;也是…

实验6-10 统计单词的长度(PTA)

题目&#xff1a; 本题目要求编写程序&#xff0c;输入一行字符&#xff0c;统计每个单词的长度。所谓“单词”是指连续不含空格的字符串&#xff0c;各单词之间用空格分隔&#xff0c;空格数可以是多个。 输入格式: 输入给出一行字符。 输出格式: 在一行中输出每个单词的…

阿里云2核4G云服务器ECS和轻量应用服务器价格表

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

【postgresql 基础入门】表的约束(一)主键与外键,数据的实体完整性与参照完整性,外键引用数据被修改时的动作触发

主键与外键-表的约束(一) ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 系列文章…

2核4G服务器阿里云性能测评和优惠价格表

阿里云2核4G服务器租用优惠价格&#xff0c;轻量2核4G服务器165元一年、u1服务器2核4G5M带宽199元一年、云服务器e实例30元3个月&#xff0c;活动链接 aliyunfuwuqi.com/go/aliyun 活动链接如下图&#xff1a; 阿里云2核4G服务器优惠价格 轻量应用服务器2核2G4M带宽、60GB高效…

Debezium日常分享系列之:Debezium2.5稳定版本之数据类型映射

Debezium日常分享系列之&#xff1a;Debezium2.5稳定版本之数据类型映射 一、基本类型二、时间类型三、Decimal类型四、Boolean values布尔值五、Spatial types空间类型六、Debezium技术总结 Debezium MySQL 连接器表示对带有事件的行的更改&#xff0c;这些事件的结构类似于该…

MySQL数据库存储引擎MyISAM与InnoDB

前言 MySQL存储引擎是MySQL数据库中负责管理数据存储和检索的组件&#xff0c;不同的存储引擎提供了不同的功能和特性&#xff0c;可以根据实际需求选择合适的存储引擎来优化数据库性能和功能。以下是一些常见的MySQL存储引擎&#xff1a;InnoDB、MyISAM、MEMORY、NDB Cluster…

【LeetCode】--- 动态规划 集训(一)

目录 一、1137. 第 N 个泰波那契数1.1 题目解析1.2 状态转移方程1.3 解题代码 二、面试题 08.01. 三步问题2.1 题目解析2.2 状态转移方程2.3 解题代码 三、746. 使用最小花费爬楼梯3.1 题目解析3.2 状态转移方程3.3 解题代码 一、1137. 第 N 个泰波那契数 题目地址&#xff1a…

苏州城市学院芮国强一行莅临聚合数据走访调研

3月19日&#xff0c;苏州城市学院校党委书记芮国强、校长赵志宏一行莅临聚合数据&#xff0c;就数据科技赋能行业升级展开调研。聚合数据董事长左磊接待来访。 城市学院党委理论学习中心组一行参观了聚合数据展厅&#xff0c;了解了聚合数据的发展历程、数据产品、应用案例、奖…