重载函数的调用匹配规则

重载函数的调用匹配,依次按照下列规则来判断:

精确匹配:参数匹配而不做转换,或者只是做微不足道的转换,如数组名到指针、函数名到指向函数的指针、T到const T;

提升匹配:即整数提升(如bool到int、char到int、short到int),float到double;

使用标准转换匹配:如int到double、double到int、double到long double、Derived*到Base*、T*到void*、int到unsigned int;

使用用户自定义匹配;

使用省略号匹配:类似于printf中省略号参数。

假如运行环境int类型4bytes,short类型2bytes,long类型8bytes,存在代码:
    unsigned short x = 65530;
    int a = myfunc( x, 20.0 );
会优先匹配以下哪一个重载函数?
A. int myfunc( double, double )
B. int myfunc( short, double )
C. double myfunc( int, float )
D. double myfunc( int, double)

答案为D!

时间: 2024-08-08 09:37:58

重载函数的调用匹配规则的相关文章

重载函数的参数匹配与转换

重载函数匹配步骤: (1)候选函数的确定:与被调函数同名的函数 (2)选择可行函数:在候选函数中,选择可以调用的函数:1)参数个数与被调函数参数个数相等:2)实参类型与形参类型匹配或者可以隐式类型转换: (3)选择最佳匹配: ① 其每个实参匹配都不劣于其他可行函数需要的匹配 ② 至少有一个实参的匹配优于其他可行函数的匹配. (4)如果没有存在多个最佳匹配,匹配就有二义性: 实参匹配与转换: (1)实参类型转换的优先降序等级:精确匹配> 整型提升> 标准转换> 类类型转换: (2)没有一个

错误 2 error C2668: “sqrt”: 对重载函数的调用不明确

原出错代码:#include "stdio.h" #include "math.h" void main() { int i=1,m,k=1; printf("请输入数字:"); scanf("%d",&m); k=sqrt(m); for(;i<k;i++) { if(m%k==0) break; } if(i>k) { printf("是素数"); } else { printf(&

虚函数与重载函数的区别

1 重载函数要求函数具有相同的返回值类型和函数名称,并具有不同的参数序列,而虚函数则要求这三项(函数名,返回值类型,参数序列)完全相同 2 重载函数可以是成员函数或友元函数 而虚函数只能是成员函数 3 重载函数的调用是以传递参数序列的差别作为调用不同函数的依据,而虚函数根据对象的不同的调用不同类的虚函数 4 虚函数在运行期间表现出多态功能,这是c++的精髓,而重载函数则在编译时表现出多态 一般来讲,虚函数是一种特殊的重载,即必须被重载的函数,一般函数可以不被重载.一个函数被声明为虚函数,目的就是

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

函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) http://blog.csdn.net/kaiwii/article/details/8500686

函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) 2013-01-14 13:51 1548人阅读 评论(0) 收藏 举报  分类: android底层(14)  c&c++(18)  Linux下如何指定调用约定(calling convention) Windows下的调用约定可以是stdcall/cdecl/fastcall,这些标识加在函数名前面,如: int __stdcall funca() 但在Linux下,如按照上面写法后,编译程序将导

c++之普通函数和模板函数的调用规则

1.如果模板函数和普通函数都可以实现,则优先调用普通函数. 2.可以通过空模板参数列表来强制调用模板函数: 3.函数模板也可以重载: 4.如果函数模板可以产生更好的匹配,优先调用函数模板: #include<iostream> using namespace std; int myAdd(int a, int b) { cout << "调用普通函数" << endl; return a + b; } template<class T>

驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)

中断处理程序.中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)http://blog.csdn.net/samantha_sun/article/details/6790492 1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有进程的概念,因此就没有休眠的概念: 2,中断处理程序中的延时可以用忙等待函数来代替,如ndelay,udelay,mdelay等,这些函数在实现上本质是根据CPU频率进行一定 次数的

C++编译时函数名修饰约定规则(很具体),MFC提供的宏,extern &quot;C&quot;的作用

调用约定: __cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法. 1.__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈, 2._cdecl是C和C++程序的缺省调用方式.每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大.函数采用

[email&#160;protected]重载函数

关于重载详细分析参考: http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html 内部机制涉及重载函数如何解决命名冲突,调用匹配的问题. 分辨重载的准则: 精确匹配:参数匹配而不做转换,或者只是做微不足道的转换,如数组名到指针.函数名到指向函数的指针.T到const T: 提升匹配:即整数提升(如bool 到 int.char到int.short 到int),float到double 使用标准转换匹配:如int 到double.d