【问题标题】:Overloading assignment operation/stream重载赋值操作/流
【发布时间】:2012-12-12 15:48:21
【问题描述】:

我想知道以下用于对有理数进行操作的代码是否实际上已经重载了赋值操作和流插入操作符

    /*
 *
 *  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;
}

【问题讨论】:

    标签: c++ operator-overloading overloading


    【解决方案1】:

    operator&lt;&lt; 就可以了(虽然可以写成一行,但这里没关系):

    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;
    }
    

    【讨论】:

    • 我只需要一个功能(你提供的那个)?
    • 你可以使用我给你的operator=,是的。 alestanis 的版​​本现在也可以,但是this-&gt; 是可选的(他必须来自Java 世界;))
    • 好吧,你不应该为 ctor 参数和属性使用相同的名称。它可以与某些编译器一起使用,并且会像其他编译器一样崩溃。喜欢以下:
    • rational::rational(int n, int d) : num(n), den(d) {}
    • @skp:使用相同的名称将适用于所有符合标准的编译器。
    【解决方案2】:

    简短回答:是的,它适用于 &lt;&lt; 和算术运算。 它不适用于分配。

    例如,这是&lt;&lt;重载:

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

    要重载assignment operator,你应该写一个函数

    rational& rational::operator=(const rational &o) {
        this->den = o.den;
        this->num = o.num;
        return *this;
    }
    

    【讨论】:

    • 您的赋值运算符不能用于赋值链或循环/if 语句中。另外,你不能将它声明为 const,因为它会改变 this。
    • 赋值运算符是完全没有必要和多余的。
    【解决方案3】:

    插入和赋值都很好。赋值运算符 (和复制构造函数)由编译器提供,它 在这种情况下很好。如果出于某种原因您确实想提供 赋值运算符(或者您需要其他类), 您几乎肯定还需要提供一个复制构造函数, 大多数时候,一个析构函数。但事实并非如此 这里;编译器生成的版本很好(以及最 我认为 C++ 程序员会期望)。

    关于您代码中的其他 cmets:您的方式 已经编写了构造函数,插入运算符只是 很好,并且比建议的替代方案更可取。

    【讨论】:

      猜你喜欢
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 2020-04-16
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 2011-07-19
      相关资源
      最近更新 更多