在学习C++分数运算的过程中,很多初学者会感到困惑:如何用代码表示一个分数?又如何对分数进行加、减、乘、除等基本运算?本文将从零开始,带你一步步用C++面向对象编程的方式,构建一个功能完整的“分数类”(也称为有理数类),让你彻底掌握C++有理数类的设计与实现。

浮点数(如 float 或 double)在计算机中存在精度问题。例如,1/3 无法被精确表示为小数。而使用分数(分子/分母)可以**精确表示有理数**,避免舍入误差。因此,在科学计算、金融系统或教育软件中,分数加减乘除功能非常实用。
我们首先定义一个 Fraction 类,包含分子(numerator)和分母(denominator)两个私有成员变量,并提供构造函数。
#include <iostream>#include <numeric> // 用于 std::gcdclass Fraction {private: int numerator; // 分子 int denominator; // 分母 // 辅助函数:约分 void simplify() { if (denominator == 0) { throw std::invalid_argument("分母不能为零!"); } if (denominator < 0) { numerator = -numerator; denominator = -denominator; } int g = std::gcd(std::abs(numerator), std::abs(denominator)); numerator /= g; denominator /= g; }public: // 构造函数 Fraction(int num = 0, int den = 1) : numerator(num), denominator(den) { simplify(); } // 获取分子和分母 int getNumerator() const { return numerator; } int getDenominator() const { return denominator; }};接下来,我们在 Fraction 类中添加加、减、乘、除四个成员函数。每个运算都返回一个新的 Fraction 对象。
// 加法Fraction add(const Fraction& other) const { int new_num = numerator * other.denominator + other.numerator * denominator; int new_den = denominator * other.denominator; return Fraction(new_num, new_den);}// 减法Fraction subtract(const Fraction& other) const { int new_num = numerator * other.denominator - other.numerator * denominator; int new_den = denominator * other.denominator; return Fraction(new_num, new_den);}// 乘法Fraction multiply(const Fraction& other) const { int new_num = numerator * other.numerator; int new_den = denominator * other.denominator; return Fraction(new_num, new_den);}// 除法Fraction divide(const Fraction& other) const { if (other.numerator == 0) { throw std::invalid_argument("除数不能为零!"); } int new_num = numerator * other.denominator; int new_den = denominator * other.numerator; return Fraction(new_num, new_den);}为了让代码更直观,我们可以重载 +、-、*、/ 运算符:
Fraction operator+(const Fraction& other) const { return add(other);}Fraction operator-(const Fraction& other) const { return subtract(other);}Fraction operator*(const Fraction& other) const { return multiply(other);}Fraction operator/(const Fraction& other) const { return divide(other);}为了方便打印结果,我们重载 << 运算符:
friend std::ostream& operator<<(std::ostream& os, const Fraction& f) { if (f.denominator == 1) os << f.numerator; else os << f.numerator << "/" << f.denominator; return os;}int main() { Fraction a(1, 2); // 1/2 Fraction b(3, 4); // 3/4 std::cout << "a = " << a << std::endl; // 输出: 1/2 std::cout << "b = " << b << std::endl; // 输出: 3/4 std::cout << "a + b = " << a + b << std::endl; // 输出: 5/4 std::cout << "a - b = " << a - b << std::endl; // 输出: -1/4 std::cout << "a * b = " << a * b << std::endl; // 输出: 3/8 std::cout << "a / b = " << a / b << std::endl; // 输出: 2/3 return 0;}通过本文,你已经学会了如何用 C++ 实现一个功能完整的分数类。这不仅帮助你掌握C++分数运算的核心逻辑,还深入理解了C++面向对象编程的思想——封装、抽象和运算符重载。无论你是学生、自学者还是开发者,这个 Fraction 类都能为你在处理有理数时提供精确、可靠的工具。
记住,良好的代码习惯包括:自动约分、处理负号、防止除零错误。这些细节正是专业与业余的区别所在。
现在,你可以尝试扩展这个类,比如支持与整数运算、比较大小(重载 <, > 等),甚至转换为小数。编程的乐趣,就在于不断创造!
本文由主机测评网于2025-12-03发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025122479.html