由于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();
但是当你再也不会再使用它时,创建一个实例似乎很浪费。
答案 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
,它们仅在MyClass
和int
的返回类型上有所不同,并将它们用作
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();
}