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;
}


 

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

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

相关文章

数据中台:数字中国战略关键技术设施

文章目录 每日一句正能量前言为何要建设数据中台数据中台建设痛点数据中台学习资料聚焦前沿&#xff0c;方法论体系更新与时俱进&#xff0c;紧跟时代热点深入6大行业&#xff0c;提炼实践精华大咖推荐&#xff0c;数字化转型必备案头书购买链接赠书活动 每日一句正能量 人生之…

找不到本地组策略编辑器解决办法

创建记事本写入以下命令 echo offpushd "%~dp0"dir /b %systemroot%\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >gp.txtdir /b %systemroot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-…

Django会话

一、Cookie介绍 1.1、背景介绍 HTTP协议有一个特性就是无状态的,是指协议对于交互性场景没有记忆能力 随着动态交互的web应用的出现,HTTP的无状态特性严重阻碍了动态交互应用程序的发展,例如一些购物网站在进行购物时候都会进行了页面跳转/刷新,按照HTTP的无状态协议岂不…

Compose UI 之 MediumLarge TopAppBar

Medium&Large TopAppBar 前面文章介绍了 Small 类型的 TopAppBar&#xff1a;TopAppBar CenterAlignedTopAppBar 。下来介绍 Medium 和 Large 类型的 TopAppBar&#xff1a;MediumTopAppBar LargeTopAppBar 。 MediumTopAppBar 上面介绍了Small 类型的 TopAppBar (TopAp…

实战|环信 Vue2 uniapp Demo重构焕新!经典再升级!

项目背景 当前环信 uni-app vue2 Demo 地址升级版本 Github 地址&#xff08;临时&#xff09; 原版本功能实现方式较混乱&#xff0c;代码逻辑晦涩难懂&#xff0c;不利于开发者参考或复用。此实战项目在确保原项目功能保留的情况下进行完全重写并新增大量功能&#xff0c;以…

【C语言】指针相关知识点

什么是指针&#xff1f; 指针&#xff08;Pointer&#xff09;是编程语言中的一个对象&#xff0c;利用地址&#xff0c;它的值直接指向&#xff08;points to&#xff09;存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元&#xff0c;可以说&#xff0c;地…

Golang搭建grpc环境

简介 OS : Windows 11 Golang 版本: go1.22.0 grpc : 1.2 protobuffer: 1.28代理 没有代理国内环境下载不了库七牛CDN &#xff08;试过可用&#xff09; go env -w GOPROXYhttps://goproxy.cn,direct阿里云代理(运行grpc时下载包出现报错 ): go env -w GOPROXYhttps://mirr…

黑马点评-异步秒杀实现

异步秒杀思路 我们来回顾一下下单流程 当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单 4、校验是…

Axure Cloud如何给每个原型配置私有域名

需求 在原型发布之后&#xff0c;自动给原型生成一个独立访问的域名&#xff0c;类似http://u591bi.axshare.bushrose.cn&#xff0c;应该如何配置呢&#xff1f; 准备事项 已备案域名 如何备案&#xff1f;阿里云备案流程 已安装部署Axure Cloud 如何安装部署&#xff0c;请…

WordPress建站入门教程:如何创建菜单和设置前端导航菜单?

前面我们跟大家分享了WordPress如何上传安装WordPress主题&#xff0c;但是启用主题后前端没有看到有导航菜单&#xff0c;这是因为我们还没有创建菜单和设置导航菜单。 JianYue主题导航菜单和右上角菜单 今天boke112百科就继续跟大家分享WordPress站点如何创建菜单和设置前端…

Kafka入门及生产者详解

1. Kafka定义 传统定义&#xff1a;分布式的、基于发布/订阅模式的消息队列&#xff0c;主要用于大数据实时处理领域。发布/订阅模式中&#xff0c;发布者不会直接将消息发送给特定的订阅者&#xff0c;而是将发布的消息分为不同的类别&#xff0c;订阅者只接受感兴趣的消息。…

Linux系统Docker部署DbGate并结合内网穿透实现公网管理本地数据库

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

基于yolov5的草莓成长期检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的草莓成长期检测系统&#xff0c;支持图像检测&#xff0c;视频检测和实时摄像检测功能_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的草莓成长期检测系统是在pytorch框架下实现的&#xff0c;成长期分为3类&#xff1a;…

加密与安全_使用Java代码操作RSA算法生成的密钥对

文章目录 Pre概述什么是非对称加密算法&#xff1f;如何工作&#xff1f;示例&#xff1a;RSA算法特点和优势ECC&#xff1a;另一种非对称加密算法 Code生成公钥和私钥私钥加密私钥加密私钥解密 ( 行不通 )私钥加密公钥解密公钥加密和公钥解密 &#xff08;行不通&#xff09;保…

字符指针变量

在指针的类型中我们知道有⼀种指针类型为字符指针 char* 1.一般使用方法如下&#xff1a; int main() { char ch w; char *pc &ch; *pc w; return 0; } 2.还有⼀种使⽤⽅式如下&#xff1a; int main() { const char* pstr "hello world."; printf("…

吴恩达深度学习笔记:深度学习引言1.1-1.5

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第一周&#xff1a;深度学习引言(Introduction to Deep Learning)1.1 欢迎(Welcome)1.2 什么是神经网络&#xff1f;(What is a Neural Network)1.3 神经网络的监督学习(Supervised Learning …

Linux系统——Haproxy高性能负载均衡软件

目录 一、Haproxy介绍 1.Haproxy定义 2.Haproxy主要特性 二、安装Haproxy 1.yum安装 2.第三方rpm包安装 3.编译安装 3.1解决Lua环境 3.2编译安装Haproxy 三、配置文件详解 1.状态页 2.日志管理 2.1定义日志到其他主机站点 3.指定进程线程个数 4.cpu亲缘性 5.多进…

【IP178G】分享一个IP178G的8口交换机电路图

前提 IP178G是一个集成度非常高的8口交换机芯片&#xff0c;还可以通过外部EEPROM配置交换机芯片实现一些简单的网管功能**(VLAN/端口镜像etc)**&#xff0c;拿来作为一个网络调试工具来使用非常方便&#xff0c;一个TYPE-C的USB口的线就可以供电(5V USB就可以带的了)

职场成功的秘诀:如何高效管理时间

在职场中&#xff0c;时间管理是一项至关重要的技能。高效的时间管理不仅能够提高工作效率&#xff0c;还能够帮助我们更好地平衡工作与生活&#xff0c;实现职场成功。本文将分享一些职场成功人士都在使用的时间管理秘诀&#xff0c;帮助你更好地管理时间&#xff0c;提升职场…

小红书brief怎么创作?品牌营销技巧

在小红书平台进行品牌传播&#xff0c;首先需要具备的能力&#xff0c;就是与达人进行沟通。那么就一定要学会写小红书brief。今天我们和大家分享一下小红书brief怎么创作&#xff1f;品牌营销技巧&#xff01; 一、什么是小红书brief brief是工作简报的意思。小红书brief是品牌…