【问题标题】:Operator overloading explanation运算符重载说明
【发布时间】:2018-05-14 20:30:06
【问题描述】:

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

输出为137,其中(2+v).print()输出137来自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 保持为7,但我不明白为什么它输出 13,我总是到 10。

【问题讨论】:

  • 提示:operator+ 应该是 const。另外,向您的rubber duck解释操作员的工作原理。
  • 使构造函数explicit 发现您缺少的隐式转换。
  • 我想我刚才明白了,返回 x++ + ++n;创建一个新的 V 对象,其中第一个参数是 x + ++n 的总和(我只是忽略了 x++,因为它没有任何区别),所以它创建了一个新的 V 实例,其中 a = 总和,b = 3,所以它的值是 13!对吗?

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


【解决方案1】:

问题是当试图从这个操作符返回一个“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。

【讨论】:

    【解决方案2】:

    在你的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

    【讨论】:

      猜你喜欢
      • 2019-05-14
      • 2012-09-17
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 2018-03-25
      • 2017-08-28
      • 2021-08-23
      • 2020-04-09
      相关资源
      最近更新 更多