實作一個 Fraction 類別,支援分子分母存儲、約分(最大公約數)、顯示與基本建構/賦值操作,作為 C++ 類別設計入門練習。
#include <iostream>
using namespace std;
class Fraction {
private:
int m; // 分子
int d; // 分母
public:
Fraction() : m(0), d(1) { cout << "Fraction()" << endl; }
Fraction(int m, int d) : m(m), d(d) { cout << "Fraction(int, int)" << endl; }
void set(int m, int d) { this->m = m; this->d = d; }
// 約分:求最大公約數 (GCD)
void frac() {
int g = (m > d) ? m : d; // 簡易版:從較大者遞減找公因數
for (int i = g; i > 0; --i) {
if (m % i == 0 && d % i == 0) {
m /= i; d /= i;
break; // 找到最大公約數即可跳出
}
}
}
void show() { cout << "m=" << m << ", d=" << d << endl; }
~Fraction() { cout << "~Fraction" << endl; }
};
int main() {
Fraction f1(10, 20), f2;
f1.frac(); f1.show(); // 輸出 m=1, d=2
f2.set(3, 4);
f2.frac(); f2.show(); // 輸出 m=3, d=4
system("pause");
return 0;
}
O(log min(m,d)) 取代 O(max(m,d))。
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
set 中呼叫 frac(),保證物件恆為最簡形式。+ - * /、<<、>> 等,提供直觀介面。分數類別是練習 C++ 類別封裝、建構/解構、運算子多載、不變量維護的經典範例。從簡易版出發,逐步引入演算法優化與現代 C++ 語法,能深入理解資料抽象與類別設計精髓。