gpt4 book ai didi

c++ - 在 C++ 中使用 const 类型输入参数的函数内部使用运算符重载

转载 作者:行者123 更新时间:2023-11-30 03:12:56 25 4
gpt4 key购买 nike

请考虑以下代码:

#include <iostream>
using namespace std;

class vec {
public:
float x,y;

vec(float a, float b) {
x = a;
y = b;
}

const vec operator + (const vec & a) {
vec ResVec(0.0f, 0.0f);
ResVec.x = x + a.x;
ResVec.y = y + a.y;

return ResVec;
}

};

vec foo(const vec& v1, const vec& v2)
{
const vec temp(2.0f,2.0f);
return v1 + v2 + temp;
}

int main() {
vec v1(1.0f, 1.0f);
vec v2(2.0f,2.0f);
vec v3(0.0f,0.0f);

v3 = foo(v1,v2);
}

Run the above code online

我想用 const 输入参数实现函数 foo。但是我失败了,因为编译器说:error: no match for ‘operator+’ (operand types are ‘const vec’ and ‘const vec’) 返回 v1 + v2 + 温度。如何修改运算符重载以便我可以在函数中使用 + 运算符

vec foo(const vec& v1, const vec& v2)

最佳答案

 const vec operator + (const vec & a) {

此重载返回一个 const vec。不是 vec。这很重要。

     v1 + v2 + temp;

因此,第一个加法运算符返回一个 const vec。第二个加法运算符将尝试将 const vec 添加到 vec。然而重载不是 const 类方法,所以它不能被 const 对象调用(这不是 100% 技术上准确的解释,见下文,但是在这个例子中更容易理解)。

只需将重载更改为:

 const vec operator + (const vec & a) const {

不管怎样,它应该是这样的,因为它不会修改 this 中的任何内容。这个重载必须是 const 类方法还有其他原因;在这种情况下,考虑返回 const vec 的事实更容易理解为什么。您还可以将此重载声明为返回 vec 而不是 const vec,但这不是实质性问题(由于不同的原因,会出现相同的编译错误)。

在声明运算符重载时,适用以下经验法则:如果重载运算符未修改 this 中的任何内容,则必须将其声明为 const类方法。

关于c++ - 在 C++ 中使用 const 类型输入参数的函数内部使用运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59130210/

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