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指针才能够传入索引,才能够使得这个索引所表达的是当前这个对象当中的成员
C++之运算符重载(二元)的更多相关文章
- C++运算符重载——重载二元运算符
1.重载二元操作符的方法 二元运算符又称为双目运算符,即需要2个操作数的运算符,例如 + - * / 等. 运算符重载可以分为3种方式:类的非静态成员函数.类的友元函数.普通函数. 例如有 2 个操作 ...
- C++ 运算符重载一(二元运算符重载)
//二元运算符重载 #include<iostream> using namespace std; class Point { public: Point(int x,int y){ th ...
- C#高级编程笔记2016年10月12日 运算符重载
1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...
- C++学习26 运算符重载的概念和语法
所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Overloading)也是一个道 ...
- C++ Primer笔记10_运算符重载_赋值运算符_进入/输出操作符
1.颂值运营商 首先来福值运算符引入后面要说的运算符重载.上一节说了构造函数.拷贝构造函数:一个类要想进行更好的控制.须要定义自己的构造函数.拷贝构造函数.析构函数.当然,还有赋值运算符.常说的三大函 ...
- C++_运算符重载
什么是运算符的重载? 运算符与类结合,产生新的含义. 为什么要引入运算符重载? 作用:为了实现类的多态性(多态是指一个函数名有多种含义) 怎么实现运算符的重载? 方式:类的成员函数 或 友元函数(类外 ...
- C#基础加强(6)之引用相等与运算符重载
引用相等 介绍 在 C# 中可以通过 object.ReferenceEquals(obj1, obj2) 方法来判断两个变量引用的是不是同一个地址,如果是,那么就是引用相等. 引用相等是针对引用类型 ...
- 《Inside C#》笔记(十一) 运算符重载
运算符重载与之前的索引器类似,目的是为了让语言本身使用起来更方便直接,也是一种语法糖. 一 运算符重载(Operator Overloading) 运算符重载的存在,使得现有的各种运算符可以被重新定义 ...
- C#编程(四十)----------运算符重载
运算符重载 所谓的运算符重载是指允许用户使用用户定义的类型编写表达式的能力. 例如,通常需要编写类似与以下内容的代码,入江两个数字相加,很明显,sum是两个数字之和. int i=5,j=4; int ...
随机推荐
- linux IPC socket
套接字是通讯端点的抽象 创建一个套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain ...
- Alibaba Cloud Toolkit,你确定不来尝鲜一下?
阿里云出了新的工具,Alibaba Cloud Toolkit,看看“toolkit”这个名字就知道它是一个工具集. 没错!它就是一个工具集,一个集打包部署发布以及探索分析程序的工具集.而我,目前还停 ...
- CentOS7用rpmforge源!
确认系统是否安装了priority这个yum的插件,这个插件用来保证安装软件时候软件仓库先后次序,一般是默认先从官方base或者镜像安装,然后从社区用户contribute的软件中安装,再从第三方软件 ...
- C语言新手写扫雷攻略1
工欲善其事,必先利其器,首先要准备好开发环境,既然是C语言,那就不是WinAPI的扫雷,就是纯的C语言开发,但是以前的C都是TC开发的,现在用肯定是过时很久了,但是也是有解决办法的,某些大神开发出Ea ...
- sklearn中standardscaler中fit_transform()和transform()有什么区别,应该怎么使用?
在根据机器学习书中提供的实例中,看到需要对训练和测试的特征数据进行标准化. 但是使用的是有两个函数, 对于训练数据,使用的是fit_transform()函数 对于测试数据,使用的是tansform( ...
- 资源-.Net-ASP.NET:ASP.NET资源列表
ylbtech-资源-.Net-ASP.NET:ASP.NET资源列表 ASP.NETFree. Cross-platform. Open source.A framework for buildin ...
- docker IPv4 forwarding is disabled. 解决方法
问题 最近在 docker 部署 django 项目打包镜像时遇到 [root@localhost ~]# docker build -t test1 . ...省略... WARNING: IPv4 ...
- 校验文件是否是同一个文件,以及mac中使用MD5命令
背景 sz了war包,因为查看不到里面的内容,并不确定是否是同一个文件. 解决 通过MD5校验 md5sum xxxx 但是在mac中是没有这个命令的下载半天没下载下来,下面是快捷操作. 1.打开终端 ...
- 2. Pycharm的介绍与使用
使用Python原生IDLE IDLE是Python软件包自带的一个集成开发环境,点击开始-->Python安装包-->IDLE.启动 IDLE 时,会显示>>>,可以在 ...
- 【Linux】- CentOS安装docker及docker-compose
1.安装docker,命令如下: -- 把yum包更新到最新 yum update -- 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicema ...