C++之运算符重载(二元)

一、加号+

1.成员函数重载

2.友元函数重载

二、输出符号<<

三、索引符号 [ ]

四、补充说明

1.《二元运算符重载》课程评论:

(一)为什么<<运算符的重载必须定义为友元

如果在类中定义非友元成员函数,默认第一个参数默认会传入this*指针,这时就无法实现cout在前<<对象在后的格式

因为二元运算符中的调用格式是 参数一 运算符 参数二

这也就是为什么 加号运算符可以使用非友元成员函数,因为参数一是一个this*指针,参数二是其它对象

假设定义为非友元成员函数,那么第一个参数系统默认为this*(且无法更改),第二个参数是cout

那么调用格式就变成了 coor << cout了,这就是不能定义为非友元成员函数的原因

(二)
这里对于输出运算符重载讲得一般,当时课程上学习的时候,这里返回值为out是有原因的。

cout<<coor1<<coor2<<endl;

上面这个例子中,第一次重载<<的时候cout作为第一个参数,coor作为第二个参数,返回出来out的引用,这个out引用的是"cout<<coor1",

第二次重载的时候是将这个cout<<coor1整个作为out流对象,做成第一个参数。

2.《二元运算符重载》课程评论:

来吧!让我给您们解释一下为什么<<只能友元,而[]只能成员重载;

简而言之:

<1> 对于友元重载没有this指针指向当前对象的!这个可以从单目运算符重载时返回形参而不能返回this可知!

所以必须为参数一+运算符+参数二出现的表达式才能用友元!

<2> 二元运算符的成员函数重载,或一元运算符成员函数重载,默认在符号前有个this指针,指向当前对象的!

这也就为什么,二元重载还需有一参,一元重载不用参!

好了~~~这就很好解释,若<<采用成员函数重载,那么this指针指向的是cout!这是错误的~~~this无法实例;其次[]采用友元,那就没有第二参数了~~~

3.对于输出运算符“<<”来说,传入的第一个参数必须是ostream,不能是this指针,所以输出符号“<<”不能通过成员函数重载,必须使用friend友元函数进行重载。

4.索引运算符“[]”不能采用友元函数重载 原因??

友元函数重载的第一个参数可以是成员函数重载中的this指针也可以是其他的值,可是索引运算符的第一个参数必须是this指针,

因为只有第一个参数是this指针才能够传入索引,才能够使得这个索引所表达的是当前这个对象当中的成员

原文地址:https://www.cnblogs.com/Tang-tangt/p/9678276.html

时间: 2024-08-30 10:34:02

C++之运算符重载(二元)的相关文章

C++运算符重载——重载二元运算符

1.重载二元操作符的方法 二元运算符又称为双目运算符,即需要2个操作数的运算符,例如 + - * / 等. 运算符重载可以分为3种方式:类的非静态成员函数.类的友元函数.普通函数. 例如有 2 个操作数 a 和 b,二元运算符 ? (表示一个二元运算符),a ? b 的操作会被解释为下面2种形式之一 //a ? b a.operator?(b); //类的非静态成员函数 operator?(a, b); //友元函数 和 普通函数 第一种形式是运算符被重载为类的非静态成员函数, 这种方式要求运算

二元运算符重载

------------------siwuxie095 二元运算符重载 所谓 二元运算符,即 这个符号与两个操作数进行运算 (1)加号 + 的重载 加号 + 的重载方式有两种:一种是友元函数重载,一种是成员函数重载 1)先来看成员函数重载,如下: 定义一个坐标类:Coordinate 在类中声明成员函数 operator+(),它的参数是 const Coordinate &coor 在实现时: 首先需要定义一个临时对象 temp,传入对象 coor 的 m_iX 要和 当前对象的 m_iX

运算符重载

