【第七天】C++模板探秘:函数模板、类模板以及类型转换的深入解析

一、模板的概述

c++面向对象编程思想:封装、继承、多态

c++泛型编程思想:模板

模板的分类:函数模板类模板 

        函数模板(类模板):将功能相同,类型不同的函数(类)的类型抽象成虚拟的类型(函数类型和形参类型不具体指定)。不必定义多个函数,当调用函数(类实例化对 象)的时候,编译器自动将虚拟的类型 具体化。

二、函数模板

1、关键字template说明

函数模板 会编译两次:

        第一次:对函数模板 代码本身编译

        第二次:函数调用处 将T的类型具体化替换后的代码进行编译

函数模板目标:模板是为了实现泛型,可以减轻编程的工作量,增强函数的重用性。

2、注意点

(1)函数模板 和 普通函数 都识别,同名时优先选择 普通函数。

(2)函数模板 和 普通同名函数 都存在时,强制使用函数模板:

 (3)有函数模板 自动类型推导时,一般不会对其函数参数 进行 自动类型转换,普通函数会自动类型转换。

 (4)函数模板可以重载

(5)模板的局限性:当函数模板 推导出 T为数组、结构体或其他自定义类型数据 可能导致运算符 不识别。

解决办法1:运算符重载

解决办法2:具体化函数模板 

 三、类模板

1、定义

        有两个或多个类,其功能是相同的,仅仅是数据类型不同。类模板用于实现类所需数据的类型参数化。

类模板 将类中类型 抽象成虚拟类型:

类模板 的成员函数 在类外实现:

 2、函数模板作为类模板的友元

 3、普通函数作为类模板的友元

四、类模板的继承 

1、类模板 派生出 普通类

 2、类模板 派生出 类模板

3、类模板头文件 和源文件不可分离

类模板存储在.hpp(头文件和源文件结合)中

data.hpp

#ifndef DATA_H
#define DATA_H
#include<iostream>
using namespace std;
template<class T1,class T2>
class Data
{
private:T1 a;T2 b;
public:Data();Data(T1 a,T2 b);void showData(void);
};
template<class T1, class T2>
Data<T1, T2>::Data()
{cout<<"无参构造"<<endl;
}
template<class T1, class T2>
Data<T1,T2>::Data(T1 a, T2 b)
{this->a=a;this->b=b;
}
template<class T1, class T2>
void Data<T1,T2>::showData(void)
{cout<<a<<" "<<b<<endl;
}#endif // DATA_H

主测试程序main.cpp

#include <iostream>
#include"data.hpp"using namespace std;int main(int argc, char *argv[]){Data<int,char> ob(10,'A');ob.showData();return 0;}

五、设计数组类模板

六、C++中类型转换

1、上行、下行转换

 2、static_cast静态类型转换

        类型转换(cast)是将一种数据类型转换成另一种数据类型。

        static_cast静态类型转换用于类层次结构中基类(父类)和派生类(子类)之间指针或引用转换

基本类型:支持

int num = static_cast<int>(3.14);//3.14转成int类型ok

定义三个无数据类如下

class Base{};class Son:public Base{};class Other{};

上行转换:支持 安全

Base *p = static_cast(new Son);

