【第七天】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,一经查实,立即删除!

相关文章

MMDetection3调试技巧查看Backbone Neck Head 输出---MMDetectionv2迁移

参考&#xff1a;MMDetection issue #9479 查看 Backbone &#xff1a; # 骨架网络构建 # from mmengine.registry import Registry import torch import numpy as np from mmdet.registry import MODELSif __name__ __main__:backbonedict(typeResNet,depth50,num_stages4,…

BeautifulSoup中的find_all()及select()查找方法

#Beautiful Soup库中的find_all()方法是用于查找HTML文档中符合指定条件的所有元素。它返回一个列表&#xff0c;其中包含了找到的所有元素。 # 对于Beautiful Soup库中的find_all()方法&#xff0c;其参数类型可以分为以下几种&#xff1a; # 标签名&#xff1a;字符串类型&a…

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

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

Java命令模式:让请求成为对象

Java命令模式&#xff1a;让请求成为对象 在软件设计中&#xff0c;我们经常遇到需要将操作或请求封装成对象的情况。这样&#xff0c;我们可以将它们作为参数传递、排队、记录或撤销。命令模式正是为了满足这种需求而诞生的。在命令模式中&#xff0c;一个请求或操作被封装成…

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;本篇文章就写了一些基础算法…

C#面:as 和 is 的区别

as 关键字&#xff1a; as 关键字用于将一个对象转换为指定类型&#xff0c;如果转换成功&#xff0c;则返回该类型的实例&#xff1b;如果转换失败&#xff0c;则返回 null 。as 关键字只能用于引用类型之间的转换&#xff0c;不能用于值类型之间的转换。如果被转换的对象为 …

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

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

NLP主要研究哪些方向?

当前AI炽手可热&#xff0c;NLP是AI的一个重要方向。NLP&#xff08;Natural Language Processing&#xff0c;自然语言处理&#xff09;&#xff0c;致力于让计算机能够理解、解释和处理人类语言。NLP 的目标是使计算机能够像人类一样处理和理解自然语言的文本和语音数据。NLP…

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…

每天一个数据分析题(一百六十八)

在使用Python做用户画像时有如下代码&#xff1a; sns.boxplot(x ‘type’&#xff0c;y ‘trans count’&#xff0c;data Creditcard) sns表示seaborn,下面关于代码的描述错误的是&#xff08;&#xff09;。 A. data参数传入的可能是一个pandas 的dataframe对象。 B. 该…

进程间的通信-- 管道

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

Ansible+Shell+Containerd部署k8s

目录 一.可联网正常使用的虚拟机四台 二.main主机部署ansible实现统一管理 1.下载ansible 2.主机清单和配置文件 3.下发密钥进行管理 三.node部署k8s基础准备 1.完善hosts文件&#xff0c;关闭firewalld&#xff0c;disabled掉selinux 2.时间同步、禁用交换分区、配置内…

【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是什…