C++运算符重载混淆

C++ Operator Overload Confusion

本文关键字:重载 运算符 C++      更新时间:2023-10-16

所以我创建了这个类,它可以添加两个对象的两个值。我真正不明白的是,在运算符函数中,分子和分母的值是否来自 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;
}

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

是的。

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

no1.operator+(no2);

您希望将参数类型更改为const引用,因为您实际上并不想修改右侧。你想修复你的数学。

请注意,您也可以使用免费函数

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

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

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

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

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

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

frac result = no1.operator+( no2 );

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

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

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

忽略

你的数学错误...

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

或者,您也可以通过这种方式声明函数:

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
}