C++(8) 运算符重载

文章目录

      • 运算符重载
          • 1.1 运算符概述
          • 1.2 运算符 + 重载
          • 1.3 运算符 << 重载

运算符重载

1.1 运算符概述

针对当前程序中常用的运算符,可以实现目标运算符处理当前数据类型的方式修改

需求:

"ABCD" + "BDC" ==> "ABCDBDC"
+ ==> 拼接函数
1.2 运算符 + 重载
#include <iostream>#include <cstdio>
#include <cstdlib>
#include <cstring>using namespace std;class MyString
{
public:MyString() {}MyString(char *str){// strlen(str) 构造函数参数字符串长度size_t length = strlen(str);this->str = (char *)malloc(length + 1);memset(this->str, 0, length + 1);memcpy(this->str, str, length + 1);}MyString(const MyString &ms){size_t length = strlen(ms.str);str = (char *)malloc(length + 1);memset(str, 0, length + 1);memcpy(str, ms.str, length + 1);}~MyString(){free(str);str = NULL;}MyString *append(MyString *ms){/*1. 计算当前字符串总长度strlen(str) 调用函数的字符串长度strlen(ms->str) 参数字符串长度相加之后当前字符串总长度*/size_t length = strlen(str) + strlen(ms->str);// 2. 根据总长度申请的新的内存空间char *temp = (char *)malloc(length + 1);memset(temp, 0, length + 1);// 3. 将当前调用函数对象的 MyString 底层字符串数据拷贝到 temp 中memmove(temp, str, strlen(str));// 4. 将参数 MyString 对象底层字符串拼接到 temp 中strcat(temp, ms->str);// 5. 首先释放当前调用函数原本 str 内存空间free(str);// 6. 新申请的内存空间地址赋值给 strstr = temp;return this;}/*opreator++ 运算符重载格式要求1. 必须有友元函数,类外开可以直接调用并且可以操作当前类内权限限制数据2. opreator+ 重载要求必须有两个参数,且必须使用引用类型*/friend void operator+(MyString &m1, MyString &m2);char *getStr() { return str; }private:char *str;
};void operator+(MyString &m1, MyString &m2)
{/*ms1 对应 + 之前的内容ms2 对应 + 之后的内容*/cout << "m1 : " << m1.str << endl;cout << "m2 : " << m2.str << endl;cout << "+ 运算符重载" << endl;// 1. 计算总长度size_t length = strlen(m1.str) + strlen(m2.str);// 2. 申请新空间char *temp = (char *)calloc(1, length + 1);// 3. m1 数据内容存储到新空间中memcpy(temp, m1.str, strlen(m1.str));// 4. m2 数据内容拼接到新空间中strcat(temp, m2.str);// 5. 释放 m1 原空间数据内容free(m1.str);// 6. m1 底层字符串存储新空间地址m1.str = temp;
}int main(int argc, char const *argv[])
{MyString *ms1 = new MyString("ABC");MyString *ms2 = new MyString("1234");ms1 = ms1->append(ms2);/*MyString * operator+(MyString * m) 当前重载 + 运算符的函数是一个成员函数,需要通过 MyString 类型调用,但是 + 运算符属于基础运算符编译器在使用时,不会认为是【类型调用】编译器可以做的事情:1. + 运算符按照基本逻辑实现2. 如果发现基本逻辑无法满足执行要求,会检测到运算符两端的数据类型查询当前数据类型中是否存在对应的运算符的重载实现*/MyString *ms3 = new MyString("!@$");*ms1 + *ms3;cout << ms1->getStr() << endl;delete ms2;delete ms1;return 0;
}
1.3 运算符 << 重载
#include <iostream>
#include <string>using namespace std;class Person
{
public:Person() {}Person(int id, string name, int age) : id(id), name(name), age(age) {}Person(const Person &p) : id(p.id), name(p.name), age(p.age) {}/*当前函数是重载了 << 运算符1. ostream & o 输出操作使用的 cout2. Person * p 目标展示的 Person 数据<< 运算符重载替换的内容是 cout << p3. 返回值是 ostream & 输出流引用,方便连贯操作*/friend ostream &operator<<(ostream &o, Person *p);private:int id;string name;int age;
};ostream &operator<<(ostream &o, Person *p)
{o << "ID : " << p->id << ", Name : " << p->name << ", Age : " << p->age;return o;
}class Student
{
};int main(int argc, char const *argv[])
{Person *p1 = new Person(1, "张三", 3);Person *p2 = new Person(2, "李四", 5);Student *s = new Student;/*当前使用的 << 运算符已经被 ostream 重载之后的运算符内容cout 就是 ostream 类型ostream Output Stream 输出流*/cout << p1 << endl<< p2 << " 字符串" << endl;/*执行结果:ID : 1, Name : 张三, Age : 3ID : 2, Name : 李四, Age : 5 字符串*/cout << s << endl; // 0x903ca0return 0;
}cout << p1 << endl<< p2 << " 字符串" << endl;/*执行结果:ID : 1, Name : 张三, Age : 3ID : 2, Name : 李四, Age : 5 字符串*/cout << s << endl; // 0x903ca0return 0;
}

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

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

