C++ 中的运算符重载(二)

运算符重载的实例和应用

运算符重载是一种非常实用和有趣的特性,它可以让我们对自定义类型的数据进行各种操作,从而实现一些复杂和高级的功能。下面我们就来介绍一些运算符重载的实例和应用,以及它们的代码和效果:

  • 重载赋值运算符=,用于实现对象的拷贝赋值。赋值运算符=是一种特殊的运算符,它可以对任何类型的数据进行赋值操作,即将右操作数的值赋给左操作数。但是,如果我们想要对自定义类型的数据进行赋值操作,例如类的对象,那么我们就需要重载赋值运算符=,以便实现对象的拷贝赋值,即将右操作数对象的所有成员变量的值赋给左操作数对象的对应成员变量。这样,我们就可以实现对象的深拷贝,而不是浅拷贝,避免出现一些潜在的问题,例如内存泄漏、空指针、重复释放等。例如,我们可以定义一个String 类来表示字符串,然后重载赋值运算符=,用于实现字符串的拷贝赋值。代码如下:
// 定义String 类
class String {
public:// 构造函数,用于初始化字符串对象String(const char* str = "") {// 如果参数为空字符串,就将指针指向一个空字符,否则就动态分配内存并拷贝字符串if (str == "") {this->str = new char[1];this->str[0] = '\0';} else {this->str = new char[strlen(str) + 1];strcpy(this->str, str);}}// 拷贝构造函数,用于初始化字符串对象String(const String& s) {// 动态分配内存并拷贝字符串this->str = new char[strlen(s.str) + 1];strcpy(this->str, s.str);}// 析构函数,用于释放字符串对象~String() {// 释放动态分配的内存delete[] this->str;}// 重载赋值运算符,用于实现字符串的拷贝赋值String& operator=(const String& s) {// 如果左操作数和右操作数是同一个对象,就直接返回左操作数的引用,避免自赋值的错误if (this == &s) {return *this;}// 释放左操作数原有的内存delete[] this->str;// 动态分配新的内存并拷贝字符串this->str = new char[strlen(s.str) + 1];strcpy(this->str, s.str);// 返回左操作数的引用,以便进行连续赋值return *this;}// 声明友元函数,用于输出字符串对象friend std::ostream& operator<<(std::ostream& out, const String& s);
private:// 私有成员变量,用于存储字符串的指针char* str;
};// 定义友元函数,用于输出字符串对象
std::ostream& operator<<(std::ostream& out, const String& s) {// 输出字符串的内容out << s.str;// 返回输出流对象,以便进行连续输出return out;
}// 主函数,用于测试
int main() {// 创建两个字符串对象String s1("Hello");String s2("World");// 使用赋值运算符对字符串进行拷贝赋值,并输出结果std::cout << (s1 = s2) << std::endl; // 输出结果为:World// 使用赋值运算符对字符串进行连续赋值,并输出结果std::cout << (s1 = s2 = "Bing") << std::endl; // 输出结果为:Bingreturn 0;
}

从上面的代码可以看出,重载赋值运算符=可以让我们对字符串对象进行拷贝赋值,就像对内置类型的数据进行赋值一样。这样,我们就可以实现字符串对象的深拷贝,避免出现一些潜在的问题,例如内存泄漏、空指针、重复释放等。

  • 重载插入运算符<<和提取运算符>>,用于实现对象的输入和输出。插入运算符<<和提取运算符>>是两种特殊的运算符,它们可以对标准输入流std::cin和标准输出流std::cout进行操作,实现数据的输入和输出。但是,如果我们想要对自定义类型的数据进行输入和输出,例如类的对象,那么我们就需要重载插入运算符<<和提取运算符>>,以便实现对象的输入和输出,即将对象的内容输出到标准输出流,或者从标准输入流读取数据并赋给对象。这样,我们就可以实现对象的交互和显示,提高用户的体验和友好性。例如,我们可以定义一个Point 类来表示二维平面上的点,然后重载插入运算符<<和提取运算符>>,用于实现点的输入和输出。代码如下:
