C++模板类的介绍

C++模板类的介绍
C++模板类是一种通用编程技术,允许程序员创建可处理多种数据类型的通用类。通过使用模板,我们可以编写一段能够处理不同类型数据的代码,而无需为每一种数据类型单独编写特定的代码。这大大增强了代码的复用性和灵活性。

基本概念
模板参数:在声明模板类时,我们可以定义一个或多个类型参数,这些参数在实例化模板类时会被具体的类型替换。
模板实例化:当使用具体类型来创建一个模板类的对象时,编译器会生成该类型的类的实例。这个过程称为模板实例化。
模板类的语法
模板类的声明通常以template关键字开始,后接尖括号<>内的一个或多个类型参数。

一个简单的例子:

template <typename T>  
class MyArray {  
private:  
T* arr;  
int size;  
public:  
MyArray(T* array, int arraySize): arr(array), size(arraySize) {}  
T getElement(int index) { return arr[index]; }  
// ... 其他成员函数 ...  
};

MyArray是一个可以存储任何类型的数组的模板类。T是一个类型参数,可以在实例化时用任何类型(如int、double等)替换。

模板类的实例化
要使用模板类,需要用具体的类型来实例化它。
例如:

int main() {  
int myInts[] = {1, 2, 3, 4, 5};  
MyArray<int> intArray(myInts, 5); // 使用 int 类型实例化 MyArray 类  
// ... 使用 intArray ...  
return 0;  
}

栈实现的小例子:

#include<iostream>  
using namespace std;  
  
template <typename T>  
class Stack {  
private:  
    T* stackArr;  
    int top;  
    int capacity;  
  
public:  
    Stack(int size = 10) { // 构造函数,设置默认大小为10  
        stackArr = new T[size];  
        capacity = size;  
        top = -1;  
    }  
  
    ~Stack() { // 析构函数,删除动态分配的内存  
        delete[] stackArr;  
    }  
  
    void push(T data) { // 入栈操作  
        if (top == capacity - 1) {  
            cout << "栈溢出,无法添加元素" << endl;  
            return;  
        }  
        top++;  
        stackArr[top] = data;  
    }  
  
    T pop() { // 出栈操作  
        if (isEmpty()) {  
            cout << "栈为空,无法删除元素" << endl;  
            exit(EXIT_FAILURE); // 如果栈为空则退出程序  
        }  
        T popped = stackArr[top];  
        top--;  
        return popped;  
    }  
  
    T peek() { // 查看栈顶元素但不删除  
        if (!isEmpty())  
            return stackArr[top];  
        else  
            exit(EXIT_FAILURE); // 如果栈为空则退出程序  
    }  
  
    int size() { // 返回栈的大小  
        return top + 1;  
    }  
  
    bool isEmpty() { // 检查栈是否为空  
        return top == -1;  
    }  
};
int main() {  
    Stack<int> intStack; // 创建一个整数类型的栈  
    intStack.push(10); // 入栈一个整数  
    intStack.push(20); // 入栈一个整数  
    cout << "栈顶元素:" << intStack.peek() << endl; // 查看并输出栈顶元素,应为20  
    cout << "栈的大小:" << intStack.size() << endl; // 输出栈的大小,应为2  
    intStack.pop(); // 出栈一个整数,此时栈顶元素应为10  
    cout << "栈顶元素:" << intStack.peek() << endl; // 查看并输出栈顶元素,应为10  
    // ... 其他操作 ...  
    return 0;  
}

模板类的优点和注意事项
类型安全:模板类在编译时进行类型检查,有助于提前发现类型错误。
代码重用:通过模板类,我们可以编写一段通用的代码,然后用不同的数据类型实例化它,从而避免重复编写类似的代码。这大大提高了开发效率。
灵活性:模板类可以接受用户自定义的类型,使得它们能够轻松适应各种复杂的编程场景。
性能优化:由于模板是在编译时展开的,编译器有机会进行更多的优化,从而生成更高效的代码。
然而,这也可能导致代码膨胀(code bloat),因为每个不同的类型实例都会生成独立的代码。因此,在使用模板时要特别注意避免不必要的复杂性和潜在的代码膨胀问题。

