运算符重载(Operator Overloading)

定义

在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.hqwc.cn/news/518815.html

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

相关文章

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

功能演示&#xff1a; 基于yolov5的柿子成熟度检测系统&#xff0c;系统既能够实现图像检测&#xff0c;也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的柿子成熟度检测系统是在pytorch框架下实现的&#xff0c;这是一个完整的…

AES加密学习

AES&#xff08;高级加密标准&#xff09;是一种对称密钥加密算法&#xff0c;用于加密和解密数据。它被广泛应用于各种安全领域&#xff0c;包括但不限于网络通信、数据存储和软件保护。 历史背景 AES是由比利时密码学家Joan Daemen和Vincent Rijmen设计的Rijndael算法演变而…

MySQL实战45讲——30答疑文章(二):用动态的观点看加锁

目录 不等号条件里的等值查询 等值查询的过程 怎么看死锁&#xff1f; 怎么看锁等待&#xff1f; update 的例子 小结 上期问题时间 提示 文章摘自林晓斌老师《MySQL实战45讲》&#xff0c;作为笔记而用&#xff0c;故有加一些自己的理解。在第[20]和[21]篇文章中&…

加油!你也可以成为学生口中的“好老师”

在教育的道路上&#xff0c;每一位教师都承载着塑造未来的重要使命。而成为学生口中的“好老师”&#xff0c;无疑是每位教育工作者的追求和荣耀。那么&#xff0c;如何才能成为这样的“好老师”呢&#xff1f; 一、热爱教育&#xff0c;关爱学生 成为“好老师”的首要条件是对…

Freecad Assembly4装配模型设计入门

一、基本信息 本文内容&#xff1a;学习Assembly4装配模型设计功能。 2024年3月7日 最新版Freecad 0.21.2 最新版 Assembly4 0.50.8 下载地址&#xff1a;stoneold/FreeCAD_Assembly4 最新版 Assembly4 示例教程 下载地址&#xff1a;FreeCAD_Examples: Freecad Assmbly4 …

安全防御第七次作业

拓扑图如图所示&#xff1a; 问题&#xff1a;在FW7和FW8之间建立一条IPSEC通道保证10.0.2.0/24网段 可以正常访问到192.168.1.0/24 注&#xff1a;基础配置我在此省略了 一、NAT配置 FW4&#xff1a; FW6&#xff1a; 二、在FW4上做服务器映射 三、配置IPSEC FW5&#xff…

Vue+SpringBoot打造考研专业课程管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 考研高校模块2.3 高校教师管理模块2.4 考研专业模块2.5 考研政策模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 考研高校表3.2.2 高校教师表3.2.3 考研专业表3.2.4 考研政策表 四、系统展示五、核…

中间件 | Redis - [基本信息]

INDEX 1 常规用法2 QPS3 pipeline 1 常规用法 分布式锁 最常见用法&#xff0c;需要注意分布式锁的redis需要单点 分布式事务 分布式事务中&#xff0c;核心的技术难点其实是分布式事务这个事本身作为数据的持久化 2PC&#xff0c;比如 seata 的 AT 模式下&#xff0c;将 un…

101 向一个不存在的路径发送请求, get 得到 404, post 得到 405

前言 这是 最近碰到的一个问题, 大概是在 2022.05.30 前端这边 发送了一个业务请求过来, 这个请求路径是服务端这边不存在的 但是 奇怪的一点就是, 如果是以 get 请求发送过来, 服务端响应的是正确的 404 "Not Found", 但是 如果是以 post 请求发送过来, 服务端这边…

【漏洞复现】-用友CRM系统存在逻辑漏洞直接登录后台

免责声明&#xff1a; 本文内容为学习笔记分享&#xff0c;仅供技术学习参考&#xff0c;请勿用作违法用途&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。任何个人和组织利用此文所提供的信息而造成的直接或间接后果和损失&#xff0c;…

Git 掌握

一、前言 大二上学期&#xff0c;学校开了数据库的课程&#xff0c;让做课程设计&#xff0c;数据库代码&#xff0c;文档等都搞好了&#xff0c;让老师看的时候文档写的不好&#xff0c;让修改&#xff0c;改了之后继续让老师看&#xff0c;来来回回弄了三四次&#xff0c;最…

LeetCode每日一题之 快乐数

目录 题目介绍&#xff1a; 算法原理&#xff1a; 鸽巢原理&#xff1a; 如何找到环里元素&#xff1a; 代码实现&#xff1a; 题目介绍&#xff1a; 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 算法原理&#xff1a; 我先简单举两个例子&#xff…