在这种情况下,为什么使用 *此必需的对象引用返回对象引用



我正在学习的课程说,返回此对象参考(使用 *this(主要用于链接相等的符号(例如:b = d = c = a(但是,我无法理解当我超载" ="运算符时,此返回的工作原理。如果我不使用任何类型的链条,这也有必要吗?此返回语句如何工作?非常感谢。

class Rational {
    int _n = 0; // '_n' stands for numerator
    int _d = 1; // '_d' stands for denominator
public:
    Rational (int numerator = 0, int denominator = 1) : _n(numerator), _d(denominator) {};
    Rational (const Rational & rhs) : _n(rhs._n), _d(rhs._dd) {};
    ~Rational ();
    int numerator() const { retrun _n; };
    int denominator() const { return _d; };
    Rational & operator = (const Rational &);
    Rational operator + (const Rational &) const;
    Rational operator - (const Rational &) const;
    Rational operator * (const Rational &) const;
    Rational operator / (const Rational &) const;
};
Rational & Rational::operator = (const Rational & rhs) {
    if(this != &rhs){
        _n = rhs.numerator();
        _d = rhs.denominator();
    }
    return *this;
}
Rational Rational::operator + (const Rational & rhs) const {
    return Rational((_n * rhs._d) + (_d * rhs._n), (_d * rhs._d));
}
Rational Rational::operator - (const Rational & rhs) const {
    return Rational((_n * rhs._d) + (_d * rhs._n), (_d * rhs._d));
}
Rational Rational::operator * (const Rational & rhs) const {
    return Rational((_n * rhs._n), (_d * rhs._d));
}
Rational Rational::operator / (const Rational & rhs) const {
    return Rational((_n * rhs._d), (_d * rhs._n));
}
Rational::~Rational(){
    print("dtor: %d/%dn", this->_n, this->_d);
    _n = 0; _d = 1;
}
std::ostream & operator << (std::ostream & o, const Rational & r){
    return o << r.numerator() << "/" << r.denominator();
}
int main(int argc, char** argv){
    Rational a = 7;                 // 7/1              
    cout << "a is: " << a << endl;
    Rational b(5, 3);               // 5/3
    cout << "b is: " << b << endl;
    Rational c = b;                 // Copy constructor
    cout << "c is: " << c << endl;
    Rational d;                     // Default constructor
    cout << "d is: " << d << endl;
    d = c;                          // Assignment constructor
    cout << "d is: " << d << endl;
    Rational & e = d;               // Reference
    d = e;                          // Assignment to self!
    cout << "e is: " << e << endl;
    cout << a << " + " << b << " = " << a + b << endl;
    cout << a << " - " << b << " = " << a - b << endl;
    cout << a << " * " << b << " = " << a * b << endl;
    cout << a << " / " << b << " = " << a / b << endl;
    return 0;
}

假设我们要进行两个Rational进行演示。

Rational r1(1,2), r2(2,3);
r1 = r2;

当我们这样做时,第一个r1将与r2相等。然后操作将返回r1。就像任何功能调用一样,我们可以选择忽略返回值。

另一方面,我们也可以选择不忽略它。

Rational r1(1,2), r2(2,3), r3;
r3 = (r1 = r2);

强调第一个r1 = r2的括号,它将返回r1。下一个r3 = r1

这是与使用函数的地方相同的原理。

#include <iostream>
int print(int x) {
    std::cout << x << std::endl;
    return x;
}
void increase(int x) {
    std::cout << x + 5 << std::endl;
}
int main() {
    print(5); // We can ignore the return value, and just print the number
    int x = print(7); // We can print the number and store the value in a variable
    increase(print(3));  // We can print the value and pass it on to the increase function
    return 0;
}

最新更新