C++ 编程基础(8)模版 | 8.3、类模版

文章目录

  • 一、类模版
    • 1、定义
    • 2、模板参数
    • 3、模版的实例化
    • 4、模版的特化
    • 5、模版成员函数
    • 6、总结

前言:

这里是引用

一、类模版

1、定义

类模板的定义以template关键字开始,后面跟着一个模板参数列表(用尖括号< >包围)。模板参数列表可以包含类型参数(使用typenameclass关键字声明)和非类型参数(如整数常量)。例如:

#include <iostream>// 定义一个类模板
template <typename T>
class MyClass {
private:T data;
public:MyClass(T value) : data(value) {}T getData() const { return data; }void setData(T value) { data = value; }
};int main() {// 实例化模板为 int 类型MyClass<int> intObj(10);std::cout << "Integer Value: " << intObj.getData() << std::endl;// 实例化模板为 double 类型MyClass<double> doubleObj(3.14);std::cout << "Double Value: " << doubleObj.getData() << std::endl;return 0;
}

2、模板参数

类模板的模板参数可以是类型参数(如typename T)或非类型参数(如int Size)。类型参数允许类模板与多种数据类型一起工作,而非类型参数则允许类模板接受如整数常量这样的值。例如:定义Array模版,参数有类型参数与非类型参数。

#include <iostream>template <typename T, int N>
class Array {
private:T data[N];
public:Array(); // 默认构造函数T& operator[](int index); // 下标操作符重载
};// 在类模板外部定义默认构造函数和下标操作符重载
template <typename T, int N>
Array<T, N>::Array() {for (int i = 0; i < N; ++i) {data[i] = T();}
}template <typename T, int N>
T& Array<T, N>::operator[](int index) {return data[index];
}int main() {Array<int, 5> array; // 创建一个包含5个整数的数组array[0] = 10;array[1] = 20;std::cout << "First element: " << array[0] << std::endl;std::cout << "Second element: " << array[1] << std::endl;return 0;
}

3、模版的实例化

当使用类模板创建对象时,编译器会根据提供的模板参数类型生成相应的类定义。这个过程称为模板实例化。类模版的实例化与函数模版类似。

4、模版的特化

为特定的类型提供专门的实现,这时可以使用模板特化。模板特化可以是部分特化或完全特化。例如:

#include <iostream>// 通用模板
template <typename T>
class Print {
public:void show(T value) {std::cout << "Generic Value: " << value << std::endl;}
};// 完全特化为 int 类型
template <>
class Print<int> {
public:void show(int value) {std::cout << "Integer Value: " << value << std::endl;}
};// 完全特化为 double 类型
template <>
class Print<double> {
public:void show(double value) {std::cout << "Double Value: " << value << stdendl;}
};int main() {Print<int> intPrinter;Print<double> doublePrinter;Print<char> charPrinter;intPrinter.show(10);     // 输出 Integer Value: 10doublePrinter.show(3.14); // 输出 Double Value: 3.14charPrinter.show('A');    // 输出 Generic Value: Areturn 0;
}

5、模版成员函数

类模板的成员函数可以在类模板内部定义,也可以在类模板外部定义。如果在类模板外部定义成员函数,需要指定模板参数。例如:

#include <iostream>template <typename T>
class MyClass {
private:T data;
public:MyClass(T value) : data(value) {}T getData() const; // 声明成员函数void setData(T value); // 声明成员函数
};// 在类模板外部定义成员函数
template <typename T>
T MyClass<T>::getData() const {return data;
}template <typename T>
void MyClass<T>::setData(T value) {data = value;
}int main() {MyClass<int> intObj(10);std::cout << "Integer Value: " << intObj.getData() << std::endl;MyClass<double> doubleObj(3.14);std::cout << "Double Value: " << doubleObj.getData() << std::endl;return 0;
}

6、总结

C++的类模板是创建通用类的强大工具,它允许程序员编写与数据类型无关的代码,从而提高代码的重用性和可维护性。通过理解类模板的基本语法、成员函数定义、非类型模板参数以及模板特化,你可以更好地利用C++的模板功能来构建高效、灵活和可扩展的软件系统。

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

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

相关文章

uni-app快速入门(十)--常用内置组件(下)

本文介绍uni-app的textarea多行文本框组件、web-view组件、image图片组件、switch开关组件、audio音频组件、video视频组件。 一、textarea多行文本框组件 textarea组件在HTML 中相信大家非常熟悉&#xff0c;组件的官方介绍见&#xff1a; textarea | uni-app官网uni-app,un…

Tomcat 如何管理 Session

Tomcat 如何管理 Session 我们知道&#xff0c;Tomcat 中每一个 Context 容器对应一个 Web 应用&#xff0c;而 Web 应用之间的 Session 应该是独立的&#xff0c;因此 Session 的管理肯定是 Context 级的&#xff0c;也就是一个 Context 一定关联多个 Session。 Tomcat 中主…

鸿蒙NEXT开发-用户通知服务的封装和文件下载通知

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

01 IP路由基础

一、路由器是怎么转发数据包 • 当数据包到达路由器之后&#xff0c;根据数据包的目的 IP 地址&#xff0c;查找 路由表&#xff0c;并根据路由表中相应的路由所指示出接口还有下一跳 指导数据包在网络中的转发。 • 如果路由器路由表没有路由怎么办&#xff1f; -------- 将数…

Android studio 呼叫盒app

一、权限文件 0.gradle切换国内源 #Fri Nov 08 15:46:05 CST 2024 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-8.4-bin.zip zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/dists1…

[Admin] Dashboard Filter for Mix Report Types

