c++中类模板的使用

C++中的类模板(Class Template)是一种用于创建通用类的机制,它允许我们编写与类型无关的类,从而使代码更加泛型化和重用性更高。通过使用类模板,我们可以在不改变代码的情况下处理不同的数据类型。


一、类模板的基本语法

template <typename T>
class ClassName {// 类的成员变量和函数
};
  • template:声明这是一个模板。
  • <typename T>:定义模板参数,T是一个占位符,表示类型。

示例:

template <typename T>
class MyClass {
public:MyClass(T value) : data(value) {}void display() const {std::cout << data << std::endl;}
private:T data;
};

二、类模板的使用

当我们需要使用类模板时,需要在类名后面指定实际的类型参数。

示例:

int main() {MyClass<int> intObj(10);intObj.display(); // 输出:10MyClass<std::string> strObj("Hello");strObj.display(); // 输出:Helloreturn 0;
}

三、类模板的成员函数定义

类模板的成员函数可以在类内或类外定义。

类外定义示例:

template <typename T>
class MyClass {
public:MyClass(T value);void display() const;
private:T data;
};template <typename T>
MyClass<T>::MyClass(T value) : data(value) {}template <typename T>
void MyClass<T>::display() const {std::cout << data << std::endl;
}

注意:在类外定义成员函数时,需要在函数名前加上template <typename T>,并在类名后加上<T>


四、类模板的特化

1. 全特化

针对特定类型提供特殊实现。

// 通用模板
template <typename T>
class MyClass {// 通用实现
};// 针对int类型的特化
template <>
class MyClass<int> {// 针对int的实现
};

2. 部分特化

对一部分模板参数进行特化。

template <typename T>
class MyClass<T*> {// 针对指针类型的实现
};

五、类模板的继承

类模板可以继承自普通类或另一个类模板。

template <typename T>
class Base {// 基类内容
};template <typename T>
class Derived : public Base<T> {// 派生类内容
};

六、类模板与友元

在类模板中声明友元时,需要注意模板参数的使用。

template <typename T>
class MyClass {friend void friendFunction<>(MyClass<T>);// ...
};

七、示例:实现一个通用的数组类

template <typename T>
class Array {
public:Array(int size) : size(size) {data = new T[size];}~Array() {delete[] data;}T& operator[](int index) {return data[index];}
private:T* data;int size;
};int main() {Array<int> intArray(5);for (int i = 0; i < 5; ++i) {intArray[i] = i * 10;}for (int i = 0; i < 5; ++i) {std::cout << intArray[i] << " "; // 输出:0 10 20 30 40}return 0;
}

八、注意事项

  • 模板的实现通常放在头文件中:因为模板是在编译时实例化的,所以实现需要在头文件中可见。
  • 不能对模板参数类型进行自动推导:使用类模板时,必须显式指定模板参数类型。
  • 编译器错误信息可能较复杂:模板错误可能导致难以理解的编译错误信息,需要耐心调试。

九、总结

类模板是C++提供的强大工具,能够让我们编写通用的、类型无关的代码。通过类模板,可以提高代码的重用性,减少重复劳动。在使用过程中,需要熟悉模板的语法和特性,以充分发挥其优势。


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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

简单了解Redis(初识阶段)

1.认识Redis 对于Redis有一个很重要的点就是&#xff0c;它存储数据是在内存中存储的。 但是对于单机程序&#xff0c;直接通过变量存储数据的方式是更优的&#xff0c;在分布式系统下 Redis才能发挥威力 因为进程是有隔离性的&#xff0c;Redis可以基于网络&#xff0c;把进…

Lesson1 MySQL的安装(环境为CentOS云服务器)

卸载内置环境 我们初期使用root账号&#xff0c;后期再切换成普通账号 使用 ps axj | grep mysql 查看系统中是否有MySQL相关的进程 使用 systemctl stop mysqld 关停进程 使用 rpm -qa | grep mysql 查看MySQL相关的安装包 使用 rpm -qa | grep mysql | xargs yum -y remo…

计算机毕业设计非遗项目网站 登录注册搜索 评论留言资讯 前后台管理/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

遗项目网站需求&#xff0c;以下是一个基于Spring Boot、Java Web、J2EE技术栈&#xff0c;使用MySQL数据库&#xff0c;并结合Vue实现前后端分离的简要设计方案&#xff1a; 系统功能概述 ‌用户登录与注册‌&#xff1a;实现用户的注册、登录功能&#xff0c;确保用户信息的…

【Docker】解决Docker Engine stopped

解决Docker Engine stopped 解决Docker Engine stopped1.检查虚拟设置2 安装wslwindows安装wsl 解决Docker Engine stopped 在安装完docker之后不少用户会遇到Docker Engine stopped。下面就下给出解决方法让docker正常运行起来 1.检查虚拟设置 打开任务管理器查看cpu页面&a…

华为全联接大会HUAWEI Connect 2024印象(五):讯飞星火企业级智能体平台

在HC大会上&#xff0c;除了有华为自己的产品&#xff0c;还有很多合作伙伴的产品&#xff0c;今天就简单说一下讯飞星火的企业级智能体平台。讯飞星火此次在HC上有多个展台。我以前是讯飞星火的拥泵&#xff0c;在B站发过视频介绍其API的使用&#xff08;利用API访问讯飞星火认…

PR视频剪辑工具全指南:开启专业剪辑之旅

pr视频剪辑可以说是视频剪辑里的一把好手&#xff0c;就是如果你想在这方面深耕那还是掌握这个工具的使用比较方便。如果你只是刚入门&#xff0c;那也有不少可以快速帮你剪辑出片的工具。这次我介绍几款我用过的视频剪辑工具&#xff0c;助你开启视频剪辑大门。 1.福昕视频剪…

构建预测睡眠质量模型_相关性分析,多变量分析和聚类分析

数据入口&#xff1a;睡眠质量记录数据集 - Heywhale.com 本数据集目的是探究不同因素是如何影响睡眠质量和整体健康的。 数据说明 字段说明Heart Rate Variability心率变异性&#xff1a;心跳时间间隔的模拟变化Body Temperature体温&#xff1a;以摄氏度为单位的人工生成体…

深度学习(2):梯度下降

文章目录 梯度下降梯度是什么常见梯度下降算法 代码实现批量梯度下降 梯度下降 梯度是什么 类似y ax b这种单变量的函数来说&#xff0c;导数就是它的斜率&#xff0c;这种情况下可以说梯度就是导数。 但在多变量函数中&#xff0c;梯度是一个向量&#xff0c;其分量是各个…

时间序列LSTM实现

这个代码参考了时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)_lstm预测模型-CSDN博客 结合我之前所学的lstm-seq2seq里所学习到的知识对其进行预测 import time import numpy as np import pandas as pd import torch import…