// 定义Point 类
class Point {
public:// 构造函数,用于初始化点对象Point(int x = 0, int y = 0) {this->x = x;this->y = y;}// 声明友元函数,用于重载插入运算符friend std::ostream& operator<<(std::ostream& out, const Point& p);// 声明友元函数,用于重载提取运算符friend std::istream& operator>>(std::istream& in, Point& p);
private:// 私有成员变量,用于存储点的横坐标和纵坐标int x;int y;
};// 定义友元函数,用于重载插入运算符
std::ostream& operator<<(std::ostream& out, const Point& p) {// 输出点的横坐标和纵坐标,用括号和逗号分隔out << "(" << p.x << ", " << p.y << ")";// 返回输出流对象,以便进行连续输出return out;
}// 定义友元函数,用于重载提取运算符
std::istream& operator>>(std::istream& in, Point& p) {// 从输入流读取两个整数,并赋给点的横坐标和纵坐标in >> p.x >> p.y;// 返回输入流对象,以便进行连续输入return in;
}// 主函数,用于测试
int main() {// 创建一个点对象Point p1;// 使用提取运算符对点进行输入,并输出结果std::cout << "Please enter a point: ";std::cin >> p1;std::cout << "The point you entered is: " << p1 << std::endl;// 例如,输入:1 2// 输出结果为:The point you entered is: (1, 2)return 0;
}

从上面的代码可以看出,重载插入运算符<<和提取运算符>>可以让我们对点对象进行输入和输出,就像对内置类型的数据进行输入和输出一样。这样,我们就可以实现点对象的交互和显示,提高用户的体验和友好性。

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

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

相关文章

docker:安装nginx并部署一个前端项目

文章目录 导语传统方式1、下载镜像2、copy项目文件到docker中3、访问 打包镜像的方式1、创建 Dockerfile2、创建 Nginx 配置文件3、构建 Docker 镜像4、运行 Docker 容器5、访问前端项目 总结 导语 这篇博客将介绍 docker 使用 nginx 部署前端项目的两种方式 传统方式 1、下…

C语言给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)

这个题目要求的输出是一串数字&#xff01;&#xff01;&#xff01; 不是下面&#xff1a;输入在一行中给出 10 个非负整数&#xff0c;顺序表示我们拥有数字 0、数字 1、……数字 9 的个数。整数间用一个空格分隔。10 个数字的总个数不超过 50&#xff0c;且至少拥有 1 个非…

Python自动化测试之破解图文验证码

对于web应用程序来讲&#xff0c;处于安全性考虑&#xff0c;在登录的时候&#xff0c;都会设置验证码&#xff0c; 验证码的类型种类繁多&#xff0c;有图片中辨别数字字母的&#xff0c;有点击图片中指定的文字的&#xff0c;也有算术计算结果的&#xff0c;再复杂一点就是滑…

软考人数已超500万!请重视!

2020年40万&#xff0c;2021年94万&#xff0c;2022年129万&#xff0c;2023年软考报考人数已超500万&#xff01;2年时间直翻10倍&#xff01;如此火爆原因是什么&#xff1f; 不是打广告&#xff01;不是打广告&#xff01;不是打广告 千万不要上了”黑心培训结构“当&#x…

App的回归测试,有什么高效的测试方法?

直接抛出观点&#xff1a;高效的测试方法当然有&#xff0c;那就是采用【接口自动化】。 一、回归测试&#xff0c;测哪些东西 回归测试是软件测试过程中的一个重要的环节&#xff0c;如果说冒烟测试是对软件质量的抽检&#xff0c;那么回归测试就是保证软件质量的最后一道屏障…

集合01 - Java

集合 1、数组的不足2、集合3、集合的框架体系&#xff08;背&#xff09;CollectionMap 1、数组的不足 前面我们保存多个数据使用的是数组&#xff0c;那么数组有不足的地方&#xff0c;我们分析一下。 数组&#xff1a; 长度开始时必须指定,而且一旦指定&#xff0c;不能更改…

Linux环境变量与命令行参数

Linux环境变量与命令行参数 一.命令行参数1.语法2.应用1:简易计算器 二.环境变量1.环境变量的概念2.环境变量的作用3.进一步理解环境变量的作用4.常见环境变量5.导出环境变量(添加环境变量)6.环境变量的特性7.另一种获取环境变量的方式8.小功能:用于身份验证的代码9.补充:第三种…

SAP CA01/CA02 创建及更新工艺路线BAPI

前言 最近需要做一个routing的批导&#xff0c;初步查过资料后&#xff0c;发现下面几个BAPI: BAPI_ROUTING_CREATE&#xff1a;最常用的BAPI&#xff0c;只支持创建&#xff0c;没有对应的CHANGE BAPI&#xff1b; ROUTING_MAINTAIN&#xff1a;不支持创建&#xff0c;只支…

