《C++面向对象程序设计》教案 联系客服

发布时间 : 星期一 文章《C++面向对象程序设计》教案更新完毕开始阅读671869ea998fcc22bcd10d3f

第5章 多态性

5.1 编译时的多态性与运行时的多态性

5.2 函数重载

5.3 运算符重载

例:复数类Complex //mycomplex.h #include using namespace std; class Complex { private:

double re, im; public:

Complex(double r=0, double i=0) { re=r; im=i; } double real() { return re; } double imag() { return im; }

Complex operator+() { return *this; }

Complex operator-() { return Complex(-re, -im); } Complex &operator+=( Complex & ); Complex &operator-=( Complex & ); Complex &operator*=( Complex & ); Complex &operator/=( Complex & );

friend Complex operator+( Complex &, Complex & ); friend Complex operator-( Complex &, Complex & ); friend Complex operator*( Complex &, Complex & ); friend Complex operator/( Complex &, Complex & ); friend bool operator==( Complex &, Complex & ); friend bool operator!=( Complex &, Complex & ); friend ostream &operator<<( ostream &, Complex & ); friend istream &operator>>( istream &, Complex & ); operator double() { return re; } };

//mycomplex.cpp

#include\#include using namespace std;

Complex &Complex::operator+=( Complex &c ) { re += c.re; im += c.im; return *this; }

Complex &Complex::operator-=( Complex &c ) { re -= c.re; im -= c.im; return *this; }

Complex &Complex::operator*=( Complex &c ) { double t = re * c.re - im * c.im; im = re * c.im + im * c.re; re = t; return *this; }

Complex &Complex::operator/=( Complex &c ) { double m = c.re * c.re + c.im * c.im; double t = (re * c.re + im * c.im) / m; im = (im * c.re - re * c.im) / m; re = t; return *this; }

Complex operator+( Complex &a, Complex &b ) { return Complex( a.re + b.re, a.im + b.im ); }

Complex operator-( Complex &a, Complex &b ) { return Complex( a.re - b.re, a.im - b.im ); }

Complex operator*( Complex &a, Complex &b )

{ return Complex( a.re * b.re - a.im * b.im, a.re * b.im + a.im * b.re ); }

Complex operator/( Complex &a, Complex &b ) { double m = b.re * b.re + b.im * b.im;

return Complex( (a.re * b.re + a.im * b.im) / m,

(a.im * b.re - a.re * b.im) / m );

}

bool operator==( Complex &a, Complex &b ) { return a.re == b.re && a.im == b.im; }

bool operator!=( Complex &a, Complex &b ) { return a.re != b.re || a.im != b.im; }

ostream &operator<<( ostream &os, Complex &c ) { os << c.re << '+' << c.im << 'i'; return os; }

istream &operator>>( istream &is, Complex &c ) { is >> c.re >> c.im ; return is; }

例:分数类 Fraction

#include using namespace std;

class Fraction {

private: int num, den; void reduce(); public:

Fraction(int n=0, int d=1);

Fraction operator+() { return *this; }

Fraction operator-() { return Fraction(-num, den); } Fraction &operator+=(Fraction &); Fraction &operator-=(Fraction &); Fraction &operator*=(Fraction &); Fraction &operator/=(Fraction &); Fraction &operator++(); Fraction operator++(int); operator double();

friend Fraction operator+(Fraction &, Fraction &); friend Fraction operator-(Fraction &, Fraction &); friend Fraction operator*(Fraction &, Fraction &); friend Fraction operator/(Fraction &, Fraction &); friend bool operator==(Fraction &, Fraction &); friend bool operator!=(Fraction &, Fraction &); friend bool operator<(Fraction &, Fraction &); friend bool operator<=(Fraction &, Fraction &); friend bool operator>(Fraction &, Fraction &); friend bool operator>=(Fraction &, Fraction &); friend ostream &operator<<(ostream &, Fraction &); friend istream &operator>>(istream &, Fraction &); };