重载<< >>
碰到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指针只能在成员函数中被引用。