关于运算符重载的查询,复数上的简单代码示例,添加

An inquiry on operator overloading, example simple code on complex numbers, adding

本文关键字:代码 简单 添加 运算符 重载 查询      更新时间:2023-10-16
    class Complex
{
private:
    float re;
    float im;
public:
    Complex(float r = 0.0, float i = 0.0) : re(r), im(i){}
    friend Complex operator+(Complex c1, Complex c2);
};
Complex operator+(Complex c1, Complex c2)
{
     return Complex(c1.re + c2.re, c1.im + c2.im);
}
int main()
{
    Complex c1(1,2);
    Complex c2(1,2);
    Complex c3;
    c3 = 1.0 + c2;
}

我不清楚为什么这会起作用,因为似乎浮数 1.0 是运算符中的一个参数,而 c2 是另一个参数。现在我被告知这没关系,因为调用了构造函数,这有效吗?我们怎么知道,1.0 分配给 r 而不是 i ??

现在下面这些是不正确的,我问为什么?

class Complex
{
    private:
        float re;
        float im;
    public:
        Complex(float r = 0.0, float i = 0.0) : re(r), im(i){}
        Complex operator+(Complex c1);
};
 Complex Complex::operator+(Complex c1)
{
    return Complex(this->re + c1.re, this->im + c1.im);
}
int main()
{
    Complex c1(1,2);
    Complex c2(1,2);
    Complex c3;
    c3 = 1.0 + c2;
}

这是行不通的,是因为 1.0 不是一个复杂的对象,为什么这里没有初始化构造函数来创建一个 re=1.0, im =0.0 的对象?正如问题第一部分所假设的那样?

 error: no match for 'operator+' in '1.0e+0 + c2'|
当您将

operator+实现为成员函数时,运算符的 LHS 必须是 Complex 类型的对象。

当您将operator+实现为非成员函数时,只要有一种方法可以使用隐式转换从中构造为 Complex 类型的对象,运算符的 LHS 就可以是任何内容。

这就是为什么非成员函数版本有效而成员函数版本无效的原因。

在第一种情况下,调用构造函数,因为

Complex(float r = 0.0, float i = 0.0) : re(r), im(i){}

当第二个参数未传递时,其工作原理类似于转换。因此,任何float都可以转换为Complex

在第二种情况下,如果运算符是成员函数:

Complex Complex::operator+(Complex c1)

必须在类型 Complex 的对象上调用它。但是,当您编写:

c3 = 1.0 + c2;

float+运算符将以 c2 作为参数进行调用("will",因为没有这样的运算符(。相反,如果您编写:

c3 = c2 + 1.0;

它应该有效,因为现在调用了c2+运算符。它期望Complex作为参数,1.0可以转换,因此这将起作用。

感谢您的分享问题,

对于

第一部分,我正在调试代码,发现对于点 c3 = 1.0 + c2;C++创建复杂对象(如预期的那样(,但带有参数(1.0 和 0(。如下所示,我粘贴在下面的调试信息。它类似于创建临时复杂变量,调用默认构造函数和参数作为 1.0 和 0 传递。又名复合体(1,0( 因此它工作正常。

断点 1,主 (( 在 probl.cpp:24

24 c3 = 1.0 + c2;

(GDB( S

Complex::

Complex (this=0x23cc68, r=1, i=0( at probl.cpp:10

10 Complex(float r = 0.0

, float i = 0.0( : re(r(, im(i({}

正如上面第二部分中其他人建议的那样,"+"运算符是复杂类的一部分,因此 c3 = 1.0 + c2; 如果 1.0 已转换为正确的复杂类实例,则仅调用 + 运算符。因此,它给出了编译错误。若要解决此问题,可以将代码更改为

c3 = 复数(1.0( + c2;

这里创建复杂类的临时对象,默认值为 re=1 和 im =0,然后对这个临时对象调用运算符 +。希望这有帮助。