下行转换:支持 (不安全

Son *p2 = static_cast(new Base);  

不相关类型转换:不支持

Base *p3 = static_cast(new Other);//err报错

 3、dynamic_cast静态类型转换

        dynamic_cast主要用于类层次间的上行转换和下行转换。在类层次间进行上行转换时,dynamic_cast 和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比.static_cast更安全。

基本类型:不支持

int num = static_cast<int>(3.14);//err

上行转换:支持 

Base *p = static_cast(new Son);

下行转换:不支持 不安全

Son *p2 = static_cast(new Base); //err

不相关类型转换:不支持

Base *p3 = static_cast(new Other);//err

4、const_cast常量转换

        该运算符用来修改类型的const属性。

(1)常量之间可直接        const属性转换

const int num1=10;
int data1=num1;int num2=10;
const int data2=num2;

(1)将const修饰的指针或引用 转换成 非const

const int *p1;
int *p2 = const_cast<int *>(p1);const int &ob = 10;
int &ob1 = const_cast<int &>(ob);

(2)将非const修饰的指针或引用 转换成 const

int *p3;
const *p4 = const_cast<int *>(p3);//或const *p4 = p3;int data = 10;
const int &ob2 = const_cast<const int &>(data);//或const int &ob2 =data;

5、重新解释转换(reinterpret_cast) (最不安全)

        除基本类型不可强转,其他均可强制类型转换。

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

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

相关文章

QoS 服务质量

服务质量 QoS (Quality of Service) 服务质量可用若干基本性能指标来描述&#xff0c;包括&#xff1a;可用性、差错率、响应时间、吞吐量、分组丢失率、连接建立时间、故障检测和改正时间等。 服务提供者可向其用户保证某一种等级的服务质量。 服务性能的总效果&#xff0c;…

svn客户端下载、安装、使用

下载、使用 打开360软件管家&#xff0c;选怎宝库&#xff0c;搜索svn&#xff0c;点击安装 可以修改安装路径 使用 在桌面右键弹出菜单&#xff0c;点击 输入地址&#xff0c;点击ok 输入用户名、密码 &#xff0c;等待检出完成

手把手教你安装和激活Fl Studio21.2.3.4004破解补丁(附激活教程)

盼望着盼望着&#xff0c;FL Studio21带这它的版本号2.3.4004来了&#xff0c;是最新版Fl Studio21.2.3.4004 关于FL Studio21.2.3.4004破解激活&#xff0c;跟之前版本一样&#xff0c;这篇文章将给大家带来FL Studio 21.2.3.400彻底激活教程&#xff0c;喜欢的朋友欢迎一键3连…

第八篇【传奇开心果系列】python的文本和语音相互转换库技术点案例示例:Google Text-to-Speech虚拟现实(VR)沉浸式体验经典案例

传奇开心果博文系列 系列博文目录python的文本和语音相互转换库技术点案例示例系列 博文目录前言一、雏形示例代码二、扩展思路介绍三、虚拟导游示例代码四、交互式学习示例代码五、虚拟角色对话示例代码六、辅助用户界面示例代码七、实时语音交互示例代码八、多语言支持示例代…

守护进程出现拉起多个子进程问题

引言 在我自己开发的httpApi进程中&#xff0c;使用了守护进程&#xff0c;保证进程在意外退出的时候可以重新自动启动。但是使用pstree的时候发现创建了不止一个进程&#xff0c;其中代码和问题现象如下&#xff1a; 代码 int main(int argc, char *argv[]) {printMainVer()…

计算机网络-网络层,运输层,应用层

网络层/网际层 网络层的主要任务包括&#xff1a; 提供逻辑上的端到端通信&#xff1a;网络层负责确定数据的传输路径&#xff0c;使数据能够从源主机传输到目标主机&#xff0c;即实现端到端的通信。数据包的路由和转发&#xff1a;网络层根据目标主机的地址信息&#xff0c…

MySQL事务(基础入门)(高频考点)

文章目录 前言什么是事务&#xff1f;事务的特性并发情况下会出现哪些问题脏读不可重复读幻读 总结 前言 今天来讲一讲 MySQL 事务的基础入门。 更多关于MySQL的知识可以看此专栏 MySQL专栏&#xff08;持续更新&#xff09; 什么是事务&#xff1f; 当我们在操作数据库的时…

深入探索Linux:ACL权限、特殊位与隐藏属性的奥秘

前言&#xff1a; 在Linux系统中&#xff0c;文件和目录的权限管理是一项至关重要的任务。它决定了哪些用户或用户组可以对文件或目录执行读、写或执行等操作。传统的Linux权限模型基于用户、组和其他的概念&#xff0c;但随着时间的推移&#xff0c;这种模型在某些情况下显得…

​​​​​​​Sora:OpenAI的革命性AI视频模型与其对未来影像创作的影响

随着深度学习技术和计算能力的进步&#xff0c;人工智能不仅在图像识别、自然语言处理等领域取得了卓越成就&#xff0c;同时也在不断突破视频处理和生成的边界。在这一背景下&#xff0c;OpenAI推出了Sora——一种新型的AI视频模型&#xff0c;标志着AI在视频内容创作领域的又…

高并发Server的基石:reactor反应堆模式

业务开发同学只关心业务处理流程。但是我们开发的程序都是运行服务端server上&#xff0c;服务端server接收到IO请求后&#xff0c;是如何处理请求并最终进入业务流程的呢&#xff1f;这里不得不提到reactor反应堆模型。nginx tomcat redis nodejs dubbo等软件的网络处理模型都…

snmp协议开通教程

目录 一、什么是snmp协议&#xff1f; 二、snmp协议可以用来干什么&#xff1f; 三、snmp协议的开通 1、snmpv2协议开通 2、snmpv3协议开通 一、什么是snmp协议&#xff1f; SNMP&#xff08;Simple Network Management Protocol&#xff09;是一种用于网络管理的标准协议&a…

LDR6328 PD诱骗芯片:优化小家电Type-C接口充电体验与安全性的关键技术

随着科技的日新月异&#xff0c;小家电设备日趋智能化&#xff0c;Type-C接口因其便捷性在小家电领域的应用也日益增多。然而&#xff0c;Type-C接口的多样性导致设备在识别和使用不同充电方式时面临挑战。为应对这一问题&#xff0c;PD诱骗芯片应运而生&#xff0c;成为解决充…

ONLYOFFICE8.0——赋能办公

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-xdAoM2pHRmDFP0tF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

day41WEB 攻防-通用漏洞XMLXXE无回显DTD 实体伪协议代码审计

本章知识点&#xff1a; 1 、 XML&XXE- 原理 & 发现 & 利用 & 修复等 2 、 XML&XXE- 黑盒模式下的发现与利用 3 、 XML&XXE- 白盒模式下的审计与利用 4 、 XML&XXE- 无回显 & 伪协议 & 产生层面 配套资源&#xff08;百度网盘&#x…

【MySQL】数据库概述

目录 一、为什么使用数据库&#xff1f; 二、数据库与数据库管理系统 2.1 相关概念 2.2 两者关系 三、 MySQL介绍 四、 RDBMS和非RDBMS 4.1 关系型数据库&#xff08;RDBMS&#xff09; 4.2 非关系型数据库&#xff08;非RDBMS&#xff09; 五、关系型数据库设计规则 …

【C语言】linux内核ipoib模块 - ipoib_send

一、中文注释 int ipoib_send(struct net_device *dev, struct sk_buff *skb,struct ib_ah *address, u32 dqpn) {struct ipoib_dev_priv *priv ipoib_priv(dev); // 获取IPoIB设备的私有数据struct ipoib_tx_buf *tx_req; // 发送请求结构体int hlen, rc; // 分别为头部长度…

代码随想录算法训练营第22天—回溯算法02 | ● *216.组合总和III ● 17.电话号码的字母组合

*216.组合总和III 题目链接/文章讲解&#xff1a;https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1wg411873x 考点 回溯剪枝 我的思路 回溯三要素 形参&#xff1a;目标和&#xff0c…

如何使用 NFTScan NFT API 在 Mantle 网络上开发 Web3 应用

Mantle Network 是建立在以太坊区块链之上的第 2 层扩展解决方案&#xff0c;采用了 Optimistic Rollups 技术&#xff0c;由 BitDAO 孵化&#xff0c;以提供比以太坊更快速和更经济的交易体验。由于 Mantle 基础链构建在 OP Stack 之上并与 EVM 兼容&#xff0c;因此以太坊网络…

设备树详解

设备树(Device Tree)基本概念及作用 设备树(Device Tree)基本概念 在内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的…

【Java程序设计】【C00267】基于Springboot的在线考试系统(有论文)

基于Springboot的在线考试系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 本系统是基于Springboot的在线考试系统&#xff1b;本系统主要分为管理员、教师和学生三种角色&#xff1b; 管理员登录系统后&#xff0c;可以对首页&#x…