[C++]运算符重载

一、运算符重载

在C++中,运算符重载(Operator Overloading)是一种允许程序员为已有的运算符(如+-*/等)赋予特定于类的含义的技术。通过运算符重载,可以使类的使用更加直观和自然,提高代码的可读性和易用性。

二、运算符重载的基本规则
  1. 不能改变运算符的优先级和结合性:例如,+运算符总是左结合的,重载后也必须是左结合的。
  2. 不能重载C++中的某些运算符:如..*::?:sizeoftypeid等。
  3. 重载运算符时,应当保持其原有的语义:例如,重载+运算符时,应当用于实现两个对象的加法操作。
  4. 大多数运算符可以通过成员函数或友元函数进行重载:但某些运算符(如赋值运算符=)只能作为成员函数重载。
  5. 重载运算符时,至少有一个操作数必须是用户定义的类型:这是为了防止与C++内置类型的运算符产生冲突。
三、运算符重载的语法
1. 成员函数重载

当运算符重载为成员函数时,左侧操作数(即对象本身)作为隐含参数传递给函数,而右侧操作数(如果有的话)作为显式参数传递。

class Complex {  
public:  Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}  // 成员函数重载 + 运算符  Complex operator+(const Complex& rhs) const {  return Complex(real + rhs.real, imag + rhs.imag);  }  private:  double real, imag;  
};
2. 友元函数重载

当需要重载的运算符涉及到非成员函数或需要访问类的私有成员时,可以使用友元函数进行重载。

class Complex {  
public:  Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}  // 声明友元函数  friend Complex operator+(const Complex& lhs, const Complex& rhs);  private:  double real, imag;  
};  // 定义友元函数  
Complex operator+(const Complex& lhs, const Complex& rhs) {  return Complex(lhs.real + rhs.real, lhs.imag + rhs.imag);  
}
四、选择成员函数还是友元函数
  1. 当运算符涉及到类的非成员函数或需要访问类的私有成员时,使用友元函数。
  2. 当运算符的逻辑与对象的状态无关时,或者仅需要访问对象的公有成员时,使用成员函数。
