/*ca69a.cpp_c++_函数匹配(重载确定)
#重载确定的三个步骤
1.候选函数
2.选择可行函数
3.寻找最佳匹配(如果有的话)
#含有多个形参的重载确定

void f1();
void f1(int);
void f1(int,int);
void f1(double,double = 3.14);
f1(5,6) //调用void f1(double,double)

 一、确定候选函数和可行函数

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

  候选函数特征:

  1、与被调函数的函数同名

  2、其声明在调用点可见

  在上面的例子中,有4个名为f的候选函数。第二步考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数成为可行函数,可行函数特征:

  1、形参数量与本次调用提供的实参数量相等,而是每个实参的类型与对应的形参类型相同,或者能够转化为形参的类型。

  2、每个实参的类型与对应的形参类型相同,或者可以转换成形参的类型。

  我们能根据实参的数量从候选函数中排除掉两个,无参数和两个int类型参数都不行,而一个int和默认值的两个double类型都是可行的。

  二、寻找最佳匹配

  函数匹配的第三步是从可行函数中选择与本次调用最匹配的函数。在这一过程中,逐一检查函数调用提供的实参。

  如果有多个可行函数,那么编译器依次检查每个实参以确定哪个函数是最佳匹配。如果有且只有一个函数满足下列条件,则匹配成功:

  · 该函数每个实参的匹配都不劣于其他可行函数需要的匹配

  · 至少有一个实参的匹配优于其他可行函数提供的匹配

  若无函数脱颖而出,编译器会报错,认为此为二义性调用。

  三、实参类型转换

  1、精确匹配,包括以下情况:

  · 实参类型和形参类型相同

  · 实参从数组类型或函数类型转换成对应的指针类型

  · 向实参添加顶层const或者从实参中删除顶层const

  2、通过const转换成实现的匹配

  如果重载函数的区别在于它们引用类型的形参是否引用了const,或者指针类型的形参是否指向const,则当调用发生时编译器通过实参是否为常量来决定哪个函数

txwtech
*/

 /*ca69a.cpp_c++_函数匹配(重载确定)
#重载确定的三个步骤
1.候选函数
2.选择可行函数
3.寻找最佳匹配(如果有的话)
#含有多个形参的重载确定 void f1();
void f1(int);
void f1(int,int);
void f1(double,double = 3.14);
f1(5,6) //调用void f1(double,double)  一、确定候选函数和可行函数   函数匹配的第一步是选择本次调用对应的重载函数集,集合中的函数成为候选函数。   候选函数特征:   1、与被调函数的函数同名   2、其声明在调用点可见   在上面的例子中,有4个名为f的候选函数。第二步考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的函数成为可行函数,可行函数特征:   1、形参数量与本次调用提供的实参数量相等,而是每个实参的类型与对应的形参类型相同,或者能够转化为形参的类型。   2、每个实参的类型与对应的形参类型相同,或者可以转换成形参的类型。   我们能根据实参的数量从候选函数中排除掉两个,无参数和两个int类型参数都不行,而一个int和默认值的两个double类型都是可行的。   二、寻找最佳匹配   函数匹配的第三步是从可行函数中选择与本次调用最匹配的函数。在这一过程中,逐一检查函数调用提供的实参。   如果有多个可行函数,那么编译器依次检查每个实参以确定哪个函数是最佳匹配。如果有且只有一个函数满足下列条件,则匹配成功:   · 该函数每个实参的匹配都不劣于其他可行函数需要的匹配   · 至少有一个实参的匹配优于其他可行函数提供的匹配   若无函数脱颖而出,编译器会报错,认为此为二义性调用。   三、实参类型转换   1、精确匹配,包括以下情况:   · 实参类型和形参类型相同   · 实参从数组类型或函数类型转换成对应的指针类型   · 向实参添加顶层const或者从实参中删除顶层const   2、通过const转换成实现的匹配   如果重载函数的区别在于它们引用类型的形参是否引用了const,或者指针类型的形参是否指向const,则当调用发生时编译器通过实参是否为常量来决定哪个函数 txwtech
*/
#include <iostream>
using namespace std; void f()
{
cout << "f()被调用" << endl;
}
void f(int a)
{
cout << "f(a)被调用" << endl;
}
void f(int a, int b)
{
cout << "f(int a, int b)被调用" << endl;
}
void f(double a, double b=3.14)
{
cout << "f(double a, double b=3.14)被调用" << endl;
}
void g(int a)
{
cout << " g(int a)被调用" << endl;
} int main()
{
f();
f(5.6);//二个可行函数。f(int a),//f(double a, double b=3.14)是最佳匹配
//f(42,2.56); //找不到合适参数进行匹配,存在二义性
//f(2.56,88);//找不到合适参数进行匹配,存在二义性 f(static_cast<double>(), 5.56);//c++风格,static_cast强制类型转换,42转double
f((double),5.56);//c风格写法强制类型转换
f(12.1,5.6);
f(, static_cast<int>(5.66));//c++风格,static_cast强制类型转换,5.66转int
f(,); return ;
}

