重载左移运算符,出现error: 'ostream' does not name a type
当需要对我们自己实现的类进行遍历操作时,想到达到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;//重载了左移运算符,可以对自己的类直接遍历
上面的操作是不是简单了许多呢!
注意:
- 对于左移和右移操作符,只能写在全局,不能写在成员方法中,否则会使调用的顺序变反。如下图:
- 如果需要使用的类中的成员变量是私有的,那么可以将重载的左移运算符设置为给类的友元函数。如下图:
- 声明为友元函数,可能会出现上图中的
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相关推荐
- 运算符重载——左移运算符重载
目录: 运算符重载--算术运算符重载 运算符重载--递增运算符重载 运算符重载--左移运算符重载 运算符重载--赋值运算符重载 应用场景: 可以输出自定义的数据类型信息 Person p(" ...
- C++重载之重载左移运算符
重载左移运算符(<<)用于输出自定义对象的成员变量,在实际开发中很有价值(调试和日志) 只能使用非成员函数版本 如果要输出对象的私有成员,可以配合友元一起使用. 试一下用cout直接输出超 ...
- C++ 重载左移运算符
在C++中进行左移运算符重载时,需要注意以下几点: C++ 内置数据类型的运算符是不能进行重载的,比如不能重载int类型的+运算符,但是可以重载 类 的+运算符 蓝框中的字体只讨论左移运算符,不讨论其 ...
- 4.2左移运算符重载
左移运算符重载: 直接输出p是不行的,我们需要重载<< 注意,一般不会通过成员函数来重载左移运算符,因为那个样子cout就在<<的左侧了. 所以我们使用全局函数重载<&l ...
- 左移运算符重载(C++)
左移运算符重载 视频链接 作用:可以输出自定义数据类型 我们正常情况下无法输出自定义数据类型.这个时候就需要重载<<运算符 注意,通常不会用成员函数重载<<运算符,因为无法实现 ...
- C++类与对象笔记十二:运算符重载二:左移运算符重载
左移运算符重载:可以打印输出自定义数据类型. 为了输出重载,我们先看看现有的输出函数.输出类型为std下的ostream类型的引用. 标准输出流(全局只能有一个). 返回值类型为ostream,函数名 ...
- 【C++】有关<左移运算符重载>的总结
大家好,我是翼同学! 目录 1️⃣前言 2️⃣左移运算符重载 4️⃣需注意的点 5️⃣写在最后 1️⃣前言 今天的笔记内容是: 左移运算符的重载 在类中,我们可以编写类的各种属性. 而左移运算符的重载 ...
- c++,运算符重载,左移运算符自增运算符。
假设有类A,它的私有成员是一个整型变量a_ A a; 我们想要把它的私有成员直接用 cout<<a<<endl 输出的话要用到左移运算符的重载. 我们把<<运算符重 ...
- 运算符重载——递增运算符重载
目录: 运算符重载--算术运算符重载 运算符重载--递增运算符重载 运算符重载--左移运算符重载 运算符重载--赋值运算符重载 应用场景: class MyInteger { public:MyInt ...
最新文章
- 如何取消或定制当点击GridView 的时候出现的那个黄色背景
- idea 创建 简单的scala maven项目
- 安全开发之碰撞检测与伤害计算逻辑
- YbtOJ#20072-[NOIP2020模拟赛B组Day6]相似子串【根号分治】
- 漫画:什么是分布式锁
- 凹入表形式打印树形结构_【树形立方体】立方体有哪些特性?
- 2019汇总之从4个关键词看单细胞与肝癌文献
- springmvc 传对象报400_springmvc 通过对象来接收参数,为什么默认会返回该对象?
- AcWing 868. 筛质数(欧拉筛模板)
- Notion for Mac(多功能办公笔记软件)V2.0.10官方版
- 不只是槓杆原理~~细说油压煞车
- python读音有道-[Python]通过有道词典API获取单词发音MP3
- 大数据揭秘| 《少年的你》大火之后,流量明星对电影意味着什么?
- unity 5.x android发布注意事项
- JavaScript 防抖(debounce)、截流(throttle)
- PhpStorm 2018 最新激活码 license server
- 微信小程序----返回上一页刷新或当前页刷新
- Keil4工程用Keil5继续开发,编译报错问题探究
- NLP自然语言处理之情感分析分析讲解、知识构建
- android 恢复出厂,安卓(Android)手机恢复出厂设置的方法