五、常见运算符重载示例
  1. 赋值运算符(=:必须作为成员函数重载,且应当返回对象的引用(*this),以支持链式赋值。
  2. 算术运算符(+-*/:通常根据操作数的对称性选择成员函数或友元函数重载。
  3. 关系运算符(==!=<<=>>=:通常作为友元函数重载,因为比较两个对象时,不需要修改任何对象的状态。
  4. 自增自减运算符(++--:有前缀和后缀两种形式,需要重载为成员函数。
六、注意事项
  1. 避免重载运算符导致歧义:确保重载后的运算符在不同上下文中的行为是清晰和一致的。
  2. 运算符重载应当保持直觉性:重载后的运算符应当符合其传统语义,避免让读者感到困惑。
  3. 运算符重载可能会降低代码的可移植性:因为不是所有编程语言都支持运算符重载。

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

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

相关文章

详解MLOps,从Jupyter开发到生产部署

大家好&#xff0c;Jupyter notebook 是机器学习的便捷工具&#xff0c;但在应用部署方面存在局限。为了提升其可扩展性和稳定性&#xff0c;需结合DevOps和MLOps技术。通过自动化的持续集成和持续交付流程&#xff0c;可将AI应用高效部署至HuggingFace平台。 本文将介绍MLOps…

kotlin compose 实现应用内多语言切换(不重新打开App)

1. 示例图 2.具体实现 如何实现上述示例,且不需要重新打开App ①自定义 MainApplication 实现 Application ,定义两个变量: class MainApplication : Application() { object GlobalDpData { var language: String = "" var defaultLanguage: Strin…

Linux TFTP服务搭建及使用

1、TFTP 服务器介绍 TFTP &#xff08; Trivial File Transfer Protocol &#xff09;即简单文件传输协议是 TCP/IP 协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。端口号为 69 2、TFTP 文件传输的特点 tftp…

【无标题】Elasticsearch for windows

一、windows安装Elasticsearch 1、Elasticsearch&#xff1a;用于存储数据、计算和搜索&#xff1b; 2、Logstash/Beats&#xff1a;用于数据搜集 3、Kibana&#xff1a;用于数据可视化 以上三个被称为ELK&#xff0c;常用语日志搜集、系统监控和状态分析 Elasticsearch安…

中英双语介绍“破发”(Breaking below issue price)

中文版 破发是指新发行的股票在上市后&#xff0c;市场交易价格跌破其发行价的现象。具体来说&#xff0c;如果一家公司通过首次公开募股&#xff08;IPO&#xff09;或增发股票等方式在证券市场上发行新股&#xff0c;而新股在二级市场上的交易价格低于其发行时确定的价格&am…

3、宠物商店智能合约实战(truffle智能合约项目实战)

3、宠物商店智能合约实战&#xff08;truffle智能合约项目实战&#xff09; 1-宠物商店环境搭建、运行2-webjs与宠物逻辑实现3-领养智能合约初始化4-宠物领养实现5-更新宠物领养状态 1-宠物商店环境搭建、运行 https://www.trufflesuite.com/boxes/pet-shop 这个还是不行 或者…

ArkUI状态管理

State装饰器 在声明式UI中&#xff0c;是以状态驱动试图更新 状态 (State) 指驱动视图更新的数据(被装饰器标记的变量) 试图(View) 基于UI描述渲染得到用户界面 说明 1.State装饰器标记的变量必须初始化&#xff0c;不能为空 2.State支持Object、classstring、number、b…

[Vulnhub] devt-improved slog_users+vim权限提升+nano权限提升+passwd权限提升+Lxc逃逸权限提升

信息收集 IP AddressOpening Ports192.168.101.149TCP:22,113,139,445,8080 $ nmap -p- 192.168.101.149 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | …

9.11和9.9哪个大?GPT-4o也翻车了

今天刷到了这个问题&#xff0c;心血来潮去问下chatgpt-4o&#xff0c;没想到疯狂翻车... 第一次问&#xff1a; GPT一开始给出了难绷的解答&#xff0c;让我想起了某短视频软件评论区里对某歌手节目排名的质疑哈哈哈哈哈 但是在接下来的进一步询问和回答中它反应过来了。 第…

JavaWeb笔记_Response对象

一.Response对象 1.1 Response对象概述 a.专门负责给浏览器响应信息&#xff08;响应行&#xff0c;响应头&#xff0c;响应体&#xff09;的对象 b.我们主要使用的是跟HTTP协议相关的Response对象&#xff1a;HTTPServletResponse&#xff0c;继承了ServletResponse&#x…

MAVSDK-Java开源库的SDK库macOS平台编译

1.先安装好JDK17 2.克隆MAVSDK-Java源码 3.检测工程./gradlew check 发现未安装protoc-gen-mavsdk 安装后要添加到环境变量 4.安装protoc-gen-mavsdk pip3 install protoc-gen-mavsdk安装路径为: /opt/anaconda3/lib/python3.11/site-packages/protoc_gen_mavsdk

“社群+”生态下的开源AI智能名片源码:驱动商业与社会连接的新引擎

摘要&#xff1a;在“社群”生态日益成为主流趋势的今天&#xff0c;开源AI智能名片源码作为技术创新与社群运营的深度融合体&#xff0c;正逐步展现出其重塑商业格局、深化社会连接的巨大潜力。本文旨在深入探讨开源AI智能名片源码的技术特性、在“社群”生态中的具体应用、对…

深入探索Python中的`__slots__`类属性:优化内存与限制灵活性

深入探索Python中的__slots__类属性&#xff1a;优化内存与限制灵活性 在Python编程的广阔领域中&#xff0c;性能优化总是开发者们关注的焦点之一。特别是在处理大量对象或资源受限的环境中&#xff0c;减少内存占用和提高访问速度显得尤为重要。Python的__slots__类属性正是…

Postman导出excel文件

0 写在前面 在我们后端写接口的时候&#xff0c;前端页面还没有出来&#xff0c;我们就得先接口测试&#xff0c;在此记录下如何使用postman测试导出excel接口。 如果不会使用接口传参可以看我这篇博客如何使用Postman 1 方法一 2 方法二 3 写在末尾 虽然在代码中写入文件名…

在 CentOS 7 上编译安装 Python 3.11

安装必要的依赖 首先&#xff0c;你需要安装一些开发工具和库&#xff0c;以便编译 Python 和 OpenSSL&#xff1a; yum -y groupinstall "Development tools" yum install -y wget gcc-c pcre pcre-devel zlib zlib-devel libffi-devel zlib1g-dev openssl-devel …

电流测量分流电阻

电流测量分流电阻 测量电流的设备称为安培计。大多数现代安培计测量已知电阻的精密电阻上的电压降。电流的计算使用欧姆定律&#xff1a;我五R 大多数电流表都内置电阻器来测量电流。但是&#xff0c;当电流对于电流表来说太高时&#xff0c;需要不同的设置。解决方案是将电流…

慢查询sql索引优化

模拟大量数据表、脚本 explain执行计划属性含义 1&#xff0c;id值越大越先执行&#xff0c;id相同顺序执行 2&#xff0c;select_type:simple、primary、subquery、derived衍生、union、union result select_type含义sqlsimple简单的select查询&#xff0c;查询中不包含子查…

Chromium CI/CD 之Jenkins实用指南2024- Windows节点开启SSH服务(七)

1.引言 在现代软件开发和持续集成的过程中&#xff0c;自动化部署和远程管理是不可或缺的关键环节。SSH&#xff08;Secure Shell&#xff09;协议以其强大的安全性和灵活性&#xff0c;成为连接和管理远程服务器的首选工具。对于使用Windows虚拟机作为Jenkins从节点的开发者而…

十、面向对象基础

文章目录 学习目标一、面向对象介绍二、类和对象2.1 类2.2 对象2.3 类的设计2.4 self语句的使用三、魔法方法3.1 对象操作的魔法方法3.2 运算符相关的魔法方法四、内置属性4.1 把对象当做一个字典使用五、类属性和对象(实例)属性六、私有属性和方法学习目标 说出面向对象和面向…

Visual Studio Code 实现远程开发

Background 远程开发是指开发人员在本地计算机上进行编码、调试和测试&#xff0c;但实际的开发环境、代码库或应用程序运行在远程服务器上。远程开发的实现方式多种多样&#xff0c;包括通过SSH连接到远程服务器、使用远程桌面软件、或者利用云开发环境等。这里我们是使用VSCo…