当前位置: 首页 > article >正文

【C++】泛型编程 ⑥ ( 类模板 | 类模板语法 | 代码示例 )

文章目录

  • 一、类模板
    • 1、类模板引入
    • 2、声明类模板语法
    • 3、调用类模板语法
  • 二、代码示例 - 类模板
    • 1、代码示例
    • 2、执行结果






一、类模板




1、类模板引入


类模板 与 函数模板 的 作用类似 ,

当 多个类 功能相同 , 只是数据类型不同 ,

此时可以 定义一个类模板 代替 定义多个类 ;


借助 " 类模板 " 可以 使用一种模板语法来定义类 , 以实现 处理不同数据类型的类实例 ;

类模板好处 : 使用 类模板 编写出 更加通用和可复用的代码 , 避免重复编写 相同或类似的代码 ;


类模板 常用于 表示 数组 , 线性表 , 树 , 图 等 数据结构 ;

这些数据结构的 节点数据类型 可以使用 类模板 , 同一个数据结构可以存储不同类型的数据 ;

linux 内核链表 就是使用了 类似 类模板 的技术 , 可以存储各种不同类型的数据 , 是一个万能链表 ;


2、声明类模板语法


类模板语法 : 先声明 类型形式参数表 , 然后 使用 类型形式参数表 中的类型 实现 类模板的类声明 ;

template <类型形式参数表>
class 类模板名称
{
	// 类声明
}

类型形式参数表 的格式如下 : 由若干 typename 泛型类型 组成 , 多个之间使用逗号隔开 ;

typename 泛型类型, typename 泛型类型2, ... , typename 泛型类型n

泛型类型 使用 大写字母表示 , 一般是 T ;

  • 定义一个泛型 : 在尖括号中只 声明 一个泛型 ;
template <typename T>  
  • 定义多个泛型 : 再见括号中 声明 多个泛型 , 泛型之间 使用 逗号隔开 ;
template <typename T, typename X, typename Y>  

类模板示例 : 在下面的 示例 中 , MyClass 是一个类模板 , 在该 类模板 张红使用一个 泛型参数 T 来定义 成员变量 ;

template <typename T>  
class MyClass {  
public:  
    T value;  
    MyClass(T val) : value(val) {}  
    void printValue() {  
        std::cout << value << std::endl;  
    }  
};

3、调用类模板语法


调用类模板时 , 首先要 在 类名称后面 使用 尖括号 <> 声明 泛型类型 , 然后创建该 类模板 实例对象 ;

类名<泛型类型> 实例对象名称;

上个章节中的 MyClass 类模板使用示例 :

  • 泛型类型为 int 类型的 类模板 调用 :
MyClass<int> myInt(10); // 创建一个 int 类型的实例  
myInt.printValue(); 	// 输出:10  
  • 泛型类型为 double 类型的类模板调用 :
MyClass<double> myDouble(10.0); // 创建一个 double 类型的实例  
myDouble.printValue(); 		 // 输出:10.0  

类模板中 , 成员变量 T 类型数据 , 可以指定不同的数据类型 ;





二、代码示例 - 类模板




1、代码示例


代码示例 :

在下面的代码中 , 声明了类模板 MyClass , 在其中 声明了 T 泛型类型的 成员变量 ;

创建该 类模板 实例对象 时 , 声明变量时 , 需要先显式指定泛型 T 的类型 , 然后再创建 类对象 ;

#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;
    }
};

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

	return 0;
}

2、执行结果


执行结果 :

10
10
hello

在这里插入图片描述


http://www.kler.cn/a/132382.html

相关文章:

  • vue 常用特性 ( 计算属性 | 侦听器 | 过滤器 )
  • 【WPF】Prism学习(七)
  • 独立站干货:WordPress主机推荐
  • leetcode 扫描线专题 06-leetcode.836 rectangle-overlap 力扣.836 矩形重叠
  • 集群聊天服务器(9)一对一聊天功能
  • gvim添加至右键、永久修改配置、放大缩小快捷键、ctrl + c ctrl +v 直接复制粘贴、右键和还原以前版本(V)冲突
  • PyCharm中常用插件推荐
  • 【Mysql】学习笔记
  • U-boot(二):主Makefile
  • 大型且复杂项目的资源管理怎么做?
  • 模拟实现一个Linux中的简单版shell
  • 6.docker运行mysql容器-理解容器数据卷
  • 邀请报名|11月24日阿里云原生 Serverless 技术实践营 深圳站
  • 概率论和数理统计(四)方差分析与回归分析
  • Windows10下Mysql8.0安装教程
  • 圆弧插补-逐点比较法
  • 【机器学习Python实战】线性回归
  • 计算机视觉的应用16-基于pytorch框架搭建的注意力机制,在汽车品牌与型号分类识别的应用
  • 力扣:168. Excel表列名称(Python3)
  • Qt退出界面
  • 微信小程序Error: ENOENT: no such file
  • Django学习日志04
  • py 动态输入参数
  • 什么是跨境电子商务综合试验区?成为综试区有何好处?
  • 现货黄金职业交易员怎么使用技术分析?
  • 【数据结构 | 链表】leetcode 2. 两数相加