运算符重载(Operator Overloading)

news2024/10/22 16:32:14

定义

在C++中,运算符重载(Operator Overloading)是一种允许程序员为自定义数据类型重新定义或重载已有的运算符的功能。通过运算符重载,我们可以使得自定义类型的对象能够像内置类型(如int、float等)一样使用运算符。

运算符重载的规则

  1. 不能改变运算符的优先级和结合性:重载的运算符必须保持其原有的优先级和结合性。
  2. 不能创建新的运算符:我们只能重载C++中已经存在的运算符。
  3. 有些运算符不能被重载:如..*?:sizeoftypeid等运算符不能被重载。
  4. 重载运算符不能改变操作数的个数:重载的运算符必须保持原有的操作数个数。
  5. 重载运算符可以是成员函数或非成员函数:对于非成员函数,需要至少有一个参数是自定义类型;对于成员函数,第一个参数(即this指针)总是隐式的。

示例

下面是一个简单的示例,展示了如何为自定义的复数类重载加法运算符:

#include <iostream>  
  
class Complex {  
public:  
    double real;  
    double imag;  
  
    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);  
    }  
  
    void print() const {  
        std::cout << "(" << real << ", " << imag << ")" << std::endl;  
    }  
};  
  
int main() {  
    Complex c1(1, 2);  
    Complex c2(3, 4);  
    Complex sum = c1 + c2;  // 使用重载的加法运算符  
    sum.print();           // 输出: (4, 6)  
    return 0;  
}

编译运行

在这个例子中,我们定义了一个Complex类来表示复数,并为其重载了加法运算符。重载的加法运算符是一个成员函数,它接受一个Complex类型的右操作数(通过const Complex& rhs参数),并返回一个新的Complex对象,该对象的实部和虚部分别是两个操作数对应部分的和。

非成员函数运算符重载示例

有时,将运算符重载为非成员函数可能更为合适,特别是当运算符涉及两个不同类型的对象时。

示例

#include <iostream>  
  
class Complex {  
public:  
    double real;  
    double imag;  
  
    Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) {}  
  
    // 其他成员函数...  
};  
  
// 重载乘法运算符作为非成员函数  
Complex operator*(const Complex& lhs, const Complex& rhs) {  
    return Complex(lhs.real * rhs.real - lhs.imag * rhs.imag,  
                    lhs.real * rhs.imag + lhs.imag * rhs.real);  
}  
  
int main() {  
    Complex c1(1, 2);  
    Complex c2(3, 4);  
    Complex product = c1 * c2;  // 使用重载的乘法运算符  
    // ...  
    return 0;  
}

在这个例子中,乘法运算符被重载为一个非成员函数,它接受两个Complex类型的参数,并返回一个新的Complex对象,该对象表示两个复数的乘积。注意,非成员函数需要能够访问类的私有成员,因此通常需要将运算符重载函数声明为类的友元函数。然而,在这个例子中,由于我们只需要访问公共成员realimag,因此不需要将运算符重载函数声明为友元。

什么运算符不能重载, 什么运算符能重载

在C++中,不是所有的运算符都可以被重载。以下是关于哪些运算符能重载、哪些不能重载以及为什么的详细解释,并附以例子。

不能重载的运算符

