重载<< >>

碰到fa + fb的两种解析规则,首先去类的成员函数中找一个函数operator+(constFraction& fb),找不到则去全局区找一个全局函数operator+(constFraction& fa, const Fraction& fb),这里的意思就是说,我们可以把重载函数写成成员函数的形式,也可以写成全局函数的形式,博主建议,能写成成员函数的就不要写成全局函数,而且最好只选取一种方案。

上面这句话来自于http://blog.****.net/uestclr/article/details/51126112,可以好好阅读,有助于理解运算符重载。



cin>>是由istream类支持的,cin是类 istream 的一个对象;

cout<<是由ostream类支持的,cout是类ostream的一个对象;

其实,<<  和 >>重载了按位移的运算符,并且只能对c++中的标准数据类型进行输入和输出。


如何重载<<  >>使它们能输入和输出用户自己定义的类型的数据呢?

对“<<”和“>>”重载的函数形式:

形式:

ostream& operator <<(ostream&, const 自定义类 &)

因为由cout<<可知,<<运算符的第一个运算量是cout,它是ostream类的一个对象,因此函数的第一个参数是ostream类型的引用;

第二个参数是要输出的自定义类的引用;

istream& operator>>(istream &, 自定义类&)//这里第二个参数前面没有const

重载<< >>


由上面可知,因为这两个操作符的第一个运算量不是我们正在定义的类,所以<<  >>的重载不能用成员函数。因此,

将这两个运算符的重载函数作为友元函数或普通函数。


重载流插入运算符<<:

重载<< >>


对于上面的重载函数来说,之所以返回值为ostream类型的引用,是为了能连续输出多个值,

其中,cout<<c2<<c2;等同于

operator<<(operator<<(cout,c1),c2)。


重载流提取运算符“>>”:

需要注意的是,这里面的第二个参数不是const,原因在于,这里面的第二个参数是放从键盘上输入的值的,

必定会改变的。

istream& operator>>(istream& input,Complex c)

input>>c.real>>c.imag;//可以这样为对象c进行初始化!!!

return input;//同样是为了能够连续的输入
}

但是上面的程序太简单了,输入的时候并不是严格的复数的形式,因此有下面的实现:


重载<< >>

重载<< >>

对于上面的函数来说,在istream重载函数中,c2只是一个局部变量,这个函数结束之后这个变量就会被释放,因此它的值并不会传递给main函数中的c1和c2中去,如果想用*this指针将它的值复制给当前对象就更错了,因为*this指针只能在成员函数中被引用。