C++中函数匹配机制详解

首先,编译器会确定候选函数然后确定可行函数可行函数,再从可行函数中进一步挑选

候选函数:重载函数集中的函数

可行函数:可以调用的函数

最后进行寻找最佳匹配

有以下几种规则

1.该函数的每个实参的匹配都不劣于其他可行函数

2.至少有一个实参的匹配优于其他可行函数的匹配

3.满足上面两种要求的函数有且只有一个

如果上面三个要求都没满足,则出现二义性

一些演示

各有一个精确匹配的实参,编译器报错,不满足条件3

error

void func(int a,int b)
{
    cout << "(int,int)" << endl;
}
void func(double a, double b = 3.14)
{
    cout <<"(double,double = 3.14)" << endl;
}
int main()
{
    func(2.3,5);
}

调用函数类型转换优先级,依次递减

1.精确匹配

包含三种

(1)实参形参类型匹配

(2)从数组或者函数转到对应的指针

(3)添加或者删除顶层const

2.通过const转换实现匹配

3.通过类型提升匹配

4.通过算术类型转换或者指针转换的匹配

5.通过类 类型转换实现的匹配

小整形一般提升为int或者long,即便他的面量很小

void func(int a)
{
    cout << "(int)" << endl;
}
void func(short a)
{
    cout << "(short)" << endl;
}
int main()
{
    func(12);
    func('a');
}

运行结果

所有算数类型级别转换都一样

error

void func(double a)
{
    cout << "(double)" << endl;
}
void func(float a)
{
    cout << "(float)" << endl;
}
int main()
{
    func(3.14);
}

不能重载const 和非const两个版本,但是引用可以

关于引用:非const可以升级为const,但是const不能降级为非const

若有两种版本——const and not const,会根据传入的参数自动匹配

void func(const int &a)
{
    cout << "(const int&)" << endl;
}
void func(int &a)
{
    cout << "(int&)" << endl;
}
int main()
{
    const int a = 3;
    int b = 4;
    func(a);
    func(b);
    func(5);
}

运行结果

指针的情况于引用类似:

如果两个函数唯一的区别是他们指向的对象是常量或非常量,则编译器根据实参选择函数。

演示

void func(const int *a)
{
    cout << "(const int *)" << endl;
}
void func(int *)
{
    cout << "(int *)" << endl;
}

int main()
{
    int a = 3;
    int *pa = &a;
    const int *c_pa = &a;
    const int b = 4;
    const int *pb = &b;
    func(pa);
    func(c_pa);
    func(pb);
}

运行结果

上面提到过的一些重载

using namespace std;

void func(int a)
{
    cout << "(int)" << endl;
}
void func(double a)
{
    cout << "(double)" << endl;
}
void func(int a,int b)
{
    cout << "(int,int)" << endl;
}
void func(double a, double b = 3.14)
{
    cout <<"(double,double = 3.14)" << endl;
}
void func(short a)
{
    cout << "(short)" << endl;
}
void func(float a)
{
    cout << "(float)" << endl;
}
void func(const int &a)
{
    cout << "(const int&)" << endl;
}
void func(int &a)
{
    cout << "(int&)" << endl;
}
void func(const int *a)
{
    cout << "(const int *)" << endl;
}
void func(int *)
{
    cout << "(int *)" << endl;
}

