C++函数参数匹配规则

这篇具有很好参考价值的文章主要介绍了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
优先级: 精确匹配的参数个数越多优先级越高,参数个数相同优先级相同,如果存在多个最高优先级的函数,则报参数模糊错误。

参数类型转换

优先级:

  1. 精确匹配:包括类型相同, 数组和参数名转换为指针,忽略顶层const
  2. const 转换 (把非const实参传给const形参)
  3. promotion数据提升,如int->long, char->unsigned等
  4. 算术转换或者指针类型转换
  5. 类类型(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;
}

另外,文章来源地址https://www.toymoban.com/news/detail-653772.html

void f(int);
void f(int &);

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

到了这里,关于C++函数参数匹配规则的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【图文结合c++】一篇文章解析c++默认函数规则,带你深度学习构造函数

    前言 : 类和对象 是面向对象语言的重要概念。 c++身为一门 既面向过程,又面向对象 的语言。 想要学习c++, 首先同样要先了解类和对象。 本节就类和对象的几种构造函数相关内容进行深入的解析。 目录 类和对象的基本概念 封装 类域和类体 访问限定符 private public protec

    2024年03月14日
    浏览(53)
  • C++ Primer 6.5 特殊用途语言特性 6.6 函数匹配 知识点+练习题

    在给定的作用域中一个形参只能被赋予一次默认实参 局部变量不能作为默认实参,函数结束就销毁,无法当作默认实参。 除此之外,只要表达式的类型可转换成形参所需要的类型,则可以作为默认实参 将函数定义为内联函数,即加上inline,在编译时内联展开代替函数 在编译

    2024年01月22日
    浏览(46)
  • 【C++漂流记】函数的高级应用——函数默认参数、占位参数、重载

    函数的高级应用,侧重介绍函数的默认参数、函数的占位参数、函数重载定义解释及使用。 函数默认参数是指在函数声明时为参数提供一个默认值,这样在调用函数时如果没有传入相应的参数,就会使用默认值代替。函数默认参数可以简化函数的调用,使得函数更加灵活。

    2024年02月09日
    浏览(37)
  • C++入门:函数缺省参数与函数重载

    目录 1.函数缺省参数 1.1 缺省参数概念 1.2 缺省参数分类 2.函数重载 2.1 函数重载概念 2.2 C++支持函数重载的原理 缺省参数是 声明或定义函数时 为函数的 参数指定一个缺省值 。在调用该函数时,如果没有指定实 参则采用该形参的缺省值,否则使用指定的实参,有点备胎的意

    2024年02月12日
    浏览(33)
  • 【C++初阶】C++入门——缺省参数、函数重载

     缺省参数是 声明或定义函数时为函数的参数指定一个缺省值 。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。  上面代码在 fun 函数的形参部分给了缺省值10,这意味着在调用 fun 函数的时候可以传参,也可以不传参,如果传参了那形参

    2024年02月11日
    浏览(37)
  • 【C++】C++ 引用详解 ① ( 变量的本质 - 引入 “ 引用 “ 概念 | 引用语法简介 | 引用做函数参数 | 复杂类型引用做函数参数 )

    \\\" 引用 \\\" 语法 是 C++ 语言中 特有的 , 在 C 语言中是没有 引用 这个概念的 ; 分析 引用 之前 , 先回顾下 变量 : 在 【C 语言】变量本质 ( 变量概念 | 变量本质 - 内存空间别名 | 变量存储位置 - 代码区 | 变量三要素 ) 博客中 , 介绍了变量的本质 : 变量 的本质是 内存空间 的 \\\" 别名

    2024年02月11日
    浏览(49)
  • C++:命名空间,缺省参数,函数重载,引用,内联函数

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C++》 本篇博客作为C++知识总结,我们来认识命名空间,缺省参数,函数重载,引用,内联函数。 那么在介绍命名空间时,我们先用C++的方式打印\\\"hello world\\\"。 其中,using namespace std; 就是一种命名空间的使用。 在

    2024年02月11日
    浏览(46)
  • 【C++】缺省参数与函数重载

    👀樊梓慕: 个人主页  🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C++》 🌝 每一个不曾起舞的日子,都是对生命的辜负 本篇文章博主将带你学习 缺省参数 与 函数重载 ,一些需要注意的点博主都会特别标注以便大家学习。 欢

    2024年02月08日
    浏览(34)
  • 【C++】入门 --- 缺省参数&函数重载

    缺省参数是声明或定义函数时 为函数的参数指定一个缺省值 。 在调用该函数时, 如果没有指定实参则采用该形参的缺省值 ,否则使用指定的实参。 🌰举个栗子👇 🚨 注意: 缺省值(函数形参的默认值)不能同时在函数声明和函数定义中给出(缺省参数不能在函数声明和定义

    2024年02月15日
    浏览(35)
  • c++函数参数和返回值

    c++函数参数和返回值 函数存储位置 函数参数入栈顺序 初始化列表 函数的返回值 用参数引用来返回 返回一个参数指针 返回一个对象 总结 函数的几种变体 inline 函数 函数对象 lambda 函数 c++一直以来是一个关注效率的代码,这样关于函数的参数传递和返回值的接收,是重中之

    2024年02月05日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包