操作符的重载有一些规则:
1. 重载操作符必须具有一个类类型或枚举类型操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义。
如: int operator+(int, int), 不可以
2. 为类设计重载操作符的时候,必须选择是将操作符设置为类成员还是普通非成员函数。在某些情况下,程序没有选择,操作符必须是成员;在另外一些情况下,有些经验可以指导我们做出决定。下面是一些指导:
a. 赋值(=),下标([]),调用(())和成员访问箭头(->)等操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误。
b. 像赋值一样,复合赋值操作符通常应定义为类的成员。与赋值不同的是,不一定非得这样做,如果定义为非成员复合赋值操作符,不会出现编译错误。
c. 改变对象状态或与给定类型紧密联系的其他一些操作符,如自增,自减和解引用,通常应定义为类成员。
d 对称的操作符,如算术操作符,相等操作符,关系操作符和位操作符,最好定义为普通非成员函数。
e io操作符必须定义为非成员函数,重载为类的友元。
#include <iostream>
#include <string>
using namespace std;
class Fruit
{
public:
friend ostream& operator << (ostream& os, const Fruit& f) ;
friend istream& operator >> (istream& is, Fruit& f) ;
protected:
private:string name;
string color;
};
ostream& operator << (ostream& os, const Fruit& f)
{
os << "The name is " << f.name << ". The colour is " << f.color << endl;
return os;
}
istream& operator >> (istream& is, Fruit& f)
{
cout<<"请分别输入水果的名字和颜色"<<endl;
is >> f.name >> f.color;
if (!is)
{
cerr << "Wrong input!" << endl;
}
return is;
}
int main()
{
Fruit apple;
cin>>apple;
cout<<apple;
return 0;
}
注意::
1. <<输入重载:因为后边需要对对象的变量值进行收入,相当于修改了值,所以不能定义成const类型
2. >>输出重载:只是输出对象的值,并没有修改对象值,所以将对象一般定义成const类型
如何写成ostream operator << (ostream& os, const Fruit& f) ,
Fruit apple, banana;
cout<<apple<<banana是不对的,
第一个()中返回cout的临时变量,它可以不可以作为作值。因而错误。
必须写成ostream& operator <<(ostream& os, const Fruit& f)
acout<<apple返回cout的引用,即就是它自己,它可以再次作为左值。因而能够连着写这个输出流