为什么价值不会增加1?

时间:2016-01-31 03:34:26

标签: c++

我正在尝试使用朋友进行一元运算符重载。 然而,它的价值没有增加1 有什么原因吗?

#include<iostream>
#include<iomanip>

using namespace std;

class Sample{
private:
    double x;
public:
    Sample()
    {
        /*No comment*/
    }
    ~Sample()
    {
        /*No comment*/
    }
    void setX(double recieveX)
    {
        x = recieveX;
    }
    double getX()
    {
        return x;
    }

friend void operator++(Sample s1);
};

void operator++(Sample s1)
{
    s1.x++;
}

int main()
{
    class Sample s1;
    s1.setX(30);
    ++s1;
    cout << s1.getX();
    return 0;
}

答案应该是31,并且在没有朋友的情况下工作。

2 个答案:

答案 0 :(得分:6)

问题是您的operator++按值获取其参数。这就是为什么它会在副本上增加x

您可以通过引用参数来解决此问题:

void operator++(Sample &s1) {
    s1.x++;
}

答案 1 :(得分:1)

我认为您首先需要了解按值传递参数按参考传递参数,这是使用函数的两个基本概念。

传递值时,该函数会生成变量的本地副本,并且其范围仅限于该函数,并且对其进行的任何修改仅保留在此范围内,并且不会反映在外部。

原样:

void operator++(Sample s1)
{
 s1.x++;
}

通过引用传递时,该函数会生成一个实际引用相同传递变量的引用变量,并且对其进行的任何修改也将反映在其范围之外。

原样:

void operator++(Sample &s1)
{
 s1.x++;
}

然而,函数调用不受影响,仍然是:

++s1;