C++ 运算符重载入门:分数类实现示例
运算符重载是 C++ 的重要特性,它允许自定义类型像内置类型一样使用运算符。通过重载,可以让代码更直观易读,例如直接使用 + 号进行分数相加。
1. 理解运算符重载的基本概念
运算符重载本质上是为运算符赋予新的功能,使其能作用于自定义的类对象。例如,我们可以让两个分数对象直接用 + 号相加,而不需要调用类似 add() 这样的成员函数。
2. 创建基础分数类框架
首先定义一个 Fraction 类,包含分子 (numerator) 和分母 (denominator) 两个私有成员变量。构造函数负责初始化这两个值,同时加入一个约分函数来简化分数。
3. 实现约分功能
约分需要找到分子分母的最大公约数 (GCD),然后用它来约简分数。这里采用辗转相除法来计算 GCD,确保分数总是以最简形式存储。
#include <iostream>
#include <numeric>
class Fraction {
private:
int numerator;
int denominator;
// 计算最大公约数
static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
// 约分函数
void simplify() {
if (denominator == 0) throw std::invalid_argument("Denominator cannot be zero");
int common = gcd(std::abs(numerator), std::abs(denominator));
numerator /= common;
denominator /= common;
if (denominator < ) {
numerator = -numerator;
denominator = -denominator;
}
}
:
( n = , d = ) : (n), (d) {
();
}
Fraction +( Fraction& lhs, Fraction& rhs) {
newNum = lhs.numerator * rhs.denominator + rhs.numerator * lhs.denominator;
newDen = lhs.denominator * rhs.denominator;
(newNum, newDen);
}
Fraction -( Fraction& lhs, Fraction& rhs) {
newNum = lhs.numerator * rhs.denominator - rhs.numerator * lhs.denominator;
newDen = lhs.denominator * rhs.denominator;
(newNum, newDen);
}
Fraction *( Fraction& lhs, Fraction& rhs) {
newNum = lhs.numerator * rhs.numerator;
newDen = lhs.denominator * rhs.denominator;
(newNum, newDen);
}
Fraction /( Fraction& lhs, Fraction& rhs) {
(rhs.numerator == ) std::();
newNum = lhs.numerator * rhs.denominator;
newDen = lhs.denominator * rhs.numerator;
(newNum, newDen);
}
std::ostream& <<(std::ostream& os, Fraction& f) {
(f.denominator == ) {
os << f.numerator;
} {
os << f.numerator << << f.denominator;
}
os;
}
};
{
;
;
std::cout << << f1 << std::endl;
std::cout << << f2 << std::endl;
std::cout << << (f1 + f2) << std::endl;
std::cout << << (f1 - f2) << std::endl;
std::cout << << (f1 * f2) << std::endl;
std::cout << << (f1 / f2) << std::endl;
;
}

