C++函数参数匹配规则示例小结

 更新时间:2023年08月18日 08:40:29   作者:yucongxing  
这篇文章主要介绍了C++函数参数匹配规则,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

C++ 函数参数匹配

1 单个参数匹配

void f(); //f1
void f(int); //f2
void f(int, int); //f3
void f(double, double=3.14);//f4
int main() {
    f(5.6); //调用f4
    return 0;
}

candidate functions:函数名称相同(f1, f2, f3, f4 都是)。
viable functions:参数个数相同(排除f1, f3),且参数可以转换成相同类型(f2, f4都是viable function)。如果不存在viable functions,则编译器报参数不匹配错误(可以通过linting检查)。 最后决定参数类型是否匹配,如果匹配优先调用,不能则选择可以隐式转换成类型相同的函数。

2 多个参数匹配

void f(); //f1
void f(int); //f2
void f(int, int); //f3
void f(double, double=3.14);//f4
int main() {
    f(42, 5.6); //报错,参数模糊 
    return 0;
}

condidate functions: f1, f2, f3, f4
viable functions: f3, f4
优先级: 精确匹配的参数个数越多优先级越高,参数个数相同优先级相同,如果存在多个最高优先级的函数,则报参数模糊错误。

参数类型转换

优先级:

  • 精确匹配:包括类型相同, 数组和参数名转换为指针,忽略顶层const
  • const 转换 (把非const实参传给const形参)
  • promotion数据提升,如int->long, char->unsigned等
  • 算术转换或者指针类型转换
  • 类类型(class-type)转换,如string->bool

Promotion and Arithmetic Conversion

void ff(int); //f1
void ff(short); //f2
void manip(long); //f3
void manip(float); //f4
int main() {
    ff('a'); //调用f1,char -> int是promotionO(比int短的数据类型统一promotion为int, 
             // char->short 是算术转换
    manip(3.14); //error: ambiguous call,3.14视为double,double->float和doule->long在优先级上是等价的 
    return 0;
}

const Arguments

忽略顶层const, 原因是传参的时候实际上进行的是copy过程,即copy一份实参给形参,copy会忽略顶层const

void f(int a);
void f(const int a);//报错,重复定义,两者只能定义一种
void f(int *a);
void f(int* const a);//报错,重复定义,两者只能定义一种

const 转换

void f(int &); //f1
void f(const int &);//f2
int main() {
    const int a{0};
    int b{0}; 
    f(a); //调用f2(精确匹配) 
    f(b); //调用f1(没有定义f1时,调用f2)
    return 0;
}

另外,

void f(int);
void f(int &);
int main() {
    int i = 0;
    f(i); //报错,ambiguous call
    return 0;
}

到此这篇关于C++函数参数匹配规则的文章就介绍到这了,更多相关C++函数参数匹配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现火车票管理系统

    C语言实现火车票管理系统

    这篇文章主要为大家详细介绍了C语言实现火车票管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++实现字符格式相互转换的示例代码

    C++实现字符格式相互转换的示例代码

    这篇文章主要为大家详细介绍了C++中实现字符格式相互转换的方法,主要有UTF8与string互转、wstring与string互转,感兴趣的小伙伴可以了解一下
    2022-11-11
  • C++实现LeetCode(12.整数转化成罗马数字)

    C++实现LeetCode(12.整数转化成罗马数字)

    这篇文章主要介绍了C++实现LeetCode(12.整数转化成罗马数字),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 详解C语言#define预处理宏定义

    详解C语言#define预处理宏定义

    本文主要介绍了C语言#define预处理宏定义,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 详解C/C++如何获取路径下所有文件及其子目录的文件名

    详解C/C++如何获取路径下所有文件及其子目录的文件名

    这篇文章主要为大家详细介绍了在C/C++中如何获取路径下所有文件及其子目录的文件名,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C语言实现学生考勤系统

    C语言实现学生考勤系统

    这篇文章主要为大家详细介绍了C语言实现学生考勤系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++入门之内存处理详解

    C++入门之内存处理详解

    这篇文章主要为大家介绍了C++入门之内存处理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • c语言++放在前面和后面的区别分析

    c语言++放在前面和后面的区别分析

    在C语言中,前缀自增(++i)和后缀自增(i++)操作符并不是同一个操作符,前缀自增操作符的优先级高于后缀自增,同时得到的结果并不完全一致,因此需要区分
    2015-11-11
  • C语言获得电脑的IP地址的小例子

    C语言获得电脑的IP地址的小例子

    C语言获得电脑的IP地址的小例子,需要的朋友可以参考一下
    2013-05-05
  • C++之const限定符详解

    C++之const限定符详解

    这篇文章主要为大家介绍了C++之const限定符,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12

最新评论