STM32F407之超声波模块使用

#include "sys.h" #include "delay.h" #include "usart.h" #include "includes.h" #include "HC_SR04.h"int main() {OS_ERR err;//错误uart_init(9600);//串口初始化//超声波初始化HC_SR04();//OS初始化 他是第一个运行的函…

Karmada新版本发布,支持联邦应用跨集群滚动升级

摘要&#xff1a;本次升级支持联邦应用跨集群滚动升级&#xff0c;使用户版本发布流程更加灵活可控&#xff1b;透明同事karmadactl 新增了多项运维能力&#xff0c;提供独特的多集群运维体验。 本文分享自华为云社区 《Karmada v1.11 版本发布&#xff01;新增应用跨集群滚动升…

nfs版本问题导致挂载失败

一、系统环境 环境版本操作系统Linux Mint 22 Wilma内核版本6.8.0-44-genericgcc 版本arm-none-linux-gnueabihf-gcc (GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)) 9.2.1 20191025uboot 版本2020.01开发板Linux版本5.4.31 二、问题描述 内核通过…

Unity开发绘画板——03.简单的实现绘制功能

从本篇文章开始&#xff0c;将带着大家一起写代码&#xff0c;我不会直接贴出成品代码&#xff0c;而是会把写代码的历程以及遇到的问题、如何解决这些问题都记录在文章里面&#xff0c;当然&#xff0c;同一个问题的解决方案可能会有很多&#xff0c;甚至有更好更高效的方式是…

微信小程序——引入 iconfont 矢量图标,如何使用引用阿里巴巴矢量图标

本文介绍如何在小程序中加入图标&#xff0c;效果如下图&#xff1a; 1、访部iconfont-阿里巴巴矢量图标库 找到需要的图标&#xff0c;然后添加入库 将增加好的图标添加到项目中 2、点击更新生成代码 生成后如下图 3、打开生成的css样式文件 4、在小程序中新建/static/iconfon…

AI大模型助力数据消费,构建数据飞轮科学、高效的体系

随着互联网的技术高速发展&#xff0c;越来越多的应用层出不穷&#xff0c;伴随着数据应用的需求变多&#xff0c;为快速响应业务需求&#xff0c;很多企业在初期没有很好的规划的情况下&#xff0c;存在不同程度的烟囱式的开发模式&#xff0c;这样会导致企业不同业务线的数据…

**CentOS7安装redis**

CentOS7安装redis 首先解压压缩包 redis-7.0.0.tar.gz tar -xvf redis-7.0.0.tar.gz接着进入到redis中 cd redis-7.0.0.tar.gz执行make命令编译 make接着执行安装命令 make install之后编译安装完后 程序都会在/usr/local/bin目录下 这里需要将在redis目录中redis.conf配置…

Kubernetes从零到精通(14-Storage)

存储简介 在Kubernetes中&#xff0c;存储是一个关键的部分&#xff0c;用于持久化应用程序的数据。Kubernetes的存储模型支持多种存储类型&#xff0c;并且能根据应用程序的需求动态地提供存储资源。以下是Kubernetes存储的基本概念和机制。 Kubernetes支持很多类型的卷。Pod可…

【Java面向对象高级一08】继承_使用继承的好处

前言 一、继承是什么&#xff1f; 二、使用继承的好处 总结 前言 继承的学习 一、继承是什么&#xff1f; Java中提供了一个关键字extends&#xff0c;用这个关键字&#xff0c;可以让一个类和另一个类建立起父子关系。extends(中文意思就是继承)。 继承的意思是&#xf…

Redis实战--Redis的数据持久化与搭建Redis主从复制模式和搭建Redis的哨兵模式

Redis作为一个高性能的key-value数据库&#xff0c;广泛应用于缓存、消息队列、排行榜等场景。然而&#xff0c;Redis是基于内存的数据库&#xff0c;这意味着一旦服务器宕机&#xff0c;内存中的数据就会丢失。为了解决这个问题&#xff0c;Redis提供了数据持久化的机制&#…

C语言 | Leetcode C语言题解之第434题字符串中的单词数

题目&#xff1a; 题解&#xff1a; int countSegments(char * s){int count 0; //count用来记录单词个数for(int i0; i < strlen(s); i){ //遍历字符串 if((i 0 || s[i-1] ) && s[i] ! ) //一个…