C++中不允许重载的运算符主要包括以下几类:

  1. 点运算符(.)和成员选择运算符(->*:这些运算符用于访问对象的成员,重载它们会破坏语言的基本结构和语义。
  2. 作用域解析运算符(:::这个运算符用于指定命名空间或类的成员,重载它会破坏语言的命名空间机制。
  3. 三元条件运算符(?::这个运算符的语义非常特定,且重载它可能会导致逻辑上的混乱。
  4. sizeoftypeid运算符:这两个运算符用于获取类型信息,重载它们会破坏语言的类型系统。

能重载的运算符

除了上述不能重载的运算符外,C++中的其他运算符基本都可以被重载。这些运算符包括:

  1. 算术运算符:如+-*/%等,可以用于自定义类型的数值计算。
  2. 关系运算符:如==!=<<=>>=等,可以用于自定义类型的比较操作。
  3. 逻辑运算符:如&&||!等,可以用于自定义类型的逻辑判断。
  4. 位运算符:如&|^~<<>>等,可以用于自定义类型的位操作。
  5. 递增和递减运算符++--,可以用于自定义类型的自增和自减操作。
  6. 赋值运算符:如=+=-=*=/=等,可以用于自定义类型的赋值操作。
  7. 下标运算符[],可以用于自定义类型的数组或容器访问。
  8. 调用运算符(),可以用于自定义类型的函数调用。
  9. 成员访问运算符->,通常用于指针类型的重载,以提供类似智能指针的语法糖。

为什么能重载这些运算符

这些运算符能够被重载的主要原因是,它们都有明确的语义,且重载它们不会破坏语言的基本结构和语义。通过重载这些运算符,我们可以使得自定义类型的对象能够像内置类型一样进行各种操作,从而提高代码的可读性和易用性。

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

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

相关文章

基于iOS真机的Appium自动化测试

必要条件 XCode > 6.0, 7.1.1&#xff08;注意Appium并不一定支持最新版本的Xcode&#xff09;Mac OS X 10.10 or 更高, 建议使用10.11.1 Xcode 安装 APP Store安装 注意事项&#xff1a; Xcode 安装包很大&#xff08;5G左右&#xff09;&#xff0c;Xcode移动到应用程序…

响应式编程五股票订阅系统实现

响应式编程五 使用StepVerifier测试响应式流StepVerifier要点 使用StepVerifier进行高级测试股票订阅系统数据库表 使用StepVerifier测试响应式流 出于测试目的&#xff0c;Reactor 提供了额外的 reactor-test 模块&#xff0c;该模块提供了 StepVerifier。StepVerifier 提供了…

Android 13 WMS-动画流程

动画的类型如下 IntDef(flag true, prefix { "ANIMATION_TYPE_" }, value {ANIMATION_TYPE_NONE,ANIMATION_TYPE_APP_TRANSITION,ANIMATION_TYPE_SCREEN_ROTATION,ANIMATION_TYPE_DIMMER,ANIMATION_TYPE_RECENTS,ANIMATION_TYPE_WINDOW_ANIMATION,ANIMATION_TYPE_…

以人为本的AI技术升级

我们需要以人为本的技术来提高生产力和投资回报率。 通过在数据标注流程中融合机器学习辅助技术&#xff0c;可以减少数据标注所需的时间、资金和人力。 有很多方法可以防止标注员被模型的预测误导。 在传统的机器学习&#xff08;Machine Learning&#xff09;方法下&#…

一篇长文教你进行全方位的使用appium【建议收藏】

随着移动应用的日益普及&#xff0c;移动应用的测试成为了软件开发的重要组成部分。Python&#xff0c;作为一种易于学习&#xff0c;功能强大的编程语言&#xff0c;特别适合进行这种测试。本文将详细介绍如何使用Python进行APP测试&#xff0c;并附带一个实例。 Python 和 A…

Docker快速入门和部署项目

1&#xff0c;Docker是一个&#xff0c;快速构建、运行、管理应用的工具 。 2&#xff0c;前面我们了解过在Linux操作系统的常见的命令以及如何在Linux中部署一个人单体的项目。感受如何呢&#xff1f;&#xff1f;&#xff1f; 命令太多了&#xff0c;记不住 软件安装包名字复…

网络学习:数据的封装与解封装

目录 一、数据的封装与解封装 1. 数据的封装过程 2. 数据的解封装过程 二、数据的传输过程 1. 相关概念 2. 网络传输过程中数据封装和解封装模拟 一、数据的封装与解封装 1. 数据的封装过程 数据封装过程&#xff0c;在这里我们举例说明&#xff0c;以两台主机的通信为…

【docker基础学习之】镜像构建

下面是在工作过遇到的一些实际例子&#xff0c;谨以此作为笔记参考 目录 1.背景2. 寻找方案3. 如何解决4.解决步骤4.1 DockerFile4.2 现在要做的 5. 镜像相关命令 1.背景 部署&#xff08;迁移&#xff09;项目时发现&#xff0c;项目的excel导出功能报错&#xff0c;错误如下…

ChatGPT数据分析应用——同期群分析

ChatGPT数据分析应用——同期群分析 ​ 同期群分析在一定程度上属于分组分析的一个变种。顾名思义&#xff0c;同期群就是相同时期的群体&#xff0c;同期群分析就是针对相同时期的群体展开分析。接下来我们让ChatGPT解释这个方法的概念并提供相应的案例。发送如下内容给ChatG…

chrome插件webRequest拦截请求并获取post请求体requestBody数据raw内容,解决中文乱码问题

详细使用说明可以看官方文档&#xff1a;https://developer.chrome.com/docs/extensions/reference/api/webRequest?hlzh-cn 拦截操作 想要通过浏览器插件拦截请求的话&#xff0c;需要在manifest.json里面添加webRequet权限&#xff1a; 拦截请求代码放在background.js里面…

力扣--从前序与中序遍历序列构造二叉树

题目&#xff1a; 思想&#xff1a; 首先先序遍历能确定根节点的值&#xff0c;此时查看该值在中序遍历中的位置&#xff08;如果索引为i&#xff09;&#xff0c;那么i左侧为左子树&#xff0c;i 右侧为右子树。从中序数组中即可看出左子树结点个数为 i&#xff0c;右子树节点…

王道机试C++第 3 章 排序与查找:排序问题 Day28(含二分查找)

查找 查找是另一类必须掌握的基础算法&#xff0c;它不仅会在机试中直接考查&#xff0c;而且是其他某些算法的基础。之所以将查找和排序放在一起讲&#xff0c;是因为二者有较强的联系。排序的重要意义之一便是帮助人们更加方便地进行查找。如果不对数据进行排序&#xff0c;…

ACM题解Day10|总结篇|进制转化,GCD ,LCM ,二分答案

&#x1f525;博客介绍&#xff1a; 27dCnc [Cstring中find_first_not_of()函数和find_last_not_of()函数-CSDN博客] 方差,期望 概率 今日打卡: 算法周总结 ACM题解Day3| To Crash or not To Crash,Integer Prefix ,I don’t want to pay for the Late Jar-CSDN博客 第3题:…

【LeetCode:2917. 找出数组中的 K-or 值 + 模拟+位运算】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

如何将 ONLYOFFICE 协作空间部署到 Kubernetes / OpenShift 集群中

需要 ONLYOFFICE 协作空间的可扩展实例吗&#xff1f;使用 Helm 轻松将其安装到 Kubernetes 或 OpenShift 集群中。阅读本文了解详情。 ONLYOFFICE 协作空间是什么 ONLYOFFICE 协作空间是一个协同办公平台&#xff0c;能够帮助用户更好地与客户、业务合作伙伴、承包商及第三方…

驱动调试第013期-G120XA驱动同步电机应用案例

概述 SINAMICS G120XA是西门子SINAMICS系列变频器的新成员&#xff0c; 功率范围覆盖0.75 kW~560 kW&#xff0c;内置风机和水泵行业应用功能&#xff0c;汇集了优异的高性能矢量控制算法&#xff0c;可以轻松的驱动风机、水泵及压缩机等负载。胜任各种应用场合&#xff0c;专…

【python基础学习11课_异常机制】

一、异常 1、异常的定义 异常&#xff1a;程序无法继续执行异常会中断程序执行异常处理&#xff0c;是为了不中断程序执行。而不是避免错误。有些代码是报错就是要暴露出来有了异常机制&#xff0c;错误的代码报错后抛出异常&#xff0c;代码从上到下&#xff0c;报错代码后面…

触发HTTP preflight预检及跨域的处理方法

最近在做需求的过程中&#xff0c;遇到了很多跨域和HTTP预检的问题。下面对我所遇到过的HTTP preflight和跨域的相关问题进行总结&#xff1a; 哪些情况会触发HTTP preflight preflight属于cors规范的一部分&#xff0c;在有跨域的时候&#xff0c;在一定情况下会触发preflig…

字节开启新一轮期权回购,价格又涨了(含算法原题)

字节期权 近日&#xff0c;字节跳动开启新一轮期权回购&#xff0c;价格微涨至 170 美元。 之前我们就写过 文章&#xff0c;分享历年来字节跳动的期权变化情况&#xff0c;这里再贴一下&#xff1a; 18年&#xff1a;10 19年&#xff1a;30 20年&#xff1a;60-70 21年&#x…

Linux系统编程(六)高级IO

目录 1. 阻塞和非阻塞 IO 2. IO 多路转接&#xff08;select、poll、epoll&#xff09; 3. 存储映射 IO&#xff08;mmap&#xff09; 4. 文件锁&#xff08;fcntl、lockf、flock&#xff09; 5. 管道实例 - 池类算法 1. 阻塞和非阻塞 IO 阻塞 IO&#xff1a;会等待操作的…