【C++】泛型编程 ⑦ ( 模板类常用用法 | 模板类声明 | 模板类调用 | 模板类作为函数参数 )

文章目录

  • 一、类模板基础用法
    • 1、类模板声明定义
    • 2、类模板使用
    • 3、类模板做函数参数
  • 二、完整代码示例
    • 1、代码示例
    • 2、执行结果






一、类模板基础用法




1、类模板声明定义


上一篇博客中 , 【C++】泛型编程 ⑥ ( 类模板 | 类模板语法 | 代码示例 ) 讲解了模板类的基础语法 , 模板类声明如下 :

// 声明类模板
template <typename T>
class MyClass {
public:
    T value;
    MyClass(T val) : value(val) {}
    void printValue() {
        std::cout << value << std::endl;
    }
};

2、类模板使用


模板类声明后 ,

// 声明类模板
template <typename T>
class MyClass {
public:
    T value;
    MyClass(T val) : value(val) {}
    void printValue() {
        std::cout << value << std::endl;
    }
};

使用 模板类 创建 实例对象时 ,

首先 , 要进行 具体类型 初始化 , 该操作就是在 模板类 后面的 尖括号中 , 注明 泛型类型 ;

MyClass<int>

此时 , 注明 泛型类型后 , 就会生成 具体的类 ;

然后 , 使用 具体的类 , 定义 具体的 变量 ;

MyClass<int> myInt(10);

3、类模板做函数参数


类模板 作为函数参数 , 形参 必须是具体类型 , 也就是 类模板 的泛型类型必须声注明 ;

下面的 fun 函数中 , 接收模板类作为参数 , 模板类的 泛型类型 需要被注明 ;

// 类模板对象作为函数参数
// 形参必须是具体类型
// 类模板的泛型类型必须声注明
void fun(MyClass<int> &a)
{
    a.printValue();
}

如果不指定 泛型类型 , 会报错 error C2955: “MyClass”: 使用 类 模板 需要 模板 参数列表 错误 ;

1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Test.cpp
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(18,18): error C2955: “MyClass”: 使用 类 模板 需要 模板 参数列表
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(6): message : 参见“MyClass”的声明
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(20,18): error C2662:void MyClass<T>::printValue(void): 不能将“this”指针从“MyClass”转换为“MyClass<T> &1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(20,18): message : 原因如下: 无法从“MyClass”转换为“MyClass<T>1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(20,5): message : 转换要求第二个用户定义的转换运算符或构造函数
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(10,10): message : 参见“MyClass<T>::printValue”的声明
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(39,15): error C2664:void fun(MyClass &): 无法将参数 1 从“MyClass<int>”转换为“MyClass &1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(18,6): message : 参见“fun”的声明
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========




二、完整代码示例




1、代码示例


下面的示例中是一个 C++ 模板类 MyClass 的定义 ; 这个类可以接受一个类型参数T , 并创建一个具有该类型的成员变量的对象 ;

MyClass是一个模板类 , 该模板类 接受一个 泛型类型参数T , 泛型类型参数 T 在类中的许多地方都会用到 , 在类体中定义了一个 T 类型的成员变量 value , 以及一个接受T类型参数的构造函数 , 在printValue函数中 , 打印 value 的值 ;

template <typename T> 是模板声明 , 告诉编译器我们将在后面定义一个类模板 , 其中T是一个类型参数 ;

在类模板中 , 所有使用T的地方都可以被任何类型替换 ;


MyClass<int> myInt(10); 中的 <int> 是模板参数 , 表示这个类的类型参数是 int ;

myInt(10) 是创建了一个 MyClass<int> 的实例对象 , 并使用 (10) 进行初始化 ;


#include "iostream"
using namespace std;

// 声明类模板
template <typename T>
class MyClass {
public:
    T value;
    MyClass(T val) : value(val) {}
    void printValue() {
        std::cout << value << std::endl;
    }
};

