首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在c++中使用带有常量类型输入参数的函数内部的运算符重载

在c++中使用带有常量类型输入参数的函数内部的运算符重载
EN

Stack Overflow用户
提问于 2019-12-02 05:37:12
回答 1查看 85关注 0票数 1

请考虑以下代码:

代码语言:javascript
复制
#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

我想用常量输入参数实现函数foo。但是我失败了,因为编译器说: error: no match for‘operator+’(操作数类型是‘const vec’和‘const vec’)返回v1 + v2 + temp。如何修改运算符重载,以便在函数中使用+运算符

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

EN

Stack Overflow用户

回答已采纳

发布于 2019-12-02 05:41:48

代码语言:javascript
复制
 const vec operator + (const vec & a) {

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

代码语言:javascript
复制
     v1 + v2 + temp;

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

只需将重载更改为:

代码语言:javascript
复制
 const vec operator + (const vec & a) const {

这就是它应该成为的样子,因为它不会修改this中的任何内容。这个重载必须是const类方法还有其他原因;在本例中,考虑到返回const vec的事实,更容易理解其中的原因。您也可以将此重载声明为返回vec而不是const vec,但这并不是什么大问题(由于不同的原因,同样的编译错误也会发生)。

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

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59130210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档