1

有理数の演算を行うための次のコードが、実際に代入演算とストリーム挿入演算子<<をオーバーロードしてオブジェクトを出力しているかどうかを知りたいです。私はC++があまり得意ではないので、これは私にとっては新しいことですが、私が言えることから、すでにそうだと思います。

    /*
 *
 *  C++ version
 *
 */

/* rational.h */

#ifndef RATIONAL_H
#define RATIONAL_H

#include <iostream>

using std::ostream;

struct rational {

    rational(int = 0, int = 1);

    rational operator+(const rational &) const;
    rational operator-(const rational &) const;
    rational operator*(const rational &) const;
    rational operator/(const rational &) const;

    rational operator+(int) const;
    rational operator-(int) const;
    rational operator*(int) const;
    rational operator/(int) const;

    friend rational operator+(int, const rational &);
    friend rational operator-(int, const rational &);
    friend rational operator*(int, const rational &);
    friend rational operator/(int, const rational &);

    friend ostream &operator<<(ostream &, const rational &);

private:

    int den;
    int num;
};

#endif /* RATIONAL_H */

/* rational.cc */

#include <iostream>
#include "rational.h"

rational::rational(int num, int den) : num(num), den(den) {}

rational rational::operator+(const rational &o) const {

    return rational(num * o.den + o.num * den, den * o.den);
}

rational rational::operator+(int n) const {

    return rational(num + n * den, den);
}

rational rational::operator-(const rational &o) const {

    return rational(num * o.den - o.num * den, den * o.den);
}

rational rational::operator-(int n) const {

    return rational(num - n * den, den);
}

rational rational::operator*(const rational &o) const {

    return rational(num * o.num, den * o.den);
}

rational rational::operator*(int n) const {

    return rational(num * n, den);
}

rational rational::operator/(const rational &o) const {

    return rational(num * o.den, den * o.num);
}

rational rational::operator/(int n) const {

    return rational(num, den * n);
}

rational operator+(int n, const rational &o) {

    return o + n;
}

rational operator-(int n, const rational &o) {

    return rational(n) - o;
}

rational operator*(int n, const rational &o) {

    return o * n;
}

rational operator/(int n, const rational &o) {

    return rational(n) / o;
}

ostream &operator<<(ostream &out, const rational &o) {

    out << '(' << o.num << " / " << o.den << ')';
    return out;
}

/* main.cc */

#include <iostream>
#include "rational.h"

using std::cout;
using std::endl;

int main(void) {

    rational a(1, 2);
    rational b(2, 3);

    int i = 5;

    cout << a << " + " << b << " = " << a + b << endl;
    cout << a << " - " << b << " = " << a - b << endl;
    cout << a << " * " << b << " = " << a * b << endl;
    cout << a << " / " << b << " = " << a / b << endl;

    cout << a << " + " << i << " = " << a + i << endl;
    cout << a << " - " << i << " = " << a - i << endl;
    cout << a << " * " << i << " = " << a * i << endl;
    cout << a << " / " << i << " = " << a / i << endl;

    cout << i << " + " << a << " = " << i + a << endl;
    cout << i << " - " << a << " = " << i - a << endl;
    cout << i << " * " << a << " = " << i * a << endl;
    cout << i << " / " << a << " = " << i / a << endl;

    return 0;
}
4

3 に答える 3

2

大丈夫です(operator<<1行で書くこともできますが、ここでは関係ありません):

ostream &operator<<(ostream &out, const rational &o) {
    return out << '(' << o.num << " / " << o.den << ')';
}

ただし、代入演算子はまだ定義していません。

rational & rational::operator=(rational const &rhs) {
    den = rhs.den;
    num = rhs.num;
    return *this;
}
于 2012-12-12T15:51:25.707 に答える
2

簡単な答え:はい、それは<<算術演算に対して行います。割り当て用ではありません。

たとえば、これは<<オーバーロードです。

ostream &operator<<(ostream &out, const rational &o) {
    out << '(' << o.num << " / " << o.den << ')';
    return out;
}

代入演算子をオーバーロードするには、関数を作成する必要があります

rational& rational::operator=(const rational &o) {
    this->den = o.den;
    this->num = o.num;
    return *this;
}
于 2012-12-12T15:51:52.170 に答える
0

挿入と割り当てはどちらも問題ありません。代入演算子(およびコピーコンストラクター)はコンパイラーによって提供されますが、この場合は問題ありません。何らかの理由で代入演算子を提供したい場合(または他のクラスに提供する必要がある場合)、ほぼ確実にコピーコンストラクターも提供する必要があり、ほとんどの場合、デストラクタも提供する必要があります。しかし、ここではそうではありません。コンパイラーで生成されたバージョンは問題ありません(そしてほとんどのC ++プログラマーが期待するものだと思います)。

コードに関する他のコメントに関しては、コンストラクターと挿入演算子の記述方法は問題なく、提案された代替案よりも望ましい方法です。

于 2012-12-12T16:53:06.737 に答える