我试图了解使用运算符重载的短程序的输出。
输出为137,其中(2+v).print()
输出 13 且 7 来自v.print();
#include <iostream>
using namespace std;
class V
{
int x;
public:
V(int a = 7, int b = 3) { x = a + b; }
void print() { cout << x; }
V operator+(int n)
{
return x++ + ++n;
}
};
V operator+(int lop, V rop)
{
return rop + lop;
}
int main()
{
V v(1, 6);
(2 + v).print();
v.print();
return 0;
}
我理解运算符重载的基本概念,我得到V rop
只是V v(1,6)
的副本,并且它不会更改v.print();
的输出x
1}}保持7,但我不知道为什么输出13,我总是达到10。
答案 0 :(得分:0)
在code
到达return (x++ + ++n);
编译器时创建一个对象V
,这样你的构造函数就会被再次调用。然后,这些作业将发生a=10
和b=3
。因此,您必须将a
和b
值保存在另一个members
中。
试试这个:
#include <iostream>
using namespace std;
class V {
int x;
int a;
int b;
public:
V(int a=7, int b=3) { x = a + b; this->a = a; this->b = b; }
void print() { cout << x - this->b; }
V operator+(int n) {
return (x++ + ++n);
}
};
V operator+(int lop, V rop) {
return rop + lop;
}
int main()
{
V v(1,6);
(2 + v).print();
v.print();
return 0;
}
您的(2 + v).print();
输出将为10
。
答案 1 :(得分:0)
问题在于尝试从此运算符返回“V”类型的对象时:
V operator+(int n)
{
return x++ + ++n;
}
你试图在'int'中返回什么,所以它应该被转换为'V'类型的对象,它的完成方式(从基本类型转换为自定义类)是使用构造函数。你唯一拥有的构造函数是2个可选参数,它会产生一个问题,即它只尝试创建一个参数的对象,因此它被发送为a = 10,b = 3(默认值)然后输出是13。
如果您不想更改类的成员,我建议使用多个构造函数来解决问题。
class V
{
int x;
public:
V() { x = 10; }
V(int a) { x = a; }
V(int a, int b) { x = a + b; }
void print() { cout << x; }
V operator+(int n)
{
return x++ + ++n;
}
};
通过这种方式,您可以调用默认构造函数,将x设置为10,如前所述,另一个构造函数将1个参数从“int”投射到“V”,而普通构造函数则使用a和b。