gpt4 book ai didi

c++ - 重载运算符有什么问题?

转载 作者:搜寻专家 更新时间:2023-10-31 01:08:55 25 4
gpt4 key购买 nike

我正在学习 C++(准确地说是重载运算符)。我尝试通过这种方式重载 operator+:

Complex4d Complex4d::operator+(const Complex4d &rvalue)
{
return Complex4d(a() + rvalue.a(), b());
}

其中 rvalue.a() 和 a()、rvalue.b() 和 b() 是 Complex2d 的对象。在 Complex2d 类中,我也通过这种方式重载了 operator+:

Complex2d Complex2d::operator +(Complex2d &rvalue)
{
return Complex2d(a() + rvalue.a(), b() + rvalue.b());
}

如果我这样写:

Complex4d Complex4d::operator+(const Complex4d &rvalue)
{
Complex2d test = rvalue.a();
return Complex4d(a() + test, b());
}

一切正常。我做错了什么?

最佳答案

问题是您试图将一个临时对象绑定(bind)到一个非常量引用,这是不允许的并且没有意义:

Complex2d Complex2d::operator +(Complex2d &rvalue)
^^^^^^^^^^^
return Complex4d(a() + rvalue.a(), b());
^^^^^^^^^^

要修复它,请使其采用常量引用,可以 绑定(bind)临时对象。常量正确性也适用。如果您不修改它(不应该修改),请将其设为 const

Complex2d Complex2d::operator +(const Complex2d &rvalue)
^^^^^

另一个参数 (*this) 也没有被修改:

Complex2d Complex2d::operator +(const Complex2d &rvalue) const
^^^^^ ^^^^^

此外,我建议让它们成为自由函数并重用其他代码:

Complex2d operator+(const Complex2d &lhs, const Complex2d &rhs) {
auto ret = lhs;
ret += rhs;
return ret; //see comments for implementation reasoning
}

这允许左侧的行为与右侧相同,并通过减少一个可以访问类的私有(private)成员的不必要函数来改进封装。

关于c++ - 重载运算符有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17556585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com