在学习对运算符的重载的时候,重载了++,--(前缀后缀),并且都是在定义为类中的成员函数。但是当我尝试去重载>>,<<为某一个类的成员函数的时候,就会报错,无论如何改参数的属性,位置,都不行,只有将<<,>>重载定义在全局,并且在这个类中将其声明为友元时,才能完成重载。

  根据我们实践出真知的道理,我们确实可以得出输入输出运算符重载必须要重载为全局的,可是为什么?在思考了很久,最终还是在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++中>>,<<的重载问题的更多相关文章

  1. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

  2. mapreduce中一个map多个输入路径

    package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...

  3. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  4. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  5. .NET Core中的认证管理解析

    .NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...

  6. Angular杂谈系列1-如何在Angular2中使用jQuery及其插件

    jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...

  7. 关于CryptoJS中md5加密以及aes加密的随笔

    最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...

  8. In-Memory:在内存中创建临时表和表变量

    在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...

  9. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  10. 【.net 深呼吸】序列化中的“引用保留”

    假设 K 类中有两个属性/字段的类型相同,并且它们引用的是同一个对象实例,在序列化的默认处理中,会为每个引用单独生成数据. 看看下面两个类. [DataContract] public class 帅 ...

随机推荐

  1. 1017 B. The Bits

    链接 [http://codeforces.com/contest/1017/problem/B] 题意 给你两个长度为n,包含0和1的字符串a和b,有一种操作swap a中的任意两个字符使得a&am ...

  2. 《Linux内核分析》第七周学习总结

    <Linux内核分析>第七周学习总结                         ——可执行程序的装载 姓名:王玮怡  学号:20135116 一.理论部分总结 (一)可执行程序的装载 ...

  3. guthub第一次作业连接及心得体会

    https://github.com/12wangmin/ GitHub的本意是旨在成为一种开放的软件协作平台,但它目前已成为一个巨大的综合性的平台,其作用远远超过单纯地开源代码.它现在在艺术家.建筑 ...

  4. C学习随笔

    1)要经常复习,一些基础的知识点,学过的.讲过的实例,应多看一下,学习并掌握编程的语法.思路.实验中可看出,不少同学对以前知识没有掌握,对讲过的实例没有理解2)要经常实践,纸上得来终觉浅,绝知此事要躬 ...

  5. 【转】STM32 独立看门狗简介

    STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效. 看门狗的原理:单片机系统在外界的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种 ...

  6. 加载spring容器

    import org.springframework.context.ApplicationContext; import org.springframework.context.support.Cl ...

  7. Consul vs. Zookeeper

    https://www.consul.io/intro/vs/zookeeper.html 阿里不用zookeeper而是用consul,京东也在用consul.

  8. Bootstrap Validator使用特性,动态(Dynamic)添加的input的验证问题

    http://1000hz.github.io/bootstrap-validator/#validator-usage Validated fields By default, the valida ...

  9. C语言删除指定文件

    C语言的文件操作想必大家都多多少少的有所了解,今天为大家献上删除文件的操作方法.这里我们要用到的是remove(const T& x);x使用代表文件路径及文件名的字符常量来确定需要删除的对象 ...

  10. Win2016以及win10 IIS10 下安装IEwebcontrol的方法

    1. 公司产品需要安装IE webcontrol控件 但是在win2016以及win10 上面安装时 因为IIS 已经升级到了IIS10 安装时会提示: 兼容解决的方法比较简单,修改注册表即可 HKE ...