【第七天】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://www.mzph.cn/news/700301.shtml

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

相关文章

聊聊Sora这个AI大神和中美技术赛跑那些事儿

最近有个叫Sora的AI模型火得一塌糊涂。它就像个魔法师&#xff0c;你给它一段话描述&#xff0c;它就能变出一段60秒的高清视频来&#xff0c;这可比之前咱们看过的那些文字转图片的AI厉害多了。想象一下&#xff0c;以后拍电影预告片、做广告宣传啥的&#xff0c;可能直接让So…

Ansible 更换aliyun 镜像 并下载tree

目录 查看系统版本找到对应 的版本对当前镜像进行备份下载aliyuan更换成功安装扩展源更换源之后 的三个命令 这里安装一个aliyun 的镜像 本案例 仅供实验参考 生产环境中请谨慎使用 查看系统版本 先查看linux 的系统 版本 ansible slave -m shell -a uname -a找到对应 的版本…

【Spring面试题】

目录 前言 1.Spring框架中的单例bean是线程安全的吗? 2.什么是AOP? 3.你们项目中有没有使用到AOP&#xff1f; 4.Spring中的事务是如何实现的&#xff1f; 5.Spring中事务失效的场景有哪些&#xff1f; 6.Spring的bean的生命周期。 7.Spring中的循环引用 8.构造方法…

FFmpeg解析之avformat_find_stream_info函数

avformat_find_stream_info 的主要作用就是&#xff1a;解析媒体文件并获取相关的流信息 整体的逻辑如下图所示&#xff1a; /*** Read packets of a media file to get stream information. This* is useful for file formats with no headers such as MPEG. This* function…

聊聊JVM运行时数据区的堆内存

聊聊JVM运行时数据区的堆内存 内存模型变迁&#xff1a; Java堆在JVM启动时创建内存区域去实现对象、数组与运行时常量的内存分配&#xff0c;它是虚拟机管理最大的&#xff0c;也是垃圾回收的主要内存区域 。 内存模型变迁&#xff1a; 为什么要有年轻区和老年区&#xff1f;…

【算法与数据结构】链表、哈希表、栈和队列、二叉树(笔记二)

文章目录 四、链表理论五、哈希表理论五、栈和队列理论5.1 单调栈 六、二叉树理论6.1 树的定义6.2 二叉树的存储方式6.3 二叉树的遍历方式6.4 高度和深度 最近博主学习了算法与数据结构的一些视频&#xff0c;在这个文章做一些笔记和心得&#xff0c;本篇文章就写了一些基础算法…

基于AI将普通RGB图像转换为苹果Vision Pro支持的空间照片

将 RGB 图像转换为空间图片 一、引言 随着AR和VR技术的普及,空间照片格式(.HEIC)逐渐受到关注。这种格式允许用户在AR/VR设备上体验到更为真实的立体空间效果。为了让更多的普通图片也能享受这种技术,我们开发了这款可以将普通RGB图像转换为苹果Vision Pro支持的.HEIC格式的…

STM32F103学习笔记(七) PWR电源管理(原理篇)

目录 1. PWR电源管理简介 2. STM32F103的PWR模块概述 2.1 PWR模块的基本工作原理 2.2 电源管理的功能和特点 3. PWR模块的常见应用场景 4. 常见问题与解决方案 1. PWR电源管理简介 PWR&#xff08;Power&#xff09;模块是STM32F103系列微控制器中的一个重要组成部分&…

实习日志18

1.刚弄好数据库就破大防了 1.1.图片显示&#xff0c;PDF不显示 我的图片是base64编码显示&#xff0c;pdf是用url显示 首先想到url出问题了 感觉可能是之前的那个问题&#xff0c;到服务器上url变回去了 活字格V9获取图片失败bug&#xff0c;报错404&#xff0c;了解存储路…

使用Streamlit构建纯LLM Chatbot WebUI傻瓜教程

文章目录 使用Streamlit构建纯LLM Chatbot WebUI傻瓜教程开发环境hello Streatelit显示DataFrame数据显示地图WebUI左右布局设置st.sidebar左侧布局st.columns右侧布局 大语言模型LLM Chatbot WebUI设置Chatbot页面布局showdataframe()显示dataframeshowLineChart()显示折线图s…