公众号

一个以算法与工程技术为核心的公众号,欢迎关注交流~
在这里插入图片描述

个人水平有限,有问题随时联系~

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

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

相关文章

飞天使-linux操作的一些技巧与知识点2-TCP的三次握手以及四次挥手以及转换状态

文章目录 TCP 的三次握手四次挥手转换状态 TCP 的三次握手 第一次&#xff0c;客户端与服务端建立链接&#xff0c;需要发送请求连接的消息 第二次&#xff0c;服务端接口到数据后&#xff0c;返回一个确认的操作*&#xff08;至此客户端和服务端链路建立成功&#xff09; 第三…

binlog+mysqldump恢复数据(误删数据库或者表)

表删除恢复 1、准备数据 首先准备数据库环境&#xff0c;测试数据库为speech1&#xff0c;如下&#xff1a; 为test数据表添加3条记录&#xff0c;如下&#xff1a;三行为新加的记录&#xff0c;添加后将test表删除。 2、恢复数据 查看binlog日志状态 SHOW MASTER STATUS…

汽车服务行业分析:预计2028年将达到38亿元

在推进加快检验机构建设同时&#xff0c;综合评估检验机构数量、分布和检测能力&#xff0c;探索试点汽车 4S 店开展检验&#xff0c;提供维修、保养、车检一体化服务。汽车服务主要是指围绕汽车展开的一系列服务活动&#xff0c;包括维修、美容、金融等&#xff0c;除具有一般…

c/c++ 结构体、联合体、枚举

结构体 结构体内存对齐规则&#xff1a; 1、结构体的第一个成员对齐到结构体变量起始位置偏移量为0的地址处 2、其他成员变量要对齐到某个数字&#xff08;对齐数&#xff09;的整数倍的地址处。 对齐数&#xff1a;编译器默认的一个对齐数与该成员变量大小的较小值。 vs 中…

【STM32】电机驱动

一、电机分类 二、直流电机的分类 1.有刷电机 2.无刷电机 3.直流减速电机 三、H桥电路 正向旋转 驱动Q1和Q4 反向旋转 驱动Q2和Q3 四、MC3386电机驱动芯片 1.基本原理图 1&#xff09;前进/后退&#xff1a;IN1和IN2的电平顺序决定电机的正反转 2&#xff09;调节速度&#…

设计未泄密,图纸有守护者——迅软DSE加密软件专题解析!

为何使用图纸加密软件&#xff1f; 对于许多设计单位&#xff08;如&#xff1a;建筑设计、鞋服设计、勘察测绘、平面设计等&#xff09;而言&#xff0c;其内部海量的设计图纸都是以电子文件的形式存在于终端电脑和服务器上。而在图纸的设计生产过程中&#xff0c;一般会经过…

【ArcGIS微课1000例】0079:ArcGIS Earth根据经纬坐标生成点shapefile

本文以气象台站数据的生成为例,详细介绍ArcGIS Earth中导入X、Y经纬度坐标,生成Shapefile点数据的流程。 文章目录 一、气象台站分布二、添加经纬度坐标三、符号化设置四、另存为一、气象台站分布 根据气象台站的经纬度坐标,可以很方便的在各种GIS平台上生成点,并保存为多…

Python从入门到精通七:Python函数进阶

函数多返回值 学习目标&#xff1a; 知道函数如何返回多个返回值 问: 如果一个函数如些两个return (如下所示)&#xff0c;程序如何执行&#xff1f; 答&#xff1a;只执行了第一个return&#xff0c;原因是因为return可以退出当前函数&#xff0c;导致return下方的代码不执…

如何通过上下滑动实现亮度和音量调节(ArkUI)

