当需要对我们自己实现的类进行遍历操作时,想到达到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
,如下图: