【问题标题】:overloading operator+ for struct without affecting the operands在不影响操作数的情况下为结构重载 operator+
【发布时间】:2017-11-23 12:23:43
【问题描述】:

我想在不影响两个操作数的情况下为 struct 重载一个加号运算符。

这是我所做的。

struct Board {   
    int m_len;
    int blk[BLK_MAX][BLK_MAX];
};

Board& operator+(const Board& b1, const Board& b2) {
    Board ret;
    for (int y = 0; y < N; y++) {
        for (int x = 0; x < N; x++) {
            ret.blk[y][x] = b1.blk[y][x] + b2.blk[y][x];
        }
    }
    return ret;
}

它可能工作正常,但是我感觉不对,因为运算符返回一个局部变量。我不确定这是否会导致内存损坏。有没有更好的方法来做到这一点?

【问题讨论】:

  • 只需删除&amp; 并按值返回结构。
  • 在您查看下面的答案并惊慌失措之前,请知道 C++ 已经实施 NRVO 多年。如今,该标准甚至描述了它应该如何表现。尽管它并不强制实现总是这样做,但实际上大多数人确实这样做了。
  • @Peter Hwang 什么是魔法变量 N?为什么不设置另一个神奇的变量——数据成员m_len?
  • 我忘了提。它是一个整数常量(如 20)。
  • 你说得对。

标签: c++ operator-overloading


【解决方案1】:

有没有更好的方法来做到这一点?

当然有,而且非常简单。加法计算一个新的值。因此它应该返回一个(而不是一个引用):

Board operator+(const Board& b1, const Board& b2) {
    Board ret;
    for (int y = 0; y < N; y++) {
        for (int x = 0; x < N; x++) {
            ret.blk[y][x] = b1.blk[y][x] + b2.blk[y][x];
        }
    }
    return ret;
}

【讨论】:

  • 返回值有没有被别人破坏的可能?我仍然很怀疑,因为局部变量“ret”超出了范围。
  • @PeterHwang - 当您按值返回 int 时,您是否有同样的担心?
  • @PeterHwang 它没有,一切都好像在operator+ 退出时复制了一样。
  • 那么你是说返回 struct 类似于返回 int 因为它是“一个值”?
  • @PeterHwang 当然可以。一个值就是一个值(或“一个对象就是一个对象”)。在Board operator +() 的情况下,返回值是从ret 初始化的对象(复制或移动)。
【解决方案2】:

您不应该通过引用返回局部变量。

你应该替换:

Board& operator+(const Board& b1, const Board& b2)

作者:

Board operator+(const Board& b1, const Board& b2)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多