关键字:operator 相见:<高质量程序设计指南> P255 如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符. 如果运算符被重载为类的成员函数,那么一元运算符没有参数(但是++和--运算符的后置版本除外),二元运算符只有右侧参数,因为对象自己成了左侧参数. 运算符重载的特殊性 如果重载为成员函数,则this对象发起对它的调用 如果重载为全局函数,则第一个参数发起对它的调用 禁止用户发明该语言运算符集合中不存在的运算符 除了函数调用运算符

关于c++的运算符重载那些事

搞c++有一段时间了,今天突然要重载一个运算符,发现自己有点忘了,遂查查资料做一下c++运算符重载的小总结. 一.何为运算符重载 运算符的重载是c++语言特有的,java什么的是没有运算符重载的,所以运算符重载在笔试面试中有可能成为c++的高频考点.运算符重载就是重新定义运算符的意义,如常用的+,-,×,÷都是可以重载的.运算符重载使用的是关键字operator,表现形式是:                                                            

运算符重载(三)

我们知道运算符重载函数可以选择两种形式(1)成员函数形式   (2) 全局友元函数形式.那么我们应该怎么样选择呢? 首先按照语法规定有的运算符只能由成员函数重载的运算符,例如operator[],operator=.而有些运算符既可以用成员函数重载,也可以冲全局友元函数重载,例如:++ ,——,+,—,+=,—=等,像这种既可以用成员函数重载也可以用全局友元函数重载的运算符,我们建议用成员函数重载,因为这样做强调了运算符和类的联合,尤其是二元运算符重载时,当左侧操作数是当前的对象时,运算符会工作

《Inside C#》笔记(十一) 运算符重载

运算符重载与之前的索引器类似,目的是为了让语言本身使用起来更方便直接,也是一种语法糖. 一 运算符重载(Operator Overloading) 运算符重载的存在,使得现有的各种运算符可以被重新定义并用来操作用户自定义的数据类型.运算符重载只是语法糖,因为它的本质实际上还是对方法的调用,并没有为语言本身增加新特性. a) 运算符重载的写法 public static <返回值>operator<运算符> (<参数1>,<参数2>-) 还有一些规则: 必须用

运算符重载(二)

在<运算符重载(一)>我们介绍了运算符重载的基本概念,以及基本形式.那么再运算符重载中,参数的传递有什么遵循的原则?返回值的类型又遵循什么原则呢?这些问题都 在这一篇文章中回答. (1)运算符重载函数中的参数个数应该有几个 运算符重载函数的参数个数取决于两个因素.一是运算符是一元运算符还是二元运算符,二是采用友元函数重载还是采用成员函数重载 如果是一元运算符,采用友元函数重载就要有一个参数,采用成员函数重载,就不需要参数(因为成员函数隐式的传递了this指针) 1 class Integer{

《C++编程思想》 第十一章 运算符重载 (习题+解答)

一.相关代码 1. /*运算符重载语法*/ /*OPOVER.cpp*/ /*这两个重载的运算符被定义为内联成员函数.对于二元运算符,单个参数是出现在运算符 右侧的那个.当一元运算符被定义为成员函数时,没有参数.成员函数被运算符左侧的对象调 用. 对于非条件运算符(条件运算符通常返回一个布尔值),如果两个参数是相同的类型,希 望返回和运算相同类型的对象或引用.如果它们不是相同类型,它作什么样的解释就取决于程 序设计者.用这种方法可以组合复杂的表达式: K += I + J ; 运算符+号产生一个

C++ Primer笔记13_运算符重载_总结

总结: 1.不能重载的运算符: . 和 .* 和 ?: 和 ::  和 sizeof 和 typeid 2.重载运算符有两种基本选择: 类的成员函数或者友元函数, 建议规则如下: 运算符 建议使用 所有一元运算符 成员函数 = () [] -> 必须是成员函数 += -= /= *= ^= &= != %= >>= <<= , 似乎带等号的都在这里了. 成员函数 所有其它二元运算符, 例如: –,+,*,/ 友元函数 3.前几篇中的实例,现在汇总Person类的程序: