甘肃手机版建站系统哪个好,做视频网站用什么模板,首页面设计的步骤,潍坊网站制作建设本篇将介绍C函数重载的概念#xff0c;及重载决议规则。 一、函数重载
同一作用域内#xff0c;函数名相同#xff0c;而形参列表不同的函数称之为重载函数(overloaded function)。
需要特别注意#xff1a;以下情况看似形参列表不同#xff0c;实则等价#xff0c;无法… 本篇将介绍C函数重载的概念及重载决议规则。 一、函数重载
同一作用域内函数名相同而形参列表不同的函数称之为重载函数(overloaded function)。
需要特别注意以下情况看似形参列表不同实则等价无法形成函数重载。
// 1. 声明中有无形参名无法形成重载
void test1(int arg);
void test1(int ); // 二者等价// 2. 类型别名无法形成重载
using count int;
void test2(int );
void test2(count); // 二者等价// 3. 顶层const无法形成重载
void test3(const int);
void test3(int); // 二者等价void test3_(int *const);
void test3_(int *); // 二者等价// √ 底层const就可以形成重载
void test4(const int);
void test4(int ); // 有效重载void test4(const int*);
void test4(int *); // 有效重载此外函数重载必须发生在同一作用域内。内部作用域中的函数会覆盖外部同名函数的名字在下面的重载决议步骤中可以看到名字被覆盖将直接导致外部函数重载失效。
二、重载决议
对于一个函数调用而言如果该函数名对应了一组重载函数则根据实参将函数调用与某一个重载函数绑定起来这一过程称之为函数匹配(function matching)也叫做重载决议(function resolution)。
重载决议的过程可以划分为以下三步前两步的失败会导致无匹配错误(no matching)最后一步的失败会导致二义性调用(ambiguous call)错误。
第一步确定候选函数
满足下列条件称之为候选函数candidate function
与被调用函数同名声明在调用点可见
第二步确定可行函数
满足下列条件称之为可行函数viable function
形参与提供实参的数量相等每个实参的类型与形参类型对应匹配
第三步寻找最佳匹配
与实参类型最匹配的那个可行函数称之为最佳匹配。
其基本思想是实参类型与形参类型越接近匹配的越好。最佳匹配函数需要满足以下两条要求
该函数每个实参的匹配都不劣于其他可行函数需要的匹配至少有一个实参的匹配优于其他函数提供的匹配
如果可行函数中没有选项能够满足上述两个条件则该函数调用将被判定为二义性调用并引发编译器报错。
实参类型转换下的匹配优先级划分
在第三步中为了确定最佳匹配下列规则中越靠前的情况则当前参数的匹配优先度越高。即第三步中所描述的匹配的优劣。
精确匹配 实参与形参类型相同、实参从数组类型或函数类型转换为相应类型的指针向实参添加或删除顶层const const转换实现的匹配关于和精确匹配第三条的不同点在最后赘述类型提升实现的匹配算术类型转换或指针转换实现的匹配类类型转换实现的匹配
向实参添加或删除顶层const与const转换实现的匹配这两种情况的不同之处
前者指的是形参与实参顶层const类型不同。
void test(const int);const int i 1;
int j 2;
test(i);
test(j); // 都是精确匹配而后者指的是形参具备底层const实参不具备底层const。此时实参将会被加上const限定。这种情况的优先级逊于精确匹配。
void test(const int);
void test(int );const int i 1;
int j 2;
test(5); // 字面值会匹配到test(const int)
test(i); // 会匹配到test(const int)
test(j); // 会匹配到test(int )