重载预增量运算符未显示正确结果
overloading pre-increment operator not showing correct result
我已经使用友元函数重载了预递增运算符。在重载的友元函数中,变量的值显示正确。但是显示函数中没有显示该值,为什么?
#include <iostream>
using namespace std;
class Rectangle {
public:
int breadth;
public:
void read();
void display();
friend void operator ++(Rectangle r1);
};
void Rectangle::read()
{
cout << "Enter the breadth of the Rectangle: ";
cin >> breadth;
}
void operator++(Rectangle r1)
{
++r1.breadth;
cout<<r1.breadth<<endl; //correct result
}
void Rectangle::display()
{
cout<<breadth<<endl; // not showing pre-incremented value, why ???
}
int main()
{
cout<<"Unary Operator using Friend Function \n";
Rectangle r1;
r1.read();
++r1;
cout << "\n breadth of Rectangle after increment: ";
r1.display();
return 0;
}
您的 operator ++
按值获取 Rectangle
对象,这意味着它接收其操作数的 copy。然后它尽职尽责地增加副本的 breadth
成员,打印出来,然后在结束时丢弃副本。
您需要通过引用获取参数:
friend void operator ++(Rectangle &r1)
{
++r1.breadth;
}
另请注意,使用成员函数而不是自由函数来重载一元运算符是很常见的。这么用,就不会出现这个问题了:
class Rectangle
{
// ...
public:
void operator++ ()
{
++breadth;
}
// ...
};
一些旁注:
operator++
到 return 对其操作数的引用是很常见的,以模仿 built-in 运算符所做的事情。就像可以对 int i
执行 ++ ++ i
一样,也应该可以对 user-defined 类型 r
执行 ++ ++ r
。
在实践中,运算符重载只应在以下情况下使用:a) 您正在编写一个行为类似于 built-in 类型的类型,或 b) 您正在编写一个 domain-specific 语言。递增矩形不是我可以直观解释的事情,最好作为命名成员函数来完成。您如何判断 ++r
是增加宽度或高度,还是两者都增加,或者将矩形向右移动,还是...?
我已经使用友元函数重载了预递增运算符。在重载的友元函数中,变量的值显示正确。但是显示函数中没有显示该值,为什么?
#include <iostream>
using namespace std;
class Rectangle {
public:
int breadth;
public:
void read();
void display();
friend void operator ++(Rectangle r1);
};
void Rectangle::read()
{
cout << "Enter the breadth of the Rectangle: ";
cin >> breadth;
}
void operator++(Rectangle r1)
{
++r1.breadth;
cout<<r1.breadth<<endl; //correct result
}
void Rectangle::display()
{
cout<<breadth<<endl; // not showing pre-incremented value, why ???
}
int main()
{
cout<<"Unary Operator using Friend Function \n";
Rectangle r1;
r1.read();
++r1;
cout << "\n breadth of Rectangle after increment: ";
r1.display();
return 0;
}
您的 operator ++
按值获取 Rectangle
对象,这意味着它接收其操作数的 copy。然后它尽职尽责地增加副本的 breadth
成员,打印出来,然后在结束时丢弃副本。
您需要通过引用获取参数:
friend void operator ++(Rectangle &r1)
{
++r1.breadth;
}
另请注意,使用成员函数而不是自由函数来重载一元运算符是很常见的。这么用,就不会出现这个问题了:
class Rectangle
{
// ...
public:
void operator++ ()
{
++breadth;
}
// ...
};
一些旁注:
operator++
到 return 对其操作数的引用是很常见的,以模仿 built-in 运算符所做的事情。就像可以对int i
执行++ ++ i
一样,也应该可以对 user-defined 类型r
执行++ ++ r
。在实践中,运算符重载只应在以下情况下使用:a) 您正在编写一个行为类似于 built-in 类型的类型,或 b) 您正在编写一个 domain-specific 语言。递增矩形不是我可以直观解释的事情,最好作为命名成员函数来完成。您如何判断
++r
是增加宽度或高度,还是两者都增加,或者将矩形向右移动,还是...?