Background RevOps team has built a dashboard for sales team to track team members’ performance, but they’re blocked by how to provide a manager view based on sales’ hierarchy. Therefore, they seek for dev team’s help to clear their blocker. From foll…

2024年人工智能技术赋能网络安全应用测试:广东盈世在钓鱼邮件识别场景荣获第三名!

近期&#xff0c;2024年国家网络安全宣传周“网络安全技术高峰论坛主论坛暨粤港澳大湾区网络安全大会”在广州成功举办。会上&#xff0c;国家计算机网络应急技术处理协调中心公布了“2024年人工智能技术赋能网络安全应用测试结果”。结果显示&#xff0c;广东盈世计算机科技有…

Java进阶四-异常,File

异常 概念&#xff1a;代表程序出现的问题。 目的&#xff1a;程序出现了异常我们应该如何处理。 最高父类&#xff1a;Exception 异常分为两类 编译时异常&#xff1a;没有继承RuntimeException的异常,直接继承与Exception,编译阶段就会错误提示。运行时异常:RuntimeExc…

ERROR TypeError: AutoImport is not a function

TypeError: AutoImport is not a function 原因&#xff1a;unplugin-auto-import 插件版本问题 Vue3基于Webpack&#xff0c;在vue.config.js中配置 当unplugin-vue-components版本小于0.26.0时&#xff0c;使用以下写法 const { defineConfig } require("vue/cli-se…

Elasticsearch:更好的二进制量化(BBQ)对比乘积量化(PQ)

作者&#xff1a;来自 Elastic Benjamin Trent 为什么我们选择花时间研究更好的二进制量化而不是在 Lucene 和 Elasticsearch 中进行生产量化。 我们一直在逐步使 Elasticsearch 和 Lucene 的向量搜索变得更快、更实惠。我们的主要重点不仅是通过 SIMD 提高搜索速度&#xff0…

检查课程是否有效

文章目录 概要整体架构流程技术细节小结 概要 这是一个微服务内部接口&#xff0c;当用户学习课程时&#xff0c;可能需要播放课程视频。此时提供视频播放功能的媒资系统就需要校验用户是否有播放视频的资格。所以&#xff0c;开发媒资服务&#xff08;tj-media&#xff09;的…

红外遥控报警器设计(模电课设)

一、设计要求 利用NE555p芯片设计制作报警器。要求当有人遮挡红外光时发出报警信号&#xff0c;无人遮挡红外光时报警器不工作&#xff0c;即不发声。 二、元器件 555芯片&#xff1a;NE555P 集成运放&#xff1a;LM358 三级管&#xff1a;2N1711 蜂鸣器&#xff1a;HY-30…

Spring MVC——针对实习面试

目录 Spring MVC什么是Spring MVC&#xff1f;简单介绍下你对Spring MVC的理解&#xff1f;Spring MVC的优点有哪些&#xff1f;Spring MVC的主要组件有哪些&#xff1f;Spring MVC的工作原理或流程是怎样的&#xff1f;Spring MVC常用注解有哪些&#xff1f; Spring MVC 什么是…

机器学习(贝叶斯算法,决策树)

朴素贝叶斯分类 贝叶斯分类理论 假设现有两个数据集&#xff0c;分为两类 我们现在用p1(x,y)表示数据点(x,y)属于类别1(图中红色圆点表示的类别)的概率&#xff0c;用p2(x,y)表示数据点(x,y)属于类别2(图中蓝色三角形表示的类别)的概率&#xff0c;那么对于一个新数据点(x,y)…

题目讲解18 有效的括号

原题链接&#xff1a; 20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 思路分析&#xff1a; 第一步&#xff1a;先搭建一个数据结构——栈。 typedef char STDataType; typedef struct Stack {STDataType* arr;int top, capacity; } Stack;//初始化 void StackIn…

HarmonyOS笔记5:ArkUI框架的Navigation导航组件

ArkUI框架的Navigation导航组件 在移动应用中需要在不同的页面进行切换跳转。这种切换和跳转有两种方式&#xff1a;页面路由和Navigation组件实现导航。HarmonyOS推荐使用Navigation实现页面跳转。在本文中在HarmonyOS 5.0.0 Release SDK (API Version 12 Release)版本下&…

【C++】第九节:list

1、list的介绍及使用 1.1 list的介绍 list - C 参考 1.2 list的使用 1.2.1 list的构造 void TestList1() {list<int> l1; // 构造空的l1list<int> l2(4, 100); // l2中包含4个值为100的元素list<int> l3(l2.begin(), l2.end()); // 用l2的[begin(),end())…

Idea中创建和联系MySQL等数据库

备注&#xff1a;电脑中要已下好自己需要的MySQL数据库软件 MySQL社区版下载链接&#xff1a; https://dev.mysql.com/downloads/installer/ 优点&#xff1a; 1.相比与在命令行中管理数据库&#xff0c;idea提供了图形化管理&#xff0c;简单明了&#xff1b; 2.便于与后端…

Linux_shell脚本if语句详细教程

前言 在 Linux Shell 脚本中&#xff0c;if 语句用于基于条件执行命令或代码块。它的基本语法结构如下&#xff1a; if 条件; then# 如果条件为真时执行的代码 elif 另一个条件; then# 如果另一个条件为真时执行的代码 else# 如果所有条件都不成立时执行的代码 fi一、if 语句…

Python自学之Colormaps指南

目录 1.色彩映射表&#xff08;Colormaps&#xff09;是什么&#xff1f; 2.Matplotlib中的色彩映射表类型 2.1同色渐变&#xff08;Sequential Colormaps&#xff09; 2.2双色渐变&#xff08;Divergence Colormaps&#xff09; 2.3定性色彩&#xff08;Qualitative Col…