进程间的通信-- 管道

一 进程通信原理 我们知道进程间相互独立&#xff0c;具有独立性。那么我们要实现两个进程之间的通信就需要&#xff0c;让这两个进程看到同一个文件。然后一个进程对文件写入&#xff0c;一个进程对文件内容进行读取&#xff0c;这就是现实了进程间的通信。 二 进程通信的几种…

【C++私房菜】面向对象中的多态

文章目录 一、多态二、对象的静态类型和动态类型三、虚函数和纯虚函数1、虚函数2、虚析构函数3、抽象基类和纯虚函数4、多态的原理 四、重载、覆盖(重写)、隐藏(重定义)的对比 一、多态 OOP的核心思想是多态性(polymorphism)。多态性这个词源自希腊语&#xff0c;其含义是“多…

【黑马程序员】1、TypeScript介绍_黑马程序员前端TypeScript教程,TypeScript零基础入门到实战全套教程

课程地址&#xff1a;【黑马程序员前端TypeScript教程&#xff0c;TypeScript零基础入门到实战全套教程】 https://www.bilibili.com/video/BV14Z4y1u7pi/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 1、TypeScript介绍 1.1 TypeScript是什…

信号通信与消息队列实现的通信:2024/2/23

作业1&#xff1a;将信号和消息队列的课堂代码敲一遍 1.1 信号 1.1.1 信号默认、捕获、忽略处理(普通信号) 代码&#xff1a; #include <myhead.h> void handler(int signo) {if(signoSIGINT){printf("用户键入 ctrlc\n");} } int main(int argc, const ch…

Windows Server 2019 IIS HTTPS证书部署流程详解

一、下载SSL证书 1、下载IIS 类型的证书 以阿里云证书为例&#xff1a; 2、解压已下载的SSL证书压缩包 二、导入SSL证书 1、在服务器上使用WinR组合键&#xff0c;打开运行对话框&#xff0c;输入mmc&#xff0c;单击确定 打开控制台操作界面&#xff0c;如下&#xff1a; …

可视化 RAG 数据 — EDA for Retrieval-Augmented Generation

目录 一、说明 二、准备好 三、准备文件 四、拆分和创建数据集的嵌入 五、构建 LangChain 六、问一个问题 七、可视化 八、下一步是什么&#xff1f; 九、引用 一、说明 像 GPT-4 这样的大型语言模型 &#xff08;LLM&#xff09; 在文本理解和生成方面表现出令人印象深刻的能力…

介绍 CI / CD

目录 一、介绍 CI / CD 1、为什么要 CI / CD 方法简介 1、持续集成 2、持续交付 3、持续部署 2、GitLab CI / CD简介 3、GitLab CI / CD 的工作原理 4、基本CI / CD工作流程 5、首次设置 GitLab CI / CD 6、GitLab CI / CD功能集 一、介绍 CI / CD 在本文档中&#x…

Python中format()方法的基本使用,第一种用法 <模板字符串>.format(<参数列表>)。

第一种用法&#xff1a; <模板字符串>.format(<参数列表>) 解析&#xff1a; 其中&#xff1a; <模板字符串>是包含占位符或者叫槽&#xff08;用花括号 {} 表示&#xff09;的字符串&#xff0c;用来指定最终格式化后的字符串的样式和结构。<参数列表…

STM32 系统滴答时钟启动过程 SysTick_Config

STM32 系统滴答时钟启动过程 SysTick_Config 1. 系统滴答时钟1.1 简介1.2 配置1.3 启动和更新 1. 系统滴答时钟 1.1 简介 SysTick&#xff1a;系统滴答时钟&#xff0c;属于Cortex-M4内核中的一个外设&#xff0c;24bit向下递减计数。 Systick定时器常用来做延时&#xff0c;…

二次元风格个人主页HTML源码

源码介绍 直接上传服务器压缩包解压就完事了&#xff0c;修改index.html内代码即可&#xff0c;注释写的很全&#xff0c;替换图片在文件夹img&#xff0c;只有前端&#xff0c;没有后台&#xff0c;大佬如果需要&#xff0c;可以自行添加后台。本源码非常适合个人工作室主页。…