原创
【博客大赛】《C++ Primer》学习笔记(21)函数的匹配
当函数具备明显不同个数的参数,或参数有明显不同的类型时,匹配显得很简单。
但有时候会很麻烦,比如:
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来决定重载哪个函数。
----------------
当然,设计良好的系统,不应该让编译器产生困惑。
文章评论(0条评论)
登录后参与讨论