C++ primer第六章6.6函数匹配

函数的匹配

  • 当重载函数的形参数量相等以及某些形参的类型可以由其他的类型转化得来的时候,对于函数的匹配就会变得很难

确定候选函数和可行函数

  • 函数匹配的第一步就是选定本次调用对应的重载函数集,集合中的函数称为候选函数。候选函数具有两个特征:1,与被调用的函数同名;2,声明在调用点是可见的。
  • 第二步,考察本次调用所提供的形参,然后从候选函数中选出能被这组实参调用的函数,这些新的选出的函数叫做可行函数。可行函数具有两个特征:1,形参变量和本次调用的形参数量相等;2,实参的类型和本次调用的从形参的类型相同,或者是可以转化成形参类型的实参。
  • 注意:如果函数含有默认的实参,那么在调用函数的时候,可能传入实参的数量看能小于他实际使用的数量

寻找最佳匹配

  • 函数匹配的第三步是从可行函数中选择与本次调用最为接近匹配的函数。原则是:实参类型和形参类型越接近,那么函数匹配的越好

含有多个形参的函数匹配

  • 实参的数量越多,匹配的难度越大
  • 条件:1,该函数的每一个实参的匹配都不会劣于其他可行的函数需要的匹配;2,至少有一个实参的匹配优于其他函数提供的匹配。
  • 调用重载函数的时候应该尽量避免使用强制类型转换。

6.6.1 实参类型转换

  • 为了确定最佳的匹配,编译器将实参类型转化分为几个等级
  1. 精确匹配,包括以下几种情形:1,实参类型和形参类型一致;2,实参从数组类型转化成对应的指针类型。;3,向实参添加顶层的const或者从实参中删除顶层的const
  2. 通过const转化实现匹配
  3. 通过类型的提升实现的匹配
  4. 通过算术类型转换或者指针转换实现匹配
  5. 通过类类型转换实现的匹配

需要类型的提升和算术类型的转换的匹配

  • 假设有两个同名的函数,一个接收int类型,一个接收short类型。则只有当调用提供的是short类型,才会去调用shaort版本的函数。因此有的时候,即使是一个很小的整数值,也会将其声明为int类型;此时使用short版本反而会导致类型的转换。
  • 所有的算术类型的转换的级别都是一样的,从int向unsigned int的转换,并不会比从int 向double转换级别高。
void manip(long);
void manip(float);
mainip(3.24);//错误,二义性调用

函数匹配和const实参

  • 如果重载函数的区别在于他们的引用类型的实参是否引用了const,或者指针类型的形参是否指向了const,则当调用发生的时候编译器通过实参是否是常亮来决定选择哪个函数。
Record lookup(Account& );// 函数的参数是Account的引用
Record lookup(const Account&);//函数的参数是一个常量的引用
const Account a;
Account b;
lookup(a);  //调用Record lookup(const Account& );
lookup(b);  //调用Record lookup(Account& );
  • 第一个调用中,传入的是const对象a,因为不可以把普通引用绑定到const对象上,所以此例中唯一可行的函数是以常量引用作为形参的那个函数,并且调用该函数与实参a精确匹配。
  • 第二个调用中,传入的是非常量b,对于这个调用来说,两个函数都是可行的,既可以使用b初始化常量的引用,也可以用它来初始化非常量的引用。然后,使用非常量对象初始化常量的引用需要类型的转换,接收非常量形参的版本则和b精确匹配。
  • 指针类型的形参也是类似的。唯一的区别在于指针的形参指向的是常量还是非常量。实参指向的是常量的指针,则会调用形参是const*的函数;如果实参是指向非常量的指针,调用形参是普通指针的函数。

猜你喜欢

转载自blog.csdn.net/CHYabc123456hh/article/details/109023281
今日推荐