【问题标题】:C++ overloading postfix operator [duplicate]C ++重载后缀运算符[重复]
【发布时间】:2020-01-14 09:40:46
【问题描述】:

据我了解,重载后缀运算符对变量的影响将反映在该变量的下一次出现中。

但下面的程序与我的理解相矛盾,

请帮助我了解以下程序中发生的情况。

#include <iostream>

typedef struct Rectangle_Tag
{
    int len;
    int breadth;

}Rectangle_S;

/* Overloading an infix opertor */
Rectangle_S operator+(Rectangle_S a, Rectangle_S b)
{
    Rectangle_S c;

    c.len = a.len + b.len;
    c.breadth = a.breadth + b.breadth;

    return c;
}

/* Overloading a prefix opertor */
Rectangle_S operator++(Rectangle_S &a)
{
    a.len += 1;
    a.breadth += 1;

    return a;
}

/* Overloading a postfix opertor */
Rectangle_S operator++(Rectangle_S &a, int val)
{
    a.len += 1;
    a.breadth += 1;

    return a;
}

int main(void)
{
    Rectangle_S r1, r2, r3;

    r1.len = 20;
    r1.breadth = 10;

    r2.len = 20;
    r2.breadth = 10;

    r3 = (r1++) + (r2);

    std::cout << "\tr3.len     : " << r3.len << '\n';
    std::cout << "\tr3.breadth : " << r3.breadth << '\n';

    return (0);
}


//Expected Output :
    r3.len     : 40
    r3.breadth : 20

//Actual Output :
    r3.len     : 41
    r3.breadth : 21

【问题讨论】:

  • 您的前缀和后缀运算符执行相同的操作,因此您将获得相同的结果。要了解它是如何正确完成的,请参阅 一元算术运算符 here 部分
  • “变量上的重载后缀运算符将反映在下一次出现” 它不会自动执行此操作。您需要手动实现此行为。
  • 虽然运算符对内置或标准类型具有特定含义,但用户自定义类型可能主要按照他们想要的方式实现。为了遵循最小意外原则,最好遵循内置行为。在这里,您的operator++ 都不遵循该原则。

标签: c++ c++11 operator-overloading operator-keyword postfix-operator


【解决方案1】:

没有人是完美的!

代码的作者以一种特殊的方式实现了后缀运算符。正确的做法是

Rectangle_S operator++(Rectangle_S &a, int)
{
    auto old = a;
    ++a;
    return old;
}

还要注意前缀++ 应该通过引用返回修改后的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2016-03-29
    • 1970-01-01
    • 2012-01-05
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多