15. C++泛型与符号重载
【泛型编程】
若多组类型不同的数据需要使用相同的代码处理,在C语言中需要编写多组代码分别处理,这样做显然太过繁琐,C++增加了虚拟类型,使用虚拟类型可以实现一组代码处理多种类型的数据。
虚拟类型是暂时不确定的数据类型,它在定义时不指定具体类型,而是在使用时指定类型,可以用于单个数据类型,也可以用于数组、结构体,使用虚拟类型编程也称为泛型编程,意为广泛类型。
使用虚拟类型的代码称为模板,但是全局数据不能使用虚拟类型,全局数据也无需定义为模板。
全局函数模板
函数模板的参数、返回值可以使用虚拟类型,参数与返回值的数量必须相同,只是类型不同。
#include <iostream>
template <typename T> //使用template关键词定义虚拟类型,T为虚拟类型名称
T add(T t1, T t2)
{return t1+t2;
}
int main()
{printf("%d\n", add(1, 2)); //T指定为int类型printf("%f\n", add(0.1f, 0.2f)); //T指定为float类型return 0;
}
虚拟类型使用template关键词定义,也可以使用class定义,可以在<>符号内定义多个虚拟类型,不同虚拟类型使用,符号隔开,但是每个定义的虚拟类型都必须使用,否则编译报错。
函数模板内可以使用多个虚拟类型,执行函数模板时需要为其内部虚拟类型指定具体类型,当多次执行函数模板并为虚拟类型设置不同的具体类型时,编译器会将函数模板编译为多个函数,分别使用不同的指令处理数据,上述代码中的add函数实际上会被编译器编译成两个函数,分别使用整数运算指令和浮点数运算指令处理数据,模板只是简化了程序员的工作量,并没有减少程序编译后的代码量。
成员函数模板
#include <iostream>
class math
{
public:template <typename T> //定义虚拟类型T add(T t1, T t2) const{return t1+t2;}
};
int main()
{math math1;printf("%d\n", math1.add(1, 2));printf("%f\n", math1.add(0.1f, 0.2f));return 0;
}
类模板
成员数据使用虚拟类型的类称为类模板。
#include <iostream>
template <typename T>
class math
{
private:T a,b;public:math(T t1, T t2){a = t1;b = t2;}T add() const{return a+b;}
};
int main()
{math<int> math1(1, 2); //创建对象时需要使用<>符号设置数据类型printf("%d\n", math1.add());math<float> math2(0.1, 0.2);printf("%f\n", math2.add());return 0;
}
成员数组模板
虚拟类型用于类成员数组时可以额外定义一个变量,此变量用于设置数组模板的长度,从而实现数组的类型、长度都在定义时临时确定。
#include <iostream>
template <typename T, int i> //变量i设置数组长度
class array
{
private:T a[i];public://......
};
int main()
{array<int, 5> array1; //成员数组类型为int,包含5个元素array<float, 6> array2; //成员数组类型为float,包含6个元素return 0;
}
【符号重载】
在C++中可以借助operator关键词将语法中的某些符号、关键词当做函数名,从而重新定义此符号的功能,这种函数称为符号函数,调用符号函数执行时可以无需指定operator关键词,直接使用重载的符号即可,全局函数和成员函数都可以设置为符号函数。
使用符号函数会让代码更简洁,比如连接字符串函数使用+符号作为函数名,即可通过+符号连接两个字符串。
可重载的符号如下:
+ - * / ++ -- % << >>
&& || ! & | ~ ^
< > == != >= <=
= += -= *= /= %= ^= &= |= >>= <<=
, () []
-> ->*
new delete new[] delete[]
符号重载注意事项:
1.只能使用C++语法中原有符号,不能使用C++语法没有的符号。
2.= () [] -> 这四种符号只能用于成员函数,不能用于全局函数。
3.重载不同符号时,函数可以设置的参数个数不同。
4.重载相同符号时,全局函数与成员函数可以设置的参数个数不同。
5.重载不同符号有不同的限制,比如:重载-符号不能计算两个double数据相加、重载%符号不能只有一个操作数、重载new的函数返回值只能是void类型指针。
重载 + 符号
重载+符号连接固定长度字符串对象,并返回连接结果。
#include <iostream>
class string
{
public:char strvar[100] = {0};/* operator+符号函数连接string对象 */string operator+(const string & conobj) const{string result; //存储连接结果unsigned int strlen = 0; //存储本类strvar空字符下标unsigned int conlen = 0; //存储conobj.strvar空字符下标result.strvar[0] = 0; //初始空字符/* 查询本类strvar空字符下标,若没有空字符则当做不合规string对象处理,strlen = 0 */for(int i = 0; i < 100; i++){if(strvar[i] == 0){strlen = i;break;}}/* 查询conobj.strvar空字符下标 */for(int i = 0; i < 100; i++){if(conobj.strvar[i] == 0){conlen = i;break;}}/* result连接本类strvar */if(strlen != 0){result = *this;}/* result连接conobj.strvar */if(conlen != 0){if(strlen == 0){result = conobj;}else{for(int i = 0; strlen<99 && i<=conlen; i++){result.strvar[strlen] = conobj.strvar[i];strlen++;}result.strvar[99] = 0; //确保末尾元素是空字符}}return result;}/* 重载operator+符号函数,连接字符串 */string operator+(const char * conobj) const{string result;unsigned int strlen = 0;unsigned int conlen = 98; //若字符串长度超标,则最多使用99个字符result.strvar[0] = 0;/* 查询本类strvar末尾下标 */for(int i = 0; i < 100; i++){if(strvar[i] == 0){strlen = i;break;}}/* 查询conobj末尾下标,只需查询99个字节 */for(int i = 0; i < 99; i++){if(conobj[i] == 0){conlen = i;break;}}/* 连接本类strvar */if(strlen != 0){result = *this;}/* 连接conobj */if(conlen != 0){for(int i = 0; strlen<99 && i<=conlen; i++){result.strvar[strlen] = conobj[i];strlen++;}result.strvar[99] = 0;}return result;}
};
int main()
{string ali = {"阿狸"};string taozi = {"桃子"};string zoo = ali + taozi; //调用ali.operator+函数,连接string对象printf("%s\n", zoo.strvar);zoo = zoo + "喜羊羊美羊羊"; //调用zoo.operator+函数,连接字符串printf("%s\n", zoo.strvar);return 0;
}
重载 = 符号
重载=符号修改动态长度字符串对象,字符串成员定义为私有,只能通过operator=符号函数修改。
#include <iostream>
#include <string.h>
class string
{
private:char * strvar;public:string(){strvar = new char;*strvar = 0;}string(const char * assobj){size_t asslen = strlen(assobj); strvar = new char[asslen+1];strcpy(strvar, assobj);strvar[asslen+1] = 0; //末尾空字符}~string(){delete [] strvar;}/* 返回字符串地址 */const char * get() const{return strvar;}void operator=(const char *assobj){size_t asslen = strlen(assobj);/* 释放旧内存 */delete [] strvar;/* 申请新内存 */strvar = new char[asslen+1];/* 内存赋值 */strcpy(strvar, assobj);strvar[asslen+1] = 0;}
};int main()
{string zoo("阿狸");printf("%s\n", zoo.get());zoo = "喜羊羊";printf("%s\n", zoo.get());return 0;
}
相关文章:

15. C++泛型与符号重载
【泛型编程】 若多组类型不同的数据需要使用相同的代码处理,在C语言中需要编写多组代码分别处理,这样做显然太过繁琐,C增加了虚拟类型,使用虚拟类型可以实现一组代码处理多种类型的数据。 虚拟类型是暂时不确定的数据类型&#…...

老司机都懂的!【打赏】完美运营的最新视频打赏系统
完美运营的最新视频打赏系统优于市面上95%的打赏系统,与其他打赏系统相比,功能更加强大,完美运营且无bug。支付会调、短链接生成、代理后台、价格设置和试看功能等均没有问题。 以上为原简介,经测试验证。成功搭建并可以正常进入…...

JavaWeb笔记 --- 二、Maven
二、Maven Maven概述 所有的IDE创建的Maven项目都可以使用 Maven简介 Maven模型 Maven常用命令 Maven生命周期 Maven坐标 依赖管理 dpendencies:依赖 依赖范围...

【C++】C++11---右值引用和移动语义
目录 1、什么是左值引用和右值引用2、左值引用与右值引用比较3、右值引用使用场景和意义4、右值引用引用左值的分析5、完美转发 1、什么是左值引用和右值引用 传统的C语法中就有引用的语法,而C11中新增了的右值引用语法特性,所以从现在开始我们之前学习…...

消息队列-kafka-消息发送流程(源码跟踪) 与消息可靠性
官方网址 源码:https://kafka.apache.org/downloads 快速开始:https://kafka.apache.org/documentation/#gettingStarted springcloud整合 发送消息流程 主线程:主线程只负责组织消息,如果是同步发送会阻塞,如果是异…...

机器学习笔记 计算机视觉中的测距任务常见技术路线
一、计算机视觉中的测距任务 测距是计算机视觉中的一项关键任务,涉及测量物体和相机之间的距离。这些信息可用于多种应用,包括机器人、自动驾驶汽车和增强现实。测距技术有很多种,包括主动式和被动式,每种技术都有自己的优点和局限性。主动测距技术,例如飞行时间、结构光和…...

云计算 3月8号 (wordpress的搭建)
项目wordpress 实验目的: 熟悉yum和编译安装操作 锻炼关联性思维,便于以后做项目 nginx 编译安装 1、安装源码包 [rootlinux-server ~]# yum -y install gcc make zlib-devel pcre pcre-devel openssl-devel [rootlinux-server ~]# wget http://nginx.…...

【CSS】(浮动定位)易忘知识点汇总
浮动特性 加了浮动之后的元素,会具有很多特性,需要我们掌握的. 1、浮动元素会脱离标准流(脱标:浮动的盒子不再保留原先的位置) 2、浮动的元素会一行内显示并且元素顶部对齐 注意: 浮动的元素是互相贴靠在一起的(不会有缝隙)&…...

Vitual Box虚拟机打开后,键盘鼠标失效
Vitual Box虚拟机打开后,键盘鼠标失效 作者在使用Vitual Box虚拟机软件时,偶然发现打开VitualBox后,鼠标和键盘均无法使用。 你以为是“主机热键”引起的?NO! 废话少说 直接上干货: 在VitualBox设置下有…...

宠物空气净化器值得入手吗?选购宠物空气净化器关注哪些方面?
一开始养猫时,每天看着可爱的猫咪在家里快乐奔跑,让人心情愉悦。然而,作为铲屎官都知道,猫咪会掉毛,特别是在换毛期间,地板、沙发上都会有一大堆猫毛,甚至衣服也可能沾满猫毛。养猫家庭中&#…...

前端发起请求,后端模型需处理很久,怎样设置前端直接完成请求响应,后端计算完在返回结果给前端?
在这种情况下,可以采用异步处理的方式来解决。具体步骤如下: 前端发起请求:前端向后端发送请求,但是不等待后端处理完成而是立即得到响应。 后端异步处理:后端接收到请求后,不立即进行处理,而是…...

DDD领域驱动设计
一、什么是领域驱动设计DDD 领域驱动设计(Domain-Driven Design,DDD)是一种软件开发方法论,它提出了一组关于如何设计和构建软件系统的原则和方法。 二、DDD的诞生是为了解决哪些问题 对复杂业务领域的理解不足:传统…...

网络编程第1天
OSI的七层网络模型有哪些,每一层有什么作用? (1)应用层 负责处理不同应用程序之间的通信,需要满足提供的协议,确保数据发送方和接收方的正确 应用层提供的协议: HTTP:超文本传输…...

Springboot--整合Logback 日志框架(Maven)
文章目录 前言一、Logback 日志框架介绍:二、整合:2.1 引入jar2.2 logback.xml 文件配置:2.3 日志输出:2.3.1 方式一:2.3.2 方式二: 2.3 日志输出结果展示: 三、扩展:3.1 日志输出格…...

【考研数学】李林《880》vs 李永乐《660》完美使用搭配
没有说谁一定好,只有适不适合自身情况,针对自身弱点选择性价比才最高。 两者侧重点不同,660适合强化前期,弥补基础的不足,880适合强化后期,题型全面,提高我们对综合运用知识的能力。 选择习题…...

Java面试之消息中间件
消息队列 优缺点 特点 解耦异步削峰缺点 系统可用性降低 兜底:代码中try、catch 异常捕捉后直接进行数据库操作,或者 搭建高可用集群,Kafka集群、RocketMQ集群提高复杂度 消息重复(消费端的幂等性设计)、消息丢失(主要集中RabbitMQ)、消息的顺序(业务:1,下单 2,支付 3,发…...

网工学习 DHCP配置-接口模式
网工学习 DHCP配置-接口模式 学习DHCP总是看到,接口模式、全局模式、中继模式。理解起来也不困难,但是自己动手操作起来全是问号。跟着老师视频配置啥问题没有,自己组建网络环境配置就是不通,悲催。今天总结一下我学习接口模式的…...

【GO】语言特点 | Go和Java的对比
while循环 go语言中没有while循环,一般都是用for循环替代 while (条件) {} // Java的for循环for true {} // go 语言中会用一个为真的表达式作为是否 会进入循环的条件,也就是把其他语言的for和while合并了for循环 for (Type item : list) {} // j…...

USB2.0设备检测过程信号分析
1.简介 USB设备接入的Hub端口负责检测USB2.0设备是否存在和确定USB2.0设备的速度。检测设备是否存在和确定设备速度涉及一系列的信号交互,下面将分析该过程。 2.硬件 USB低速设备和全速/高速设备的连接器在硬件结构上有所不同,而主机或者Hub接收端连接…...

Go语言物联网开发安科瑞ADW300/4G电能表数据上传mqtt平台-电表接线到传输数据完整流程
电能表功能说明 ADW300是方便用户进行用电监测、集抄和管理,可灵活安装在配电箱中,可用于电力运维、环保监管等在线监测类平台中。我们本案例是用于工业售电公司对出售电的管理,设备可以监控用电情况、故障监控及警报,售电公司可…...

LabVIEW质谱仪开发与升级
LabVIEW质谱仪开发与升级 随着科技的发展和实验要求的提高,传统基于VB的质谱仪系统已经无法满足当前的高精度和高效率需求。这些系统通常存在着功能不全和操作复杂的问题,影响了科研和生产的进度。为了解决这些问题,开发了一套基于LabVIEW开…...

SwiftUI之DragGesture
SwiftUI中的DragGesture是一种手势识别器,用于捕捉用户拖拽操作。通过DragGesture,我们可以监听用户在视图上的拖拽行为,并对其进行响应。 在SwiftUI中,我们可以将DragGesture应用于任何视图,以便捕捉拖拽手势。在Dra…...

主网NFT的发布合约
1.什么是nft? NFT:Non-fungible-token 非同质化货币 2.新建suimove项目 使用sui move new 项目名命令新建sui move项目 sui move new nft_qyx项目结构如下: 3.写nft合约 module qyx123::nft{use sui::object::{Self, UID};use sui::transfer;use sui::tx_context::{Sel…...

分享2024年在家轻松兼职赚钱的5个副业
今天在网上看到这么一句话,真的让我深有感触:“职场人一定要有居安思危的意识,创业的人一定要三思而后行”。在这个瞬息万变的时代,连被视为铁饭碗的公务员、教师等体制内工作都不能保证一辈子的稳定。发展副业,似乎成…...

电脑小问题:Windows更新后黑屏
Windows 更新后黑屏解决方法 在 Windows 更新后,伴随了一个小问题,电脑启动后出现了桌面黑屏。原因可能是火绒把 explorer.exe 当病毒处理了。 下面讲解 Windows 更新后黑屏的解决方法,步骤如下: 1. 按 ctrl alt delete 组合键…...

C++指针(四)万字图文详解!
个人主页:PingdiGuo_guo 收录专栏:C干货专栏 前言 相关文章:C指针(一)、C指针(二)、C指针(三) 本篇博客是介绍函数指针、函数指针数组、回调函数、指针函数的。 点赞破六…...

商品管理系统设计100问?
你的系统是用于哪种类型的商品管理?比如电子商品、实体商品、服装、食品等等?你需要管理哪些商品信息?比如名称、描述、价格、库存等等?你是否需要对商品进行分类?如果是,分类的结构是怎样的?你…...

Python的反射
通过字符串的形式操作对象的属性 class Person(object):def __init__(self,name,age) -> None:self.namenameself.ageagedef walking(self):print("walking......")获取对象的属性 pPerson("Recardo",12) # 获取队形的name属性 agetattr(p,"nam…...

【Spring云原生系列】Spring RabbitMQ:异步处理机制的基础--消息队列 原理讲解+使用教程
🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…...

UE5.1_Varest_Warning
UE5.1_Varest_Warning LogVaRest: Warning: UVaRestRequestJSON::GetResponseContentAsString(637): Response content string is cached LogVaRest: Warning: UVaRestRequestJSON::GetResponseContentAsString(637): Response content string is cached是警告也是报错&#…...