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

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

#include \#include using namespace std;

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(num) / 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.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(num) / den;}

用explicit关键字,可以禁止单个参数的构造函数用于自动类型转换,如 class Stack

{ explicit Stack(int size);

? ? }

Explicit也同样禁止用赋值来进行带有类型转换的初始化行为 如,不可以 Stack s=10;