场景说明 在音视频应用中通常可以通过上下滑动来调节屏幕亮度和音量大小&#xff0c;本例即为大家介绍如何实现上述UI效果。 说明&#xff1a; 由于当前亮度和音量调节功能仅对系统应用开发&#xff0c;所以本例仅讲解UI效果的实现。 效果呈现 本例效果如下&#xff1a; 当在…

Apollo入门与工作原理Apollo与Nacos的区别

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

【尘缘送书第七期】2023年度盘点:智能汽车 | 自动驾驶 | 车联网

【文末送书】今天推荐几本智能汽车 | 自动驾驶 | 车联网领域优质书籍。 目录 引言1 《智能汽车》2 《SoC底层软件低功耗系统设计与实现》3 《SoC设计指南》4 《蜂窝车联网与网联自动驾驶》5 《智能汽车网络安全权威指南&#xff08;上册&#xff09;》6 《智能汽车网络安全权威…

智能优化算法应用:基于萤火虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于萤火虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于萤火虫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.萤火虫算法4.实验参数设定5.算法结果6.参考文…

Mybatis映射接口的动态代理实现原理

Mybatis映射接口的动态代理实现原理 在上一节中&#xff0c;我们介绍了MyBatis的核心配置文件加载流程&#xff0c;Mybatis核心配置文件加载流程详解 在文中&#xff0c;我们介绍了MyBatis在加载配置文件的过程中会针对每个接口类都生成一个相应的MapperProxyFactory动态代理工…

基于FPGA的视频接口之高速IO(光纤)

简介 对于高速IO口配置光纤,现在目前大部分开发板都有配置,且也有说明,在此根据自己的工作经验以及对于各开发板的说明归纳 通过高速IO接口,以及硬件配置,可以实现对于光纤的收发功能,由于GTX的速率在500Mbs到10Gbps之间,但通道高速io可配置光纤10G硬件,物理通完成,则…

【MYSQL】MYSQL 的学习教程(二)之 MYSQL 的七种连接

1. 概述 在实际开发中&#xff0c;大部分的情况下都不是从单表中查询数据&#xff0c;一般都是多张表联合查询取出最终的结果。一个业务都会对应多张表&#xff0c;比如&#xff1a;学生和班级&#xff0c;起码两张表 ①&#xff1a;连接分类&#xff08;功能划分&#xff09…

漏洞复现-云安宝-云匣子Fastjson命令执行(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

(第18天)RMAN Duplicate 异机复制 Oracle 数据库

RMAN Duplicate 异机复制 Oracle 数据库(第18天) RMAN Duplicate 是从 Oracle 10G 开始出现的功能,但是在 11G 时增加了很多功能,可以通过 Active Database Duplicate 和 Backup-based Duplicate 两种方法实现。 Active database duplicate 功能更加强大,不需要先对源端…

每日一题 2048. 下一个更大的数值平衡数(枚举)

乍一看没什么想法&#xff0c;但它的 x 是有限的&#xff0c;而题目规定的数值平衡数的要求很严格&#xff0c;相对来说只有少部分数满足要求&#xff0c;所以想到了枚举的方法通过寻找所有在范围内的全排列中满足数值平衡数的要求的数&#xff0c;找到最接近 n 的一个官方给出…

事件驱动架构 vs. RESTful架构:通信模式对比与选择

1. 通信风格 事件驱动架构&#xff08;EDA&#xff09; 是一种异步通信风格&#xff0c;组件之间通过产生和消费事件进行通信。 事件是表示系统中重大变化或事件的消息&#xff0c;并分发给感兴趣的组件。这种通信模型允许系统的不同部分之间进行解耦和动态交互。 组件充当事件…

三天精通Selenium Web 自动化 - Selenium(Java)环境搭建 (new)

0 背景 开发工具idea代码管理mavenjdk1.8webdriver chrome 1 chromedriver & chrome chromedriver和chrome要对应上&#xff1a; chomedriver下载地址&#xff1a;淘宝镜像 这里用的是 chromedriver88-0-4324-96.zipchrome下载地址&#xff1a;如何降级和安装旧版本的C…