Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的运算符重载故障+;_C++ - Fatal编程技术网

C++ C+中的运算符重载故障+;

C++ C+中的运算符重载故障+;,c++,C++,我定义了一个分数类,如下所示,重载“=”&“+”操作符 我使这个程序尽可能简单,以显示问题 #include <iostream> class Fraction { private: int nominator; int denominator; public: Fraction (); Fraction (int, int); Fraction & operator = (Fraction &); fri

我定义了一个分数类,如下所示,重载“=”&“+”操作符

我使这个程序尽可能简单,以显示问题

#include <iostream>

class Fraction {
private:
    int nominator;
    int denominator;
public:    
    Fraction ();
    Fraction (int, int);

    Fraction & operator = (Fraction &);

    friend Fraction operator + (Fraction &, Fraction &);

    // static function:
    // find the Greatest Common Divisor of two numbers
    int static GCD(int x, int y);

};

int Fraction::GCD(int x, int y) {
    if (y == 0) {
        return x;
    } else {
        return GCD (y, x % y);
    }
}

Fraction::Fraction () {
    nominator = NULL;
    denominator = NULL;
}

Fraction::Fraction (int num_1, int num_2) {
    int divisor = Fraction::GCD (num_1, num_2);
    nominator = num_1 / divisor;
    denominator = num_2 / divisor;
}

Fraction & Fraction::operator = (Fraction &A) {
    nominator = A.nominator;
    denominator = A.denominator;
    return *this;
}

Fraction operator + (Fraction &A, Fraction &B) {
    int nominator = A.nominator * B.denominator + B.nominator * A.denominator;
    int denominator = A.denominator * B.denominator;
    int divisor = Fraction::GCD (nominator, denominator);
    return Fraction (nominator / divisor, denominator / divisor);
}

问题是,为什么“测试3”有“没有可行的重载“=”错误?

这是因为您的
操作符=
无法绑定到临时变量

您应该这样定义它:

Fraction & Fraction::operator = (const Fraction &A)

因此,它将绑定到临时对象、常量对象和文本。

您的赋值运算符被声明为引用非常量
分数。加法运算符按值返回,因此您尝试将临时值分配给
frac
。临时变量不能绑定到非常量引用

解决方法是让赋值运算符按常量引用:

Fraction & operator = (const Fraction &);

您定义了赋值
运算符=
,将左值引用作为参数,但试图传递一个临时参数。临时变量仅绑定到常量引用或右值引用

您应该仔细阅读如何以可用的方式重载运算符,例如,
运算符+
接受的非ST左值引用也会出现同样的问题


也就是说,使用
分数和运算符=(分数常量&)
分数运算符+(分数常量&,分数常量&)

您还可以添加
分数&运算符=(分数&&)
@Jerome你可以,但在这种情况下没有意义,因为从分数移动只是一个副本。为什么?当您只需要一个时,这将需要维护两个函数
Fraction & operator = (const Fraction &);