// 类模板对象作为函数参数
// 形参必须是具体类型
// 类模板的泛型类型必须声注明
void fun(MyClass<int> &a)
{
    a.printValue();
}

int main() {

    // 调用类模板 

    MyClass<int> myInt(10);         // 创建一个 int 类型的实例  
    myInt.printValue(); 	        // 输出:10  

    MyClass<double> myDouble(10.0); // 创建一个 double 类型的实例  
    myDouble.printValue(); 		    // 输出:10  

    MyClass<string> myStr("hello"); // 创建一个 string 类型的实例  
    myStr.printValue();             // 输出:hello


    // 类模板作为 函数参数
    MyClass<int> myInt2(88);
    fun(myInt2);

	return 0;
}

2、执行结果


执行结果 :

10
10
hello
88

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三菱PLC 模拟量输出模拟量转换功能块S_RTI(内嵌ST)

模拟量输出模拟量转换功能块S_RTI算法原理和公式介绍请参考下面文章链接: PLC模拟量输出 模拟量转换FC S_RTI-CSDN博客文章浏览阅读5.3k次,点赞2次,收藏11次。1、本文主要展示西门子博途模拟量输出转换的几种方法, 方法1:先展示下自编FC:计算公式如下:intput intput Rea…

实战项目:VB龟兔赛跑游戏+猜数字游戏

文章目录&#xff1a; 一&#xff1a;效果演示 二&#xff1a;实现思路 三&#xff1a;代码实现 form1 效果图 代码 form2 效果图 代码 form3 效果图 代码 一&#xff1a;效果演示 效果图◕‿◕✌✌✌ 代码下载 二&#xff1a;实现思路 窗口1&#xff1a;龟兔赛…

数据结构【DS】特殊二叉树

完全二叉树 叶子结点只能出现在最下层和次下层, 最下层的叶子结点集中在树的左部完全二叉树中, 度为1的节点数 0个或者1个【计算时可以用这个快速计算, 配合&#x1d45b;0&#x1d45b;21】若n为奇数&#xff0c;则分支节点每个都有左右孩子&#xff1b;若n为偶数&#xff0…

Python---return返回值

return返回值 返回值&#xff1a;很多函数在执行完毕后&#xff0c;会通过return关键字返回一个结果给 调用它的位置。 return 英 /rɪˈtɜːn/ n. 回来&#xff0c;返回&#xff1b; 思考&#xff1a;如果一个函数需要两个return (如下所示)&#xff0c;程序如何执行&…

C语言——1.入门须知

文章目录 1.C语言的简要概述1.1.C语言类比自然语言1.2.计算机语言的发展1.3.C语言在当今的地位1.4.C语言的优势和劣势1.4.1.C语言的优势1.4.2.C语言的劣势 2.C语言的应用场景3.C语言的学习路径3.1.学习目的3.2.学习路径3.3.学习资源3.3.1.推荐书籍3.3.2.推荐课程3.3.3.推荐题库…

Nodejs--Express框架使用

目录 一.概念 二.项目目录结构 三.app.js 四.项目需要的中间件 五.Mysql连接 六.日志配置 七.实体模型配置 八.统一结果封装 九.app.js的详细配置 十.自定义登录拦截器 十一.route路由配置 十二.controller处理 十二&#xff1a;静态页面&#xff1a; 十三&#xff…

男子遗失30万天价VERTU唐卡手机,警察2小时“光速”寻回

今天&#xff0c;一则“男子丢失30万元手机女子捡到一位老年机”的新闻迅速冲上热搜第一&#xff0c;引发全网热议。据宿城公安消息&#xff1a;近日&#xff0c;江苏省宿迁市市民王先生在购物时不慎失落了一部价值30万元的全球知名奢侈品VERTU手机&#xff0c;被民警2个多小时…

基于springboot实现家政服务管理平台项目【项目源码+论文说明】计算机毕业设计

