运算符重载说明

时间:2018-05-14 20:30:06

标签: c++ c++11 operator-overloading c++14

我试图了解使用运算符重载的短程序的输出。

输出为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。

2 个答案:

答案 0 :(得分:0)

code到达return (x++ + ++n);编译器时创建一个对象V,这样你的构造函数就会被再次调用。然后,这些作业将发生a=10b=3。因此,您必须将ab值保存在另一个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。