首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C++ 模板實作復數四則運算:運算符重載與泛型設計實戰

     編輯:關於C

實驗需求

實現復數類別 Complex,支援:

  1. 實部/虛部構造復數
  2. 加、減、乘、除運算
  3. 提取實部、虛部
  4. 共軛復數
  5. 標準格式輸出 (a+bi) 或 (a-bi)

泛型類別設計

template <class Elem>
class Complex {
private:
    Elem reality;   // 實部
    Elem falsehood; // 虛部
public:
    Complex(Elem r, Elem f) : reality(r), falsehood(f) {}

    // 運算符重載
    Complex operator+(const Complex& c) const {
        return Complex(reality + c.reality, falsehood + c.falsehood);
    }
    Complex operator-(const Complex& c) const {
        return Complex(reality - c.reality, falsehood - c.falsehood);
    }
    Complex operator*(const Complex& c) const {
        return Complex(
            reality * c.reality - falsehood * c.falsehood,
            reality * c.falsehood + falsehood * c.reality
        );
    }
    Complex operator/(const Complex& c) const {
        Elem denom = c.reality * c.reality + c.falsehood * c.falsehood;
        if (denom == 0) {
            cout << "分母不能為 0" << endl;
            return Complex(0, 0);
        }
        return Complex(
            (reality * c.reality + falsehood * c.falsehood) / denom,
            (falsehood * c.reality - reality * c.falsehood) / denom
        );
    }

    // 存取器
    Elem Reality() const { return reality; }
    Elem Falsehood() const { return falsehood; }

    // 共軛
    void Conjugate() { falsehood = -falsehood; }

    // 輸出
    void Output() const {
        if (falsehood >= 0)
            cout << "(" << reality << "+" << falsehood << "i)";
        else
            cout << "(" << reality << falsehood << "i)";
    }
};

測試主程式

int main() {
    Complex<float> c1(1, 2), c2(2, 3);
    cout << "測試結果:" << endl;
    cout << "c1 = (1+2i), c2 = (2+3i)" << endl;

    cout << "c1 + c2 = "; (c1 + c2).Output(); cout << endl;
    cout << "c1 - c2 = "; (c1 - c2).Output(); cout << endl;
    cout << "c1 * c2 = "; (c1 * c2).Output(); cout << endl;
    cout << "c1 / c2 = "; (c1 / c2).Output(); cout << endl;

    cout << "c1 實部: " << c1.Reality() << ", 虛部: " << c1.Falsehood() << endl;
    cout << "c2 實部: " << c2.Reality() << ", 虛部: " << c2.Falsehood() << endl;

    cout << "c1 共軛: "; c1.Conjugate(); c1.Output(); cout << endl;
    cout << "c2 共軛: "; c2.Conjugate(); c2.Output(); cout << endl;
    return 0;
}

關鍵知識點

  • 運算符重載:回傳值而非引用,避免臨時對象生命週期問題
  • const 正確性:運算符標記 const,參數用 const Complex&
  • 復數乘除公式:
    • (a+bi)(c+di) = (ac-bd) + (ad+bc)i
    • (a+bi)/(c+di) = (ac+bd)/(c²+d²) + (bc-ad)/(c²+d²)i
  • 模板優勢:支援 float/double/long double 任意精度

改進建議

  1. 除法分母檢查應拋出異常而非輸出錯誤
  2. 增加 operator==、operator<< 輸出流重載
  3. 提供極坐標構造/轉換函數
  4. 使用 std::complex 替代生產環境代碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved