C++中>>,<<的重载问题
在学习对运算符的重载的时候,重载了++,--(前缀后缀),并且都是在定义为类中的成员函数。但是当我尝试去重载>>,<<为某一个类的成员函数的时候,就会报错,无论如何改参数的属性,位置,都不行,只有将<<,>>重载定义在全局,并且在这个类中将其声明为友元时,才能完成重载。
根据我们实践出真知的道理,我们确实可以得出输入输出运算符重载必须要重载为全局的,可是为什么?在思考了很久,最终还是在C++prime第五版的494面的找到了答案。
我总结一下,原因在于:
第一,假如我们在将其重载为类成员函数,那么这个运算符的左侧运算对象将是这个类的一个对象。比如说,Point是一个类,p1是其实例,那么使用<<时,需要写成p1 << cout,这样就和我们原来运用的cout << "hello world" << endl;不一致,有点反人类。
第二,也是最根本的原因,假如我们将其重载为类成员函数,那么因为这两个运算符需要用到类似std::cout,std:cin的流,而这些属于istream和ostream标准库中的成员,那么我们必须将我们重载的两个运算符添加进这两个标准库中才能完成调用,但是为标准库添加成员我们是做不到的,因此<<,>>不能声明为成员函数。
最后附上重载<<,>>,--(前缀后缀)的小案例:
#include <iostream>
using namespace std; struct Point
{
int x;
int y; public:
Point(int _x=,int _y=)
{
x = _x;
y = _y;
} Point(Point &that)
{
x = that.x;
y = that.y;
} Point& operator --(void) //前--
{
--x;
--y;
return *this;
} Point operator --(int) //后--
{
Point t(*this);
--x;
--y;
return t;
} Point operator *(Point &that)
{
Point t;
t.x = x*that.x;
t.y = y*that.y;
return t;
} friend istream & operator >> (istream &is,Point &p1);
friend ostream &operator <<(ostream &os,Point &p1) }; ostream &operator <<(ostream &os,Point &p1)
{
return os << p1.x << p1.y;
} istream &operator >> (istream &is,Point &p1)
{
return is >> p1.x >> p1.y;
} int main()
{
Point p1(,);
(--p1).show();
Point p2(,);
(p2--).show(); Point p3;
cin >> p3;
p3.show();
cout << p3 << endl; }
C++中>>,<<的重载问题的更多相关文章
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- mapreduce中一个map多个输入路径
package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...
- Hadoop 中利用 mapreduce 读写 mysql 数据
Hadoop 中利用 mapreduce 读写 mysql 数据 有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- .NET Core中的认证管理解析
.NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...
- Angular杂谈系列1-如何在Angular2中使用jQuery及其插件
jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...
- 关于CryptoJS中md5加密以及aes加密的随笔
最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...
- In-Memory:在内存中创建临时表和表变量
在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- 【.net 深呼吸】序列化中的“引用保留”
假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...
随机推荐
- SQLServer 中发布与订阅
在对数据库做迁移的时候,会有很多方法,用存储过程,job,也可以用开源工具kettle,那么今天这些天变接触到了一种新的方法,就是SqlServer中自带的发布与订阅. 首先说明一下数据复制的流程.如 ...
- WinForm多线程+委托防止界面假死
当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Generic ...
- Coolest Ski Route-不定起点和终点----在有向变的情况下---求最长路
这题最开始给你了N个点,M条边,边是单向边,问不指定起点和终点,最长路是什么??? 脑补一下,不定起点和终点的最短路,用弗洛伊德算法搞一搞,但是...那个垃圾算法的复杂度是N^3的,但是这个算法的M高 ...
- 12.9 Daily Scrum
在一些实现上,开发人员提出了意见,经过讨论后,我们决定取消“推荐餐厅”的功能,增加了“菜谱分类”的功能. 同时更新了相关人员的任务. Today's Task Tomorrow's Task 丁辛 ...
- 《Linux内核分析》课程第八周学习总结
姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- 小学四则运算APP 第三阶段冲刺-第一天
团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第三次冲刺阶段时间:12.12~12.19 本次发布的是音乐播放功能,可以根据用户需求一边播放音乐一边做题,也拥有暂停播放音乐的功能,增强 ...
- Hadoop技术里面有BSP模型、MPI模型
MPI模型,各种编程语言的库挺多. BSP模型,刚才知道.
- js核心对象
- [转帖]2016年时的新闻:ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0
ASP.NET Core 1.0.ASP.NET MVC Core 1.0和Entity Framework Core 1.0 http://www.cnblogs.com/webapi/p/5673 ...
- Java多线程之原子性 volatile、atomicInteger测试
原文链接:http://www.cnblogs.com/zhengbin/p/5653051.html 一.补充概念 1.什么是线程安全性? <Java Concurrency in Pract ...