函数匹配:实参类型转换

重点:

1.函数匹配的第一步是选定本次调用对应的重载函数集,集合中的函数称为候选函数。

2.候选函数具备两个特征:①是与被调用的函数同名;

②其声明在调用点可见。

3.函数匹配的第二步考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,称为可行函数。

4.可行函数的两大特点:①其形参数量和被提供的实参数量相同;

②每个实参类型与形参类型相同或者是能转换成形参类型。

NOTE:如果函数含有默认实参,则我们在调用函数时传入的实参数量可能会少于它实际使用的实参数量。

5.函数匹配的第三步是从可行函数中选择与本次调用最匹配的函数。

6.“最匹配”:实参类型与形参类型越接近,匹配地越好。

7.若无法判断孰优孰劣,编译器最终会因为这个调用具有二义性而拒绝其请求。

TIP:调用函数应该尽量避免强制类型转换。如果实际应用过程中确实需要强制类型转换,则说明我们设计的形参集合不合理。

8.为了确定最佳匹配,编译器将实参类型到形参类型的转换划分为几个等级,具体排序:

①精确匹配;

②通过const转换实现的匹配;

③通过类型提升实现的匹配;

④通过算术类型转换或者指针转换实现的匹配;

⑤通过类类型转换实现的匹配。

9.小整型一般都会提升到int类型或者更大的整数类型。

Void manip ( long );

Void manip ( float );

Manip ( 3.14 );//错误:二义性调用

10.函数匹配和const形参:

实参是const -> 形参是const的函数;

实参非const -> 形参非const的函数;

时间: 2025-01-06 20:23:32

函数匹配:实参类型转换的相关文章

C++ 函数重载与函数匹配

<C++ Primer>笔记,整理关于函数重载与函数匹配的笔记. 函数重载 void func(int a); //原函数 void func(double a); //正确:形参类型不同 void func(int a, int b); // 正确:形参个数不同 int func(int a); //错误:只有返回类型不同 typedef int int32; void func(int32 a); //与原函数等价:形参类型相同 void func(const int a); //与原函数

c++之函数重载(函数匹配)

Case void f(); void f(int); void f(int, int); void f(double, double = 3.14); 匹配原则: 1)其形参数量与本次调用提供的实参数量相等 2)每个实参的类型与对应的形参类型相同,或者可以转换成形参的类型; 寻找最佳匹配: 1)该函数每个实参的匹配都不劣于其他可行函数需要的匹配; 2)至少有一个实参的匹配优于其他可行函数提供的匹配; 例子: a) f(2.56,38); b) f(38); c) f(32,0); d) f(3

《JS权威指南学习总结--8.3 函数的实参和形参》

内容要点: 一.可选形参      当调用函数的时候传入的实参比函数声明时指定的形参个数要少,剩下的形参都将设置为undefined值.     例如:       //将对象o中可枚举的属性名追加至数组       //如果省略a,则创建一个新数组并返回这个新数组.        function getPropertyNames(o,/*optional*/a){           if(a === undefined) a= [];           for(var property

已定义的函数有返回值,函数调用可以作为一个函数的实参,但是不能作为形参

1.问题描述 若已定义的函数有返回值,则以下关于该函数调用的叙述中错误的是( D  ) A)函数调用可以作为独立的语句存在 B)函数调用可以作为一个函数的实参 C)函数调用可以出现在表达式中 D)函数调用可以作为一个函数的形参 解析:返回值存在寄存器中, 没有地址, 不能作为形参,但可以作为实参. 2.形参与实参区别 形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用. 实参出现在主调函数中,进入被调函数后,实参变量也不能使用. 形参和实参的功能是作数据传送.发生函数调用时,

字符串作为函数模版实参的意外情况

有时,当把c风格的不同字符串去实例化函数模版的同一个模版参数时,在实参演绎的过程中经常会发生 意想不到的事情,那就是编译失败,并报错类型不匹配. 正如下面的例子一样: #include<iostream> using namespace std; /* *匹配测试 */ template<typename T> int ref_fun(T & t1,T & t2) { return strlen(t1) - strlen(t2); } template<typ

7.通过函数修改实参的值 2012.3.20

*************************************************************************************************************************** 7.通过函数修改实参的值   2012.3.20 *****************************************************************************************************

C++虚函数默认实参的注意事项

我们都知道当成员函数是虚函数的时候,函数调用取决于调用函数的对象的类型而不是指针或者应用的类型.这就是C++中的多态. 那么一个虚函数的实参的缺省值是什么呢?例如如下代码: #include <iostream> #include <string> using namespace std; class A { public: virtual void func(int number = 10) { cout << "A::func() " <&

php中函数的实参和形参

php中函数的实参和形参严格一一对应.例子: <?php function test($a,$b=2,$c){  //函数test第二个参数给默认值 $result=3*$a+2*$b+$c; return $result; } echo test(3,4,5);//调用正确,结果为22 echo test(3,,5);  //错误,没有给第二个形参传值,即使第二个形参有默认参数也不能绕过他而给第三个参数传值 echo test(3,4);//错误,没有给第三个参数传值 总结:函数中的形参带默认

【足迹C++primer】14、函数匹配、函数指针

LinJM   2014_05_23 解决内存泄漏问题 在VS2010的Debug模式下面,点击运行,然后退出,之后会在输出框里面出现内存泄漏信息(如下图所示). Analysis:主要是new了之后没有delete相应的变量,所以,很明显就是要在不使用时delete掉这个变量.不过,有个问题,如下图所示: 我代码修改位置如下所示: 我把红下划线部分注释掉就不会出现上面那个问题,后来讨论分析才发现pBim现在分配给了pAdjustmentLyInfo,二者现在指向同一个内存空间,当我delete