相关文章

长度最小的子数组(c++题解)

题目描述 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 输入格式 第一行输入两个整数n 和 target 第二行输入包含有n个元…

【Deep Dive: AI Webinar】数据合作和开源人工智能

【深入探讨人工智能】网络研讨系列总共有 17 个视频。我们按照视频内容&#xff0c;大致上分成了 3 个大类&#xff1a; 1. 人工智能的开放、风险与挑战&#xff08;4 篇&#xff09; 2. 人工智能的治理&#xff08;总共 12 篇&#xff09;&#xff0c;其中分成了几个子类&…

课程表分析

课程表分析 class Course(models.Model):name models.CharField(max_length64)title models.CharField(max_length64)students models.IntegerField(default0)level models.IntegerField(choices((0, 入门), (1, 进阶)), default0)time models.IntegerField(default0)det…

02、全文检索 ------ Solr(企业级的开源的搜索引擎) 的下载、安装、Solr的Web图形界面介绍

目录 Solr 的下载和安装Solr的优势&#xff1a;Lucene与Solr 安装 Solr1、下载解压2、添加环境变量3、启动 Solr Solr 所支持的子命令&#xff1a;Solr 的 Core 和 Collection 介绍Solr 的Web控制台DashBoard&#xff08;仪表盘&#xff09;Logging&#xff08;日志&#xff09…

代码随想录算法训练营29期|day34 任务以及具体任务