C/C++,优化算法——使用遗传算法的旅行商问题(traveling-salesman-problem)的源程序

1 文本格式 #include <bits/stdc.h> #include <limits.h> using namespace std; // Number of cities in TSP #define V 5 // Names of the cities #define GENES ABCDE // Starting Node Value #define START 0 // Initial population size for the algorith…

HDFS 3.x 数据存储新特性-纠删码

HDFS是⼀个⾼吞吐、⾼容错的分布式⽂件系统,但是HDFS在保证⾼容错的同时也带来⾼昂的存储成本,⽐如有5T的数据存储在HDFS上,按照HDFS的默认3副本机制,将会占⽤15T的存储空间。那么有没有⼀种能达到和副本机制相同的容错能⼒但是能⼤幅度降低存储成本的机制呢,有,就是在HD…

ahk系列-windows超级运行框-表达式计算(12)—功能汇总

1、环境准备 windows 7&#xff0c;8&#xff0c;10&#xff0c;11操作系统ahk 2.x_64位翻译功能需要联网使用 2、使用方式 输入winR打开windows运行框 get/getpath 命令获取配置文件环境变量set/sets 设置 “用户/系统” 环境变量或者pathencode/decode 中文编码和解码len…

【算法题】一种字符串压缩表示的解压(js)

输入&#xff1a;2dff 输出 !error 两个d不需要压缩&#xff0c;故输入不合法 输入:4eA 输出:!error 全部由小写英文字母组成&#xff0c;压缩后不会出现&#xff0c;故输出不合法 function solution(str) {const error "!error";// 只能包含小写字母和数字 [^a-z0…

详解线段树

前段时间写过一篇关于树状数组的博客树状数组&#xff0c;今天我们要介绍的是线段树&#xff0c;线段树比树状数组中的应用场景更加的广泛。这些问题也是在leetcode 11月的每日一题频繁遇到的问题&#xff0c;实际上线段树就和红黑树 、堆一样是一类模板&#xff0c;但是标准库…

【荣誉】科东软件荣获广州市软件行业协会双料大奖!

软件产业在数字经济中扮演着基础支撑的角色&#xff0c;对于优化产业结构、提高自主可控、赋能整体经济高质量发展具有关键作用。 近日&#xff0c;广州市软件行业第七届会员大会第三次会议成功召开&#xff01;此次会议旨在回顾过去一年的行业发展&#xff0c;展望未来的趋势和…

React useCallback 详解

在 React 中&#xff0c;useCallback 是一个非常实用的 Hook&#xff0c;它可以帮助我们避免在每次渲染时都创建新的函数&#xff0c;从而提高性能。useCallback 返回一个记忆化的回调函数&#xff0c;它只在其依赖项改变时才会改变。 下面是一个详细的 React useCallback 教程…

nginx编译安装及配置文件的修改

编译安装nginx 1.关闭防火墙&#xff0c;安全机制&#xff0c;去官网下载nginx压缩包&#xff0c;并进行解压 systemctl stop firewalld #关闭防火墙 systemctl disable --now firewalld #开机不自启并立即关闭防火墙 setenforce 0 #关闭安全机制 2.安装依赖包&#xff0…

CSU计算机学院2023秋C语言期中题目思路分享(前三道题)

文章目录 写在前面A&#xff1a;个税计算——阅读理解与数据类型转换原题输入输出样例输入样例输出 题目分析题目理解代码实现与问题解决 我的代码 B&#xff1a;时制转换——问题是一点点解决的原题输入输出样例输入样例输出 题目分析我的代码 C&#xff1a;统计进位——人教版…

编程语言分类

如果要将编程语言分成两大类&#xff0c;可以考虑以下分类方式&#xff1a; 编译型语言&#xff08;Compiled Languages&#xff09;&#xff1a;这类语言在运行之前需要通过编译器将源代码转换为机器码或类似形式的可执行代码。编译型语言的特点包括&#xff1a; 需要显式的编…

用PHP与html做一个简单的登录页面

用PHP与html做一个简单的登录页面 login.html的设计 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&…

我一人全干!之二,vue3后台管理系统树形目录的实现。

一个完整的后台管理系统需要一个树形结构的目录&#xff0c;方便用户切换页面。 因为使用的是element-plus的ui库&#xff0c;所以首选el-menu组件&#xff0c;点击查看文档。 因为此组件不是树形结构的&#xff0c;所以需要封装成系统需要的树形结构组件。可以使用vue的递归组…