0

所以我创建了这个可以添加两个对象的两个值的类。我不太明白的是在运算符函数中,分子和分母的值是否来自 int main() 中的对象 no1?

class frac
{
    public:
        frac operator+(frac&);
        frac();
        frac(int, int);
        int numerator;
        int denominator;
};

frac frac::operator+(frac& tmp)
{
    frac tmpResult;
    tmpResult.numerator = numerator + tmp.numerator;
    tmpResult.denominator = denominator + tmp.denominator;

    return tmpResult;
}

int main()
{
    frac no1(2, 5);
    frac no2(3, 6);
    frac result = no1 + no2;
    return 0;
}
4

6 回答 6

1

是的,它被定义为成员函数,所以相当于调用

no1.operator+(no2);

您想将参数类型更改为const引用,因为您并不想修改右侧。你想修正你的数学。

请注意,您还可以使用免费功能

frac operator+(const frac& lhs, const frac& rhs) { ... }

这对某些人(包括我)来说似乎更自然。

于 2013-10-02T18:36:13.247 回答
1

分子和分母的值是否来自 int main() 中的对象 no1?

是的。

于 2013-10-02T18:35:57.047 回答
0

忽略你的数学错误......

当您将重载运算符声明为成员函数时,假定第一个参数是this. 也就是说,no1 + no2只是 的简写no1.operator+(no2)。因此,该函数从当前对象中查看numerator和查看(因为它在左侧)。denominatorno1

或者,您可以这样声明函数:

class frac
{
    // class declaration
    friend frac operator+(const frac& lhs, const frac& rhs);
};

frac operator+(const frac& lhs, const frac& rhs)
{
    // implement fraction addition for lhs + rhs
}
于 2013-10-02T18:38:59.277 回答
0

是的你是对的。可以在类方法中访问类成员,而无需指定它们的来源(就像在本地声明它们一样)。

frac frac::operator+(frac& tmp)
{
    frac tmpResult;
    tmpResult.numerator = numerator + tmp.numerator;
    tmpResult.denominator = denominator + tmp.denominator;

    return tmpResult;
}

这段代码可以重写为:

frac frac::operator+(frac& tmp)
{
    frac tmpResult;
    tmpResult.numerator = this->numerator + tmp.numerator;
    tmpResult.denominator = this->denominator + tmp.denominator;

    return tmpResult;
}

PS:我相信您的意思是运算符重载。

编辑:当你处理错误的分数时,我有这种纠正你的数学的冲动。

分数加法(和减法分别)可以这样完成:

frac frac::operator+(frac& tmp)
{
    int common_denominator = tmp.denominator * this->denominator;
    int common_numerator = tmp.numerator * this->denominator + this->numerator * tmp.denominator;

    //You can add simplification by dividing these 
    //two above with their greatest common divisor 
    //in order to avoid cases like 111/222 which can
    //be represented as 1/2. (this is optional)

    return frac(common_numerator, common_denominator)
}
于 2013-10-02T18:36:28.530 回答
0

是的。分子和分母的值来自 1 号对象。

为了您的理解,您也可以将其写为:

frac result = no1.operator+( no2 );
于 2013-10-02T18:36:45.090 回答
0

您的 main() 可以重写为更明确:

int main()
{
    frac no1(2, 5);
    frac no2(3, 6);
    frac result = no1.operator+( no2 );
    return 0;
}

此代码是等效的,但可能更容易理解哪个对象指针作为 this 传递给 operator+

于 2013-10-02T18:37:23.337 回答