当需要对我们自己实现的类进行遍历操作时,想到达到cout<<的效果,就需要重载左移运算符。

比如:

 MyArray array3(20);array3=array1;//重载了 =(赋值操作符),使用array1对array3进行赋值cout<<"array3"<<endl;for(int i=0;i<array3.getLen();i++){//getLen()是获取数组长度cout<<array3[i]<<" ";//重载了 [] 操作符}cout<<endl;

上面的MyArray是我们自己定义的数组类,包括len(数组长度)和space(数组空间)。

可以看到上面我们想读取数组的内从容,就需要使用for循环进行遍历。如果有多个该类的对象需要进行遍历,那么每次都写一个for循环就比较麻烦。

所以,我们可以重载左移运算符,直接传入数组名,就可以遍历整个数组,类似于cout<<方式。

实现如下:

ostream &operator<<(ostream &os,MyArray &array){for(int i=0;i<array.getLen();i++){os<<array[i]<<" ";}return os;
}

使用重载后的左移运算符进行遍历数组:

 MyArray array3(20);array3=array1;cout<<"array3"<<endl;cout<<array3<<endl;//重载了左移运算符,可以对自己的类直接遍历

上面的操作是不是简单了许多呢!

注意:
  1. 对于左移和右移操作符,只能写在全局,不能写在成员方法中,否则会使调用的顺序变反。如下图:
  2. 如果需要使用的类中的成员变量是私有的,那么可以将重载的左移运算符设置为给类的友元函数。如下图:
  3. 声明为友元函数,可能会出现上图中的ostream报错,这是因为它找不到ostream,添加上#include <iostream>命名空间 std就可以了,具体如上图。错误如下图:

********************************************************************
【补充】:
前面重载的左移运算符,是可读可写的,按照我们的意愿,希望是只读的。那么这时候想得到使用const,如

图中报错,原因分析:
1)在使用array的getLen()方法时,实际是转换成后面的方式,传入的是对象的地址;

但是getLen()接收的是一个const指针
现在对比一下:

函数传入的形参参数类型:const MyArray &array;
getLen函数接收的形参参数类型:MyArray * const this;

【注意】:这两种情况是有区别的,第一种是该变量不能修改的;第二种是指向一块内存的指针不能修改,但是,这个指针指向的内存空间中的数据是可以修改的。
如果把第一种参数传递给第二个,那么相当于将一个安全性高的变量传递给安全性低的变量。


解决方法:
既然是因为安全性低,不能接收高安全性的变量,那就将getLen函数接收参数的安全性提高,即在函数后面添加const,如下图:

重载左移运算符,出现error: 'ostream' does not name a type相关推荐

  1. 运算符重载——左移运算符重载

    目录: 运算符重载--算术运算符重载 运算符重载--递增运算符重载 运算符重载--左移运算符重载 运算符重载--赋值运算符重载 应用场景: 可以输出自定义的数据类型信息 Person p(" ...

  2. C++重载之重载左移运算符

    重载左移运算符(<<)用于输出自定义对象的成员变量,在实际开发中很有价值(调试和日志) 只能使用非成员函数版本 如果要输出对象的私有成员,可以配合友元一起使用. 试一下用cout直接输出超 ...

  3. C++ 重载左移运算符

    在C++中进行左移运算符重载时,需要注意以下几点: C++ 内置数据类型的运算符是不能进行重载的,比如不能重载int类型的+运算符,但是可以重载 类 的+运算符 蓝框中的字体只讨论左移运算符,不讨论其 ...

  4. 4.2左移运算符重载

    左移运算符重载: 直接输出p是不行的,我们需要重载<< 注意,一般不会通过成员函数来重载左移运算符,因为那个样子cout就在<<的左侧了. 所以我们使用全局函数重载<&l ...

  5. 左移运算符重载(C++)

    左移运算符重载 视频链接 作用:可以输出自定义数据类型 我们正常情况下无法输出自定义数据类型.这个时候就需要重载<<运算符 注意,通常不会用成员函数重载<<运算符,因为无法实现 ...

  6. C++类与对象笔记十二:运算符重载二:左移运算符重载

    左移运算符重载:可以打印输出自定义数据类型. 为了输出重载,我们先看看现有的输出函数.输出类型为std下的ostream类型的引用. 标准输出流(全局只能有一个). 返回值类型为ostream,函数名 ...

  7. 【C++】有关<左移运算符重载>的总结

    大家好,我是翼同学! 目录 1️⃣前言 2️⃣左移运算符重载 4️⃣需注意的点 5️⃣写在最后 1️⃣前言 今天的笔记内容是: 左移运算符的重载 在类中,我们可以编写类的各种属性. 而左移运算符的重载 ...

  8. c++,运算符重载,左移运算符自增运算符。

    假设有类A,它的私有成员是一个整型变量a_ A a; 我们想要把它的私有成员直接用 cout<<a<<endl 输出的话要用到左移运算符的重载. 我们把<<运算符重 ...

  9. 运算符重载——递增运算符重载

    目录: 运算符重载--算术运算符重载 运算符重载--递增运算符重载 运算符重载--左移运算符重载 运算符重载--赋值运算符重载 应用场景: class MyInteger { public:MyInt ...

最新文章

  1. 如何取消或定制当点击GridView 的时候出现的那个黄色背景
  2. idea 创建 简单的scala maven项目
  3. 安全开发之碰撞检测与伤害计算逻辑
  4. YbtOJ#20072-[NOIP2020模拟赛B组Day6]相似子串【根号分治】
  5. 漫画:什么是分布式锁
  6. 凹入表形式打印树形结构_【树形立方体】立方体有哪些特性?
  7. 2019汇总之从4个关键词看单细胞与肝癌文献
  8. springmvc 传对象报400_springmvc 通过对象来接收参数,为什么默认会返回该对象?
  9. AcWing 868. 筛质数(欧拉筛模板)
  10. Notion for Mac(多功能办公笔记软件)V2.0.10官方版
  11. 不只是槓杆原理~~细说油压煞车
  12. python读音有道-[Python]通过有道词典API获取单词发音MP3
  13. 大数据揭秘| 《少年的你》大火之后,流量明星对电影意味着什么?
  14. unity 5.x android发布注意事项
  15. JavaScript 防抖(debounce)、截流(throttle)
  16. PhpStorm 2018 最新激活码 license server
  17. 微信小程序----返回上一页刷新或当前页刷新
  18. Keil4工程用Keil5继续开发,编译报错问题探究
  19. NLP自然语言处理之情感分析分析讲解、知识构建
  20. android 恢复出厂,安卓(Android)手机恢复出厂设置的方法

热门文章

  1. python实现超级全局变量(跨文件跨模块)
  2. 洛谷P2895Meteor Shower S
  3. VLAD算法浅析, BOF、FV比较
  4. 中国超级计算机全国产化,我国万万亿次超级计算机CPU有望全部国产化
  5. P1024 一元三次方程求解 两种方法
  6. iOS开发教程之:iPhone开发环境搭建
  7. 视频文件格式解析之 3GP与MP4
  8. 回文日期(YZOJ-1096)
  9. 一文读懂工业以太网设备的发展史
  10. 三星note3 android4.3,三星Note 3配置:稳定流畅 Android 4.3