首页 > 编程语言 >c++中运算符重载总结

c++中运算符重载总结

时间:2023-01-21 18:11:30浏览次数:45  
标签:函数 对象 c++ 运算符 operator Complex 重载

运算符重载的本质是函数重载。

语法格式
重载函数的一般格式如下:
返值类型 operator 运算符名称(形参表列)
{
        重载实体;
}
operator 运算符名称 在一起构成了新的函数名。比如
const Complex operator+(const Complex &c1,const Complex &c2);
我们会说,operator+ 重载了重载了运算符+。

如果是能够连续使用的运算符,一般会返回他自己的引用或者他自身,比如=,<<这种在一个语句中可以重复使用的

 

 

 

 同时也只有自身能够返回引用,因为this不是一个局部变量,其他局部变量不能这样做

 

运算符重载中一种常用的手段是友元重载,因为运算符一般使用全局重载,友元重载能够帮助全局重载后的运算符能够正常使用类内的数据

(2,3)
(3,4)
(5,7)
(5,7)

重载规则
(1)C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载。

(2)C++允许重载的运算符
C++中绝大部分运算符都是可以被重载的。

不能重载的运算符只有4个:

(3)重载不能改变运算符运算对象(即操作数)的个数。
例如,关系运算符“>”和“<”等是双目运算符,重载后仍为双目运算符,需要两个参数。运算符”+“,”-“,”*“,”&“等既可以作为单目运算符,也可以作为双目运算符,可以分别将它们重载为单目运算符或双目运算符。
(4)重载不能改变运算符的优先级别。
例如”*“和”/“优先级高于”+“和”-“,不论怎样进行重载,各运算符之间的优先级不会改变。有时在程序中希望改变某运算符的优先级,也只能使用加括号的方法强制改变重载运算符的运算顺序。
(5)重载不能改变运算符的结合性。
如,复制运算符”=“是右结合性(自右至左),重载后仍为右结合性。
(6)重载运算符的函数不能有默认的参数
否则就改变了运算符参数的个数,与前面第(3)点矛盾。
(7)重载运算符的运算中至少有一个操作数是自定义类。
重载的运算符必须和用户定义的自定义类型的对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。也就是说,参数不能全部是C++的标准类型,防止将原有的的默认实现抵消

(8)不必重载的运算符(= &)
用于类对象的运算符一般必须重载,但有两个例外,运算符”=“和运算符”&“不必用户重载。
复制运算符”=“可以用于每一个类对象,可以用它在同类对象之间相互赋值。因为系统已为每一个新声明的类重载了一个赋值运算符,它的作用是逐个复制类中的数据成员 地址运算符&也不必重载,它能返回类对象在内存中的起始地址。 (9)对运算符的重载,不应该失去其原有的意义
应当使重载运算符的功能类似于该运算符作用于标准类型数据时候时所实现的功能。例如,我们会去重载”+“以实现对象的相加,而不会去重载”+“以实现对象相减的功能,因为这样不符合我们对”+“原来的认知。
  总结 1.重载格式

 

i++

const Complex operator++(int);

friend const Complex operator++(Complex &c,int);//哑元

++i

Complex & operator++(); 

friend Complex & operator++(Complex& c); 

2.只能重载为成员函数的

 

 3.常规建议

 

4.友元还是成员?
假设,我们有类Sender类和Mail类,实现发送邮件的功能。
Sender sender; Mail mail;
sender<< mail;

 sender左操作数,决定了operator<<为Sender的成员函数,而mail决定了operator<<要作Mail类的友员。因为sender是实际操作<<运算符的类,所以<<要作为他的成员函数来使用,而mail是被操作的类,要保证mail类中的数据对于重载的<<可调用,所以该函数是他的友元。

 结论:
1,一个操作符的左右操作数不一定是相同类型的对象,这就涉及到将该操作符函数定义为谁的友元,谁的成员问题。
2,一个操作符函数,被声明为哪个类的成员,取决于该函数的调用对象(通常是左操作数)。

3.一个操作符函数,被声明为哪个类的友员,取决于该函数的参数对象(通常是右操作数)

4.而二元运算符因为两个变量都是被操作符也都是操作符,所以设置一个成员,一个友元太麻烦,一般直接设置非成员函数并且做两个友元

 

标签:函数,对象,c++,运算符,operator,Complex,重载
From: https://www.cnblogs.com/uestc-du/p/17063951.html

相关文章

  • [C/C++] 简单实现按字符分割字符串split函数
    记录一下/***字符串str通过字符target进行分割*/vector<string>split(stringstr,chartarget){vector<string>res;intpos=0;while(po......
  • c/c++ mysql api函数
    一、常用APImysql_affected_rows()返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。mysql_autocommit()切换autocommit模式,ON/OFFmysql_change_user()......
  • C++概述、选择结构、循环结构
    目录1C++概述1.1计算两个整数相加之和1.2计算三个整数相加之和2选择结构2.1小老鼠走迷宫1(if语句)2.2小老鼠走迷宫1(if语句)(多个单分支结构)2.3小老鼠走迷宫2(switch语句)2......
  • C++实战笔记(三)异常处理
    tags:C++Interview写在前面简单总结一下C++异常处理部分(Exception).异常只是C++为了处理错误提出的一种解决方案,并不是唯一的一种.异常处理特点异常处理的流程完全独立......
  • c++ return
    return本是上是一个拷贝过程,不过是右值拷贝,也就是无标记变量的拷贝。不管是返回指针还是返回值,return首先将要return的值存到eax寄存器中,回到父函数再将返回的值赋给变量......
  • 关于海明码的问题(语言-c++)
    提问:   我头都大了,想了半天也没想出这个括号里面是怎么算出来的,有明白的吗,请赐教下。解答: 以下是一个C++编程实现海明码的示例:#include<iostream>#include<strin......
  • 【c++】高斯-约旦法求逆矩阵
    给出n阶方阵A,求解其逆矩阵A-1的方法:1.构造n×2n的矩阵(A,I)2.用高斯-约旦消元法将其化简为(I,A-1),即可得到A的逆矩阵A-1第一版的代码:voidinverse(doubleA[N][N]......
  • CUDA C++编程
    核函数作用调用核函数的时候,代码会被N个CUDA线程执行N次。 修饰符__global__返回值函数名(){  ...执行代码} 调用函数名<<<BlockNumber,ThreadNumber>>>()......
  • Day04-运算符
    一、算术运算符以下假设变量:a=10 b=20运算符描述实例+加 - 两个对象相加a + b 输出结果 30-减 - 得到负数或是一个数减去另一个......
  • 史上最简单 OpenCV for C++ 在 Windows 和 Ubuntu 上编译安装使用教程
    准备工作原材料Ubuntu系统(非必须,Windows也可以,主要是Ubuntu适合编译)OpenCV3.4.1压缩包OpenCVcontrib3.4.1压缩包MinGW(Windows上运行GCC)版本信息......