使用相同参数重载多个函数

时间:2016-02-24 02:56:47

标签: c++ operator-overloading overloading return-type

由于VC ++编译器的缘故,我不得不理解只能使用不同的返回类型来重载函数。

class MyClass {
public:
    MyClass MyClass::operator+(MyClass other) {
        return MyClass(n + other.getn());
    }
    MyClass() = default;
    MyClass(int my_n) : n{ my_n } {}
    int getn() {
        return n;
    }
private:
    int n{ 0 };
};

int main(){
    MyClass m1(7), m2(5);
    MyClass m3 = m1 + m2;
    return 0;
}

但是,如果我想要返回一个整数,比如说12,当我添加它们时,我不能简单地将它们加在一起并再次重载运算符+,因为它不允许重载,其中唯一的区别是返回类型。我是C ++的新手。我能提出的唯一解决方案是:

int i = (m1+m2).getn();

但是当你再也不会再使用它时,创建一个实例似乎很浪费。

2 个答案:

答案 0 :(得分:2)

我认为你想要的是能够写int i = m1 + m2;,这意味着你应该创建一个转换运算符。

class MyClass
{
    operator int()
    {
        return n;
    }
};

int i = m1 + m2; //creates temporary, calls operator int, saves value in i

它仍会创建一个临时的,但operator+的工作方式。你也可以随时写int i = m1.getn() + m2.getn();

答案 1 :(得分:0)

重载并不考虑返回类型。

从标准,$ 13.3 / 1重载分辨率[over.match]

  

最佳函数的选择标准是参数的数量,参数的好坏程度   匹配候选函数的参数类型列表,(对于非静态成员函数)对象与隐式对象参数的匹配程度,以及候选函数的某些其他属性。

  

128)...候选呼叫功能无法通过过载彼此区分   因为它们具有相同的声明或仅在其返回类型上有所不同。

您可能希望为operator+提供两个MyClass,它们仅在MyClassint的返回类型上有所不同,并将它们用作

MyClass m1(7), m2(5);
MyClass m3 = m1 + m2;
int x = m1 + m2;

但是可以省略返回值,那么应该调用哪一个?它的结构不合理。

m1 + m2;
// or m1.operator+(m2);

您可以为它提供另一个命名成员函数,例如

class MyClass { public:
    int add_return_int(MyClass other) {
        return n + other.getn();
    }
...

或作为自由功能

int add_return_int(MyClass lhs, MyClass rhs) {
    return lhs.getn() + rhs.getn();
}