ca69a.cpp_c++_函数匹配(重载确定)的更多相关文章

  1. 004_linuxC++之_函数的重载

    (一)源码下载 (一) 函数的重载:同一个命名函数,通过传入参数的不同,调用不一样的函数 上面程序的运行结果: (二)函数只能通过参数的不一样重载函数,不能通过返回参数的不一样重载函数 运行结果报错 ...

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

    Case void f(); void f(int); void f(int, int); void f(double, double = 3.14); 匹配原则: 1)其形参数量与本次调用提供的实参 ...

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

    <C++ Primer>笔记,整理关于函数重载与函数匹配的笔记. 函数重载 void func(int a); //原函数 void func(double a); //正确:形参类型不同 ...

  4. Oracle学习总结_day03_day04_条件查询_排序_函数_子查询

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! day03_条件查询_排序_函数 清空回收站: PUR ...

  5. 在 lua 中实现函数的重载

    在 lua 中实现函数的重载.注:好吧,lua中原来可以实现重载...local function create() local arg_table = {} local function dispa ...

  6. C++类成员函数的 重载、覆盖和隐藏区别

    重载:成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. #include <iostream> u ...

  7. javascript函数没有重载测试

    今天继续学习javascript系列教程,虽然是基础,但我觉得还是有必要用心来学习的,不要怕难,不用怕忘记,不要怕学不会.哪个高手不是从零开始的,我要坚定自己的学习信心,并且认真的走下去.虽然路途艰辛 ...

  8. C++基础学习笔记----第四课(函数的重载、C和C++的相互调用)

    本节主要讲了函数重载的主要概念以及使用方法,还有C和C++的相互调用的准则和具体的工程中的使用技巧. 函数重载 1.基本概念 函数重载就是用同一个函数名来定义不同的函数.使用不同的函数参数来搭配同一个 ...

  9. 理解javascript函数的重载

        javascript其实是不支持重载的,这篇文章会和java语言函数的重载对比来加深对javascript函数重载的理解.       以下我会假设读者不了解什么是重载所以会有一些很基础的概念 ...

随机推荐

  1. HashMap集合嵌套集合方法四种

    Map<String, HashMap<Person, String>> m=new HashMap<String, HashMap<Person, String& ...

  2. centos 7 vscode cmake 编译c++工程

    一.环境说明 1)gcc/g++  cmake安装建议 gcc/g++内核自带的即可,如果需要新的自行安装, cmake也一样,如有需要新的版本自行安装. 2)vscode安装插件 必要的插件c/c+ ...

  3. Unity自定义Log

    有如下两种方式,第一种借助了Unity自身的LogType枚举型:第二种则是纯粹地自己定义: public class Log { public Log(string message, UnityEn ...

  4. 一、【python】机器学习基础

    专有名词 机器学习 (machine learning) 预测分析 (predictive analytics) 统计学习 (statistical learning) 监督学习 (supervise ...

  5. hdl - 软件编程与硬件建模

    https://mp.weixin.qq.com/s/Y75I9e3s4fDPZuv-CyiNDA   介绍软件编程思维与硬件建模思维的不同与相似之处.   ​​   1. 软件编程思维   编程,意 ...

  6. Attribute (XXX) is obsolete. Its use is discouraged in HTML5 documents.

    这种警告主要是因为这些属性在HTML5中过时了,并不影响代码运行,但是一些强迫症就会非常难受. 解决办法: 将程序的顶部的这句: !DOCTYPE 修改为: !DOCTYPE html PUBLIC ...

  7. (Java实现) 洛谷 P1042 乒乓球

    题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中1111分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役.华华就是其中一位,他 ...

  8. Java实现 LeetCode 592 分数加减运算(纯体力活)

    592. 分数加减运算 给定一个表示分数加减运算表达式的字符串,你需要返回一个字符串形式的计算结果. 这个结果应该是不可约分的分数,即最简分数. 如果最终结果是一个整数,例如 2,你需要将它转换成分数 ...

  9. Java实现 LeetCode 299 猜数字游戏

    299. 猜数字游戏 你正在和你的朋友玩 猜数字(Bulls and Cows)游戏:你写下一个数字让你的朋友猜.每次他猜测后,你给他一个提示,告诉他有多少位数字和确切位置都猜对了(称为"B ...

  10. java实现欧拉与鸡蛋

    ** 欧拉与鸡蛋** 大数学家欧拉在集市上遇到了本村的两个农妇,每人跨着个空篮子.她们和欧拉打招呼说两人刚刚卖完了所有的鸡蛋. 欧拉随便问:"卖了多少鸡蛋呢?" 不料一个说:&qu ...