我正在尝试使用朋友进行一元运算符重载。 然而,它的价值没有增加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,并且在没有朋友的情况下工作。
答案 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;