热度 12
2016-3-22 16:04
783 次阅读|
0 个评论
当函数具备明显不同个数的参数,或参数有明显不同的类型时,匹配显得很简单。 但有时候会很麻烦,比如: void f(); void f(int); void f(int, int); void f(double, double = 3.14); 当调用f(5.6)的时候,会调用哪一个呢? 答案是: void f(double, double = 3.14); 函数匹配的第一步,是找到可见的可被重载的函数,称为candidate functions。 函数匹配的第二步,是找到参数可以匹配上的函数,称为viable functions。 函数匹配的第三步,是找到参数类型最匹配的函数,称为best match。 • A函数的参数匹配,没有一个比B函数差的。 • A函数的参数匹配,至少有一个比B函数要好。 因此,如果是调用f(42, 2.56)? 答案是: 编译器会拒绝做出选择。 再举个例子: void ff(int); void ff(short); 当调用ff('a')时,实际上调用的是ff(int),因为char会被默认转换成int。 再举个例子: void manip(long); void mainip(float); 当调用manip(3.14)时,编译器会拒绝做出选择,因为类型转换并没有优先级之分。 从double到float,和从double到long,是一样的。 如果参数被const修饰,那么编译器会根据参数是否为const来决定重载哪个函数。 ---------------- 当然,设计良好的系统,不应该让编译器产生困惑。