【问题标题】:what is the order of function overloading [closed]函数重载的顺序是什么[关闭]
【发布时间】:2020-01-05 10:40:19
【问题描述】:

我对以下问题的结果有疑问。当从 main 调用函数 f 时,调用转到 f(B &) 尽管我重载了 int 运算符并且首先定义了 f(int)

如果我注释掉 f(B &) 函数,那么调用会转到 f(int) 并打印 5。

#include <iostream>
using namespace std;
class A{
    int y;
    public:
    A(int y=2):y(y){}
    int getValue(){
        cout<<y<<endl;
    }
};
class B{
    int x;
    public:
    A a;
    B(int x=5):x(x){}
    operator int(){
        return x;
    }
};
void f(int x){
    cout<<x<<endl;
}
void f(B &b){
    b.a.getValue();
}
int main() {
    B b;
    f(b);
}

我原以为它会转到f(int) 函数和print 5,但它却改为prints 2。为什么它不去f(int) 而不是f(B &amp;)。为什么会发生这种行为,谁能解释一下?

【问题讨论】:

  • 仅仅因为 f(B) 是完全匹配的。完全匹配总是会击败需要转换的匹配。
  • catch 子句按其声明顺序进行搜索。重载的函数不是。

标签: c++ operator-overloading object-composition


【解决方案1】:

函数重载决议基于哪个函数更匹配,而不是哪个函数“首先定义”。

您传递的是B,因此f(B&amp;)精确 匹配。

f(int) 不是因为它需要转换。

您的程序中没有任何内容可以触发所述转换,但如果 f(B&amp;) 不存在,则会尝试此操作。


顺便说一句,您的getValue 实际上更像printValue。它目前有一个int 返回类型,但实际上并没有返回任何东西,所以你的程序有未定义的行为。您可以通过使其返回 void 来解决此问题,但您最好将其改为 return y

【讨论】:

  • 尝试注释掉 f(B &) 函数,然后它会触发它拥有的唯一函数 f(int)。
  • @MFCDev 当然。这是有道理的,如果f(B&amp;) 不存在,它就不会被调用。
  • 如果您评论f(B&amp;),它会尝试暗示将其转换为 f(int)。您可能想了解隐式和显式转换,因为这是这里发生的事情
  • @MaxLanghof Mm 正在讨论这样做。好的,将添加;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 2021-05-13
  • 1970-01-01
  • 2011-11-28
相关资源
最近更新 更多