重载左移运算符,出现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;//重载了左移运算符,可以对自己的类直接遍历

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

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

********************************************************************
【补充】
前面重载的左移运算符,是可读可写的,按照我们的意愿,希望是只读的。那么这时候想得到使用const,如
在这里插入图片描述
图中报错,原因分析:
1)在使用array的getLen()方法时,实际是转换成后面的方式,传入的是对象的地址;
在这里插入图片描述

但是getLen()接收的是一个const指针在这里插入图片描述
现在对比一下:

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

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


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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值