重载>> 和 <<
#include <iosfwd> // 或 #include <iostream> using std::istream; using std::ostream; friend istream& operator>> (istream& , Myclass& ); friend ostream& operator<< (ostream& , const Myclass& );
运算符重载举例
//fraction.h #ifndef FRACTION_H #define FRACTION_H #include <iostream> class Fraction { friend std::ostream& operator<< (std::ostream& out, const Fraction& f); public: Fraction(long n=0, long d=1); virtual ~Fraction(); Fraction operator- () const//重载负号(一元运算符重载) { return Fraction(-num, den); } Fraction operator+ (const Fraction& f) const //重载加号(二元运算符重载) { return Fraction(num*f.den + den*f.num, den*f.den); } Fraction operator++ () //重载 前缀“++” { num += den; return *this; } Fraction operator++ (int)//重载 后缀++,int是一个虚拟参数 { Fraction f(*this); num+= den; return f; } //重载类型转换符 //1.必须重载为成员函数 //2.不需要返回类型,因为运算符本身就是返回的类型 operator long() const { return num/den; } //重载赋值运算符“=”,只能重载为成员函数。 //若不写,系统提供默认赋值(按位赋值) //注意:返回类的引用 //一般顺序:1.判断是否是同一对象 // 2.若被赋值的对象占用了动态空间,应先释放。再申请空间赋值 // 3.返回 return *this; /* String& operator= (const String& s) { if(&s == this) return *this; if(pChar) delete[] pChar; if(s.pChar == NULL) p = NULL; else { pChar = new char[strlen(s.pChar)+1]; strcpy(pChar, s.pChar); } return *this; } */ Fraction& operator= (const Fraction& f)//只能重载为成员函数。 { if(&f == this) return *this; num = f.num; den = f.den; return *this; } Fraction& operator+= (const Fraction& f) { *this = *this + f; return *this; } bool operator> (const Fraction& f)const { return num*f.den > den*f.num; } protected: void standardize();//标准化 /* 标准分数:1. 分母永远为正,分数的符号由分子表示 2. 分子分母互为质数,即最简分数 */ private: long num;//分子 long den;//分母 }; #endif // FRACTION_H
//fraction.cpp #include "fraction.h" #include <cmath> std::ostream& operator<< (std::ostream& out, const Fraction& f) { if(f.num == 0) out << "0"; else if(1 == f.den) out << f.num; else out << f.num << "/" << f.den; return out; } static long gcd(long m, long n) {//求最大公约数 int r = 0; while(n) { r = m % n; m = n; n = r; } return fabs(m); } void Fraction::standardize() { if(0L == num || 0L == den) { num = 0L; den = 1L; return; } if(den < 0L) {//分数的符号让分子表示 num = -num; den = -den; } long g = gcd(num,den); num /= g; den /= g; } Fraction::Fraction(long n, long d):num(n),den(d) { standardize(); } Fraction::~Fraction() { //dtor }