摘要 随着家政服务行业的不断发展&#xff0c;家政服务在现实生活中的使用和普及&#xff0c;家政服务行业成为近年内出现的一个新行业&#xff0c;并且能够成为大众广为认可和接受的行为和选择。设计家政服务管理平台的目的就是借助计算机让复杂的销售操作变简单&#xff0c;…

链表的增删改查(python实现)

链表的增删改查 使用python实现链表的增删改查 增 add(val)&#xff1a;在头结点处增加&#xff0c;左插入append(val)&#xff1a;在尾结点处增加&#xff0c;右插入 删 remove_single(target)&#xff1a;删除值为target的第一个节点remove_all(target)&#xff1a;删除值为…

Linux僵尸进程

Linux僵尸进程 一、僵尸进程简介二、僵尸进程的危害三、避免僵尸进程的方法 一、僵尸进程简介 如果父进程比子进程先退出&#xff0c;子进程将被1号进程托管&#xff08;这也是一种让程序在后台运行的方法&#xff09;。如果子进程比父进程先退出&#xff0c;而父进程没有处理…

基于SSM的“鲜花”电子商务平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

通过汇编理解cortex-m3:第0章

第0章&#xff1a;准备工作 基本想法&#xff1a;利用汇编和gdb调试&#xff0c;来学习cortex-m3汇编指令&#xff0c;以及一些寄存器的功能。 软件和硬件&#xff1a; 硬件&#xff1a;韦东山瑞士军刀中的最小核心板&#xff08;STM32F103C8T6&#xff09; STLINK-V2&#…

基于java web个人财务管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

PyCharm:PyCharm新建.py文件时自动带出指定内容

在pycharm中加上指定内容&#xff0c;每次新建.py文件都会自动带出指定内容 操作&#xff1a; File—Setting—Editor----File and Code Templates--Python Script 在右侧窗口中加上如下信息 # encoding: utf-8 # author: Jeffrey # file: ${NAME}.py # time: ${DATE} ${TI…

【Java SE】循环一些基本练习

判定一个数字是否是素数 public class Test {public static int is_sushu(int n) {if(n 1) {return 0;}int i ;for (i 2; i < Math.sqrt(n); i) {if(n % i 0 ) {break;}}if (i > n) {return 1;}return 0;}public static void main(String[] args) {Scanner scanner …

kafka 磁盘扩容与数据均衡实在操作讲解

文章目录 一、概述1&#xff09;Kafka 磁盘扩容概述2&#xff09;Kafka 数据均衡概述 二、K8s 集群部署三、kafka on k8s 环境部署1&#xff09;安装 helm2&#xff09;安装 zookeeper1、添加源并下载部署包2、修改配置3、开始安装 zookeeper4、测试验证5、卸载 3&#xff09;安…

uview-plus中二级菜单左右联动更改为uni-app+vue3+vite写法

uview-plus3.0重磅发布&#xff0c;全面的Vue3移动组件库 该插件使用的vue2写法&#xff0c;但支持vue3引用&#xff0c;在此基础上修改为uni-appvue3vite; <template><view class"u-wrap mainClass"><!-- <back-header :title"pageTitle&quo…

【Linux】-进程间通信-命名管道文件(没有关系的进程间进行通信),以及写一个日志模板

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

mysql数据库【进阶篇】

1.存储引擎 1.1 mysql的体系结构 连接层&#xff1a;最上层是一些客户端和链接服务&#xff0c;主要完成- -些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层&#xff1a;第二层架构主要完成大多数的核心服务功…

【教学类-06-06】20231118 (55格版)X以内加法、减法、加减混合题

背景需求 1、长期做手工制作&#xff0c;常规管理难以控制 优势&#xff1a; 1、幼儿创作热情高涨&#xff0c;发明的新玩具多 2、互助观摩&#xff0c;进一步模仿、创作作品 3、互动游戏兴趣浓厚&#xff0c;语言交流踊跃&#xff0c; 劣势&#xff1a; 1、纸条碎片多&…