到此这篇关于C++中函数匹配机制详解的文章就介绍到这了,更多相关C++函数匹配内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++深入学习之彻底理清重载函数匹配

    前言 前面我们讲到了<函数重载>,有了函数重载之后,就需要确定某次调用需要选用哪个函数.这个过程可以称之为函数匹配或者重载确定.大多数情况下,我们都很容易能够确定某次调用需要选用哪个函数,但事实上不尽然.但通过本文将彻底理清重载函数匹配 匹配过程 为便于说明,将函数匹配分为三个阶段,确定候选函数,确定可行函数,确定最佳匹配函数. 确定候选函数 候选函数也就是和被调用的函数同名,并且其声明在调用点可见.举个简单的例子. 假设有两个文件,1.cpp和2.cpp,内容分别如下: 1.cpp: //函

  • C++中函数匹配机制详解

    首先,编译器会确定候选函数然后确定可行函数可行函数,再从可行函数中进一步挑选 候选函数:重载函数集中的函数 可行函数:可以调用的函数 最后进行寻找最佳匹配 有以下几种规则 1.该函数的每个实参的匹配都不劣于其他可行函数 2.至少有一个实参的匹配优于其他可行函数的匹配 3.满足上面两种要求的函数有且只有一个 如果上面三个要求都没满足,则出现二义性 一些演示 各有一个精确匹配的实参,编译器报错,不满足条件3 error void func(int a,int b) { cout << "

  • C/C++函数参数传递机制详解及实例

    C/C++函数参数传递机制详解及实例 概要: C/C++的基本参数传递机制有两种:值传递和引用传递,我们分别来看一下这两种的区别. (1)值传递过程中,需在堆栈中开辟内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本.值传递的特点是被调函数对形参的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值. (2)引用传递过程中,被调函数的形参虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址.被调函数对形参的任何操作都被处理成间接寻址,

  • Java中的反射机制详解

    Java中的反射机制详解 反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧! 一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 看概念很晕的,继续往下

  • C++中函数重载实例详解

    C++中函数重载实例详解 函数重载: 1.具有相同的名称,执行基本相同的操作,但是使用不同的参数列表. 2.函数具有多态性. 3.编译器通过调用时参数的个数和类型确定调用重载函数的哪个定义. 4.只有对不同的数据集完成基本相同任务的函数才应重载. 函数重载的优 点 1.不必使用不同的函数名 2.有助于理解和调试代码 3.易于维护代码 接下来直接上代码: #include <iostream> using namespace std ; void say_hello(void) { cout &

  • MySQL数据库8——数据库中函数的应用详解

    数据库中内置函数的使用 该篇主要介绍数据库中内置函数的使用,主要有日期函数,字符串函数,数学函数. (一)日期函数 select current_date();//获得当前日期,年月日 select current_time();//获得当前时间,时分秒 select current_timestamp();//获得当前 年月日 时分秒 select date('2017-10-28');//获得参数日期 select date_add('2017-10-28', interval 10 day

  • Android中的binder机制详解

    前言 Binder做为Android中核心机制,对于理解Android系统是必不可少的,关于binder的文章也有很多,但是每次看总感觉看的不是很懂,到底什么才是binder机制?为什么要使用binder机制?binder机制又是怎样运行的呢?这些问题只是了解binder机制是不够的,需要从Android的整体系统出发来分析,在我找了很多资料后,真正的弄懂了binder机制,相信看完这篇文章大家也可以弄懂binder机制. 1.Binder是什么? 要理解binder,先要知道IPC,Inter

  • C++中的异常处理机制详解

    异常处理 增强错误恢复能力是提高代码健壮性的最有力的途径之一,C语言中采用的错误处理方法被认为是紧耦合的,函数的使用者必须在非常靠近函数调用的地方编写错误处理代码,这样会使得其变得笨拙和难以使用.C++中引入了异常处理机制,这是C++的主要特征之一,是考虑问题和处理错误的一种更好的方式.使用错误处理可以带来一些优点,如下: 错误处理代码的编写不再冗长乏味,并且不再和正常的代码混合在一起,程序员只需要编写希望产生的代码,然后在后面某个单独的区段里编写处理错误的嗲吗.多次调用同一个函数,则只需要某个

  • C++中的RAII机制详解

    前言 在写C++设计模式--单例模式的时候,在写到实例销毁时,设计的GC类是很巧妙的,而这一巧妙的设计就是根据当对象的生命周期结束时会自动调用其析构函数的,而这一巧妙的设计也是有专业的名词的--RAII.那以下将围绕RAII,全面的讲解RAII的相关知识. 什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源.避免泄漏的惯用法.利用的就是C++构造的对象最终会被销毁的原则.RAII的做法是使用一个对象,在其构造

  • Android中NestedScrolling滑动机制详解

    1,如今NestedScrolling运用到很多地方了,要想好看一点的滑动变换,基本上就是使用这个来完成的,让我们来简单的了解一下. 2,NestedScrolling机制能够让父View和子View在滚动式进行配合,其基本流程如下: 当子view开始滚动之前,可以通知父View,让其先于自己进行滚动: 子View自己进行滚动: 子view滚动之后,还可以通知父view继续滚动. 而要实现这样的交互机制,首先父view要实现NestedScrollingParent接口,而子View需要实现N恩

  • python中函数传参详解

    一.参数传入规则 可变参数允许传入0个或任意个参数,在函数调用时自动组装成一个tuple: 关键字参数允许传入0个或任意个参数,在函数调用时自动组装成一个dict: 1. 传入可变参数: def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum 以上定义函数,使用如下: 传入多个参数, calc(1, 2, 3, 4) 30 #函数返回值 传入一个列表, nums = [1, 2, 3] calc(*nu

随机推荐