C++ 为什么该值不增加1?

C++ 为什么该值不增加1?,c++,C++,我正在尝试使用friend进行一元运算符重载。 然而,该值并没有像预期的那样增加1 有什么原因吗 #include<iostream> #include<iomanip> using namespace std; class Sample{ private: double x; public: Sample() { /*No comment*/ } ~Sample() { /*No com

我正在尝试使用friend进行一元运算符重载。 然而,该值并没有像预期的那样增加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,并且在没有朋友的情况下工作。

问题是运算符++按值获取其参数。这就是它在副本上递增x的原因

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

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

我认为您首先需要理解通过值传递参数和通过引用传递参数,这是使用函数的两个基本概念

通过值传递时,函数将生成变量的本地副本,其范围仅限于函数,对其所做的任何修改仅保留在此范围内,不会反映外部

例如:

void operator++(Sample s1)
{
 s1.x++;
}
void operator++(Sample &s1)
{
 s1.x++;
}
而当通过引用传递时,函数会生成一个引用变量,该引用变量实际上引用的是同一个传递的变量,对它所做的任何修改也会反映在其范围之外

例如:

void operator++(Sample s1)
{
 s1.x++;
}
void operator++(Sample &s1)
{
 s1.x++;
}
但是,函数调用将不受影响,并且仍然是:

++s1;
您忘记在运算符++中通过引用传递示例。