第八章 贪心算法 part03 1005.K次取反后最大化的数组和 class Solution {public int largestSumAfterKNegations(int[] nums, int K) {// 将数组按照绝对值大小从大到小排序&#xff0c;注意要按照绝对值的大小nums IntStream.of(nums).boxed().sorted((o1, o2) -> Math.ab…

华为1.24秋招笔试题

华为1.24秋招笔试题 1.题目1 题目详情 - 2024.1.24-华为秋招笔试-第一题-计算积分 - CodeFun2000 1.1题解 import java.util.Scanner;class Main{public static void main(String[] args){Scanner scnew Scanner(System.in);String ssc.next();char[] chs.toCharArray();in…

【INTEL(ALTERA)】如何在 Windows 操作系统上设置 Design Space Explorer II 远程 SSH 场

说明 从英特尔 Quartus Prime Pro Edition 软件 22.1 版本开始&#xff0c;您可以选择使用 Windows OpenSSH 服务器设置 Design Space Explorer II &#xff08;DSE II&#xff09;。 解决方法 1.让 DSE II 与 OpenSSH 协同工作的第一步是 安装 OpenSSH。应在远程主机上安装 Op…

electron从入门到打包exe

1.安装electron npm一直失败&#xff0c;我就cnpm安装的 2.创建一个简单示例&#xff1a; 新建一个文件夹&#xff0c;然后cmd 先搞个package.json: npm init -y然后再添加electron依赖 cnpm install electron然后再写个main.js const { app, BrowserWindow, Menu } req…

C++中的类的引入

一、类的引入 在C语言的结构体中只能定义变量&#xff1b;在C的结构体中&#xff0c;不仅可以定义变量&#xff0c;还可以定义函数。 例如&#xff0c;在用C语言实现栈时&#xff0c;结构体struct中只能定义变量&#xff1b;但是如果用C实现&#xff0c;结构体中还可以定义函…

qt语言国际化(翻译),并实现多窗口同时翻译

一、.pro文件中添加支持的语言 在.pro文件中添加下面几句&#xff0c;支持中文和英文 TRANSLATIONS lanague_cn.ts\lanague_en.ts二、通过qt语言家更新翻译生成.ts文件 完成以后在工程目录可以看到.ts文件 三、通过linguist翻译文件 打开文件 将两个文件同时选中&#xf…

【WPF.NET开发】优化性能:图形呈现层

本文内容 图形硬件呈现层定义其他资源 呈现层为运行 WPF 应用程序的设备定义图形硬件功能和性能级别。 1、图形硬件 对呈现层级别影响最大的图形硬件功能包括&#xff1a; 视频 RAM - 图形硬件中的视频内存量决定了可用于合成图形的缓冲区大小和数量。 像素着色器 - 像素着…

c# 海康照相机操作封装类(网口,USB)

需求 在上位机开发中, 海康照相机的使用应该是很常见的,主要是网口通讯的相机用的多,有时也会用一些USB接口相机。以前项目都在赶时间做。没有时间去好好设计和封装。时间长了发现重复代码就很多,还有没有设计和封装的代码,代码份数和相机个数对等,说白了就是一个相机写一…

【优秀案例】回本周期缩短10%!日安装量级高达5000以上!看NetMarvel如何赋能Ball Sort达成多项目标

“合成大西瓜在海外火了” 没想到&#xff0c;在国内已经过气的玩法转战到海外后&#xff0c;还能够翻红的这么彻底&#xff1f; 实际上&#xff0c;市面上很多在本土市场不温不火但转战海外赛道却盈利感人的应用不在少数&#xff0c;比如我们今天的重头戏《Ball Sort - Colo…

iView 中DatePicker日期选择器 v-model不生效的情况

场景 公司项目前段使用的是iview样式库&#xff0c;在开发的过程中&#xff0c;需要使用到时间选择器 使用后发现&#xff0c;输出的时间格式有问题&#xff0c;查看了需要使用到format来设置输出内容&#xff0c;发现不生效 百度… 1、百度后了解到v-model和format使用&…

基于Element的进度条Loading

基于Element的进度条loading组件 前端在中后台项目开发中经常要使用到loading遮罩层在数据交互时展示&#xff0c;目前我使用element组件库的loading&#xff0c;发现不能自定义&#xff0c;loading的样式比较少&#xff0c;官方只提供修改loading的图标和文字。 但是我的需求…

【云上建站】快速在云上构建个人网站4——网站备案

快速在云上构建个人网站4——网站备案 一、为网站配置域名1、使用域名的原因2、域名使用逻辑3、域名配置流程 二、域名注册1、查询域名&#xff1a;2、确认订单&#xff1a;3、实名认证域名4、域名解析配置解析域名&#xff1a;解析设置&#xff1a;访问域名&#xff1a; 一、为…

【深度学习:多关节嵌入模型】 Meta 解释的 ImageBind 多关节嵌入模型

【深度学习&#xff1a;多关节嵌入模型】 Meta 解释的 ImageBind 多关节嵌入模型 Meta 发布开源人工智能工具的历史分段任何模型DINOv2 什么是多模态学习&#xff1f;什么是嵌入&#xff1f;什么是 ImageBind&#xff1f;集成在 ImageBind 中的模式图像绑定架构特定模式编码器跨…

Flask框架开发学习笔记《6》前后端不分离基础框架

Flask框架开发学习笔记《6》前后端不分离基础框架 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 主要包含如下文件&#xff1a; static 目录中存储了图片templates 目录中存储了 html 文件utils.py 包含了 log 函数server.p…

资深Android逆袭、华为鸿蒙为安卓程序员开辟了一条新道路

本文章主要从以下5个方面来展开聊聊这个话题&#xff1a; 1.什么是鸿蒙 2.鸿蒙系统发展时间线 3.鸿蒙是套壳Android吗&#xff1f; 4.鸿蒙的生态&#xff08;用户以及开发者&#xff09; 5.一些建议 1月18日&#xff0c;在鸿蒙生态千帆启航仪式上&#xff0c;华为宣布了继鸿蒙4…

实现单点登录

指再多系统应用群中登录一个系统&#xff0c;便可在其他所有系统中得到授权而无需再次登录&#xff0c;包括单点登录与单点注销两部分。 相比于单系统登录&#xff0c;sso需要一个独立的认证中心&#xff0c;只有认证红心能接受用户的用户名密码等安全信息&#xff0c;其他系统…