操作符重载本质上函数重载,只不过函数的名称有点怪,是个运算符。不过这给编程带来了方便,适当重载,可以使得程序变得简洁。
对于操作符重载,我一直停留在浅尝辄止的程度,对于操作符的细节了解不多。所以今天花时间仔细的研究了一下。
在众多的操作符中,输入和输出流的操作符虽然平时一直在用,但是最不了解,因此我重点学习了>>和<<的用法。
首先需要弄清楚cin和cout是什么。cin和cout不是类,而是类的实例对象。cin是istream类的对象,cout是ostream类的对象(以前一直忽视这个问题,cin和cout是什么一直都模模糊糊的)。这样很容易就知道,cin具有istream的所有方法和变量,cout同理。
然后以cin为例来看>>的使用方法:
string name; cin>>name;
从上面的例子可以看出>>是一个双目操作符,两个操作数分别是cin和name,所以在重载>>的时候参数列表中应该含有两个操作数,一个是istream类型的对象,另一个是自定义的对象。
那么>>操作符的返回值是什么?
事实上,>>操作符可以没有返回值,它的作用是从cin对象中提取数据到变量中,程序可以从输入流中获取数据。需要注意一点,如果只输入一个对象可以没有返回值,如果需要链式输入,那么就要返回输入流的引用,以便和下一个变量运算。
了解输入流的细节之后,重载才会方向明确。
下面是一个重载的demo
class MyString{ public: char arr[100]; int len; MyString(){ len=0; memset(arr,0,sizeof(arr)); } MyString(char in[]){ strcpy(arr,in); len=strlen(arr); } ///操作符本质就是一个函数 ///todo 重载<< friend void operator<<(ostream& output,const MyString &myString) { output<<myString.arr; // return output; } ///todo 重载>> friend void operator>>(istream &input,MyString &myString) { input>>myString.arr; myString.len=strlen(myString.arr); // return input; } ///todo 重载+ MyString operator+(const MyString &myString) { MyString rt; strcpy(rt.arr,this->arr); strcat(rt.arr,myString.arr); rt.len=strlen(rt.arr); return rt; } ///todo 重载+= MyString operator+=(const MyString &myString) { MyString t=*this+myString; *this=t; return *this; } ///todo 重载* MyString operator*(const int n) { MyString t; for(int i=0;i<n ;i++ ){ strcat(t.arr,this->arr); } return t; } }; int main() { MyString name1,name2,name3; cin>>name1; name1=name1*10; cout<<name1; return 0; }
参考文献
https://blog.csdn.net/zhangyifei216/article/details/50545572