/*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. Layui 改变数据表格样式覆盖

    改变表格行高.layui-table-cell{ height:40px; line-height: 36px; } 改变复选框高宽和定位等等.layui-table-view .layui-form ...

  2. 特效 css3 渐变背景框

    .box{ 子级 position: relative; width: 300px; height: 400px; display: flex; justify-content: center; al ...

  3. Python的多线程锁跟队列

    一.互斥锁: 1.线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁. 2.互斥锁为资源引入一个状态:锁定.非锁定 3.某个线程要更改共享数据是,先将其锁定.此时资源的状态为锁定, ...

  4. MANIFEST.MF是个什么?

    MANIFEST.MF是个什么? 写这篇文件主要记录JRA文件里面到底是什么?然后MANIFEST.MF又是什么?Springboot 如何只有Main方法就可以运行的? Springboot项目打包 ...

  5. hackone ssrf

    alyssa_herrera submitted a report to U.S. Dept Of Defense. Jan 29th (2 years ago) Summary:A server s ...

  6. xxshenqi分析报告

    背景 今年七夕爆发了一场大规模手机病毒传播,apk的名字叫做xxshenqi.中了这个病毒的用户会群发手机所有联系人一条信息,内容是包含这个apk下载的链接,同时用户的联系人信息和短信会被窃取,造成隐 ...

  7. keras常见问题

    问题:AttributeError: 'CRF' object has no attribute '_outbound_nodes' 解答:这个一般情况下是keras版本的问题,将其改为keras== ...

  8. .NET编程5月小结 - Blazor, Unity, Dependency Injection

    本文是我在5月份看到的一些有趣的内容的集合.在这里你可以找到许多有关Blazor.ASPNET Core的学习资源和示例项目,有关在Unity中使用Zenject进行单元测试的博客,有关Unity项目 ...

  9. Java实现 LeetCode 720 词典中最长的单词(字典树)

    720. 词典中最长的单词 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最 ...

  10. Java实现 LeetCode 476 数字的补数

    476. 数字的补数 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 示例 1: 输入: 5 输出: 2 解释: 5 的二进制表示为 101(没有前导零位),其补数为 010.所以你需要 ...