发布时间 : 星期一 文章《C++面向对象程序设计》教案更新完毕开始阅读671869ea998fcc22bcd10d3f
#include \#include
Fraction::Fraction(int n, int d) { num = n; den = d;
if(den==0) den = 1; reduce(); }
Fraction &Fraction::operator+=(Fraction &f) {
num = num * f.den + den * f.num; den = den * f.den; reduce(); return *this; }
Fraction &Fraction::operator-=(Fraction &f) {
num = num * f.den - den * f.num; den = den * f.den; reduce(); return *this; }
Fraction &Fraction::operator*=(Fraction &f) { num = num * f.num; den = den * f.den; reduce(); return *this; }
Fraction &Fraction::operator/=(Fraction &f) { num = num * f.den; den = den * f.num; reduce(); return *this; }
Fraction &Fraction::operator++() { num += den; return *this; }
Fraction Fraction::operator++(int) { Fraction temp = *this; num += den; return temp; }
Fraction::operator double()
{ return static_cast
Fraction operator+(Fraction &x, Fraction &y) {
return Fraction(x.num * y.den + x.den * y.num, x.den * y.den); }
Fraction operator-(Fraction &x, Fraction &y) {
return Fraction(x.num * y.den - x.den * y.num, x.den * y.den); }
Fraction operator*(Fraction &x, Fraction &y) { return Fraction(x.num * y.num, x.den * y.den); }
Fraction operator/(Fraction &x, Fraction &y) { return Fraction(x.num * y.den, x.den * y.num); }
bool operator==(Fraction &x, Fraction &y) { return( x.num * y.den == x.den * y.num); }
bool operator!=(Fraction &x, Fraction &y) { return !(x == y); }
bool operator<(Fraction &x, Fraction &y) { return( x.num * y.den < x.den * y.num); }
bool operator<=(Fraction &x, Fraction &y) { return !(y > x); }
bool operator>(Fraction &x, Fraction &y) { return (y < x); }
bool operator>=(Fraction &x, Fraction &y) { return !(x < y); }
ostream &operator<<(ostream &os, Fraction &f) {
return os << f.num << '/' << f.den; }
istream &operator>>(istream &is, Fraction &f) {
char ch;
is >> f.num >> ch >> f.den; return is; }
int gcd(int m, int n) { int k;
while( n != 0 )
{ k = m % n; m = n; n = k; } return m; }
void Fraction::reduce() {
if(den < 0) { num = -num; den = -den; } if(den == 1) return; int sgn = num<0 ? -1 : 1; int g = gcd(sgn*num, den); num /= g; den /= g; }
例:在人类Person中增加重载赋值运算符 在Person.h中增加一个说明: Person & operator=(Person &); 在Person.cpp中增加对该函数的定义 Person & Person::operator=(Person &p) { if(this==&p) return *this; delete [] name;
name = new char[strlen(p.name)+1]; strcpy(name,p.name); age = p.age; sex = p.sex; return *this; }
5.4 类型转换
1、通过构造函数将别的类型转换为这个类的类型 如复数Complex类的构造函数 Complex(double r) { re=r; }
2、通过转换函数讲这个类的类型转换为别的类型 如在复数Complex类中的转换函数 operator double() { return re; } 在分数Fraction类中的转换函数
operator double() { return static_cast
用explicit关键字,可以禁止单个参数的构造函数用于自动类型转换,如 class Stack
{ explicit Stack(int size);
? ? }
Explicit也同样禁止用赋值来进行带有类型转换的初始化行为 如,不可以 Stack s=10;