c++函数特性一览

函数是代码快的集合,是编程语言里面不可缺少的部分,使用函数可以实现对数据和操作较好的封装,实现灵活的拓展和维护,使得读者更容易理解代码。笔者有过一定的c语言函数基础,故而在此只讨论有关c++函数的一些特性。


重载:c++里面函数的一个重要特性便是函数重载,程序员可以定义多个名字相同但是形参列表不同的函数,在函数调用时,编译器会根据传入实参列表的形式选择正确的函数执行,这样一定程度上可以减轻程序员命名的负担,也使得函数调用更为简便。


重载函数要求形参列表各异,或参数数量不同,或参数类型不同,但是有一个例外,非常量的对象可以用来初始化常量对象,若函数定义的形参列表中有参数是const对象,那么调用函数时可以传入const对象,也可以传入非const对象(针对顶层const而言)。当传入非const对象时,如果既有接受const对象版本的函数,也有接收非const对象的函数,那么优先调用接受非const对象的函数。使用const_cast进行非const对象与const对象之间的显式类型转换可以协助我们进行函数重载。


调用重载函数的过程称为函数匹配,也叫函数确定,编译器根据函数调用者传入的实参与一组重载函数的某一个相关联。最理想的情况编译器找到一个形参数量和类型都完全匹配的函数执行。最坏的情况编译器找不到任何匹配的函数,另外一种情况是找到不只一个可以匹配但是不是最佳选择的函数,这两种情况都会引发错误,前者为无匹配错误,后者为二义性错误


函数重载有作用域的差别,如果在局部作用域内声明了与全局作用域同名的函数,那么编译器在查找函数时会忽略掉全局函数,只检查局部函数。所以尽量避免将函数声明在局部作用域内。


函数的一些特殊特性:
默认实参:函数允许形参列表中的参数具有默认值,就像定义变量的初始值那样进行初始化,但是必须保证具有默认值的参数的右边的所有参数必须具有默认值,可以不给具有默认值的参数传递实参。函数被调用时,编译器根据函数调用者传递的实参数量决定是采用默认值初始化形参,还是采用函数调用者传递的实参初始化形参。函数形参的默认值可以是常量表达式,也可以是函数作用域之外的变量或者有正确返回值的函数调用。


内联函数:在函数返回值类型前加上inline,那么函数就被声明为内联函数,编译器在碰见内联函数的调用时,会将函数在调用处展开,所以实际上调用内联函数并没有进行函数调用的操作,只是将代码换了一个位置,这样可以避免重复的函数调用带来的开销,一般将短小、精简、重复调用的函数声明为内联函数。


constexpr函数:能用于常量表达式的定义,函数的返回值以及形参的类型必须是字面值类型,函数体中有且只能有一条return语句。constexpr函数隐式的被声明为内联函数。


内联函数和constexpr函数可以多次定义,但定义必须准确一致,所以一般放在头文件中。


函数匹配:当有多个同名函数时,编译器根据形参列表与传入的实参情况选择最佳匹配函数。首先编一起找到对应本次调用的重载函数集,即所有在调用点可见的同名函数,称为候选函数。然后考察本次调用的实参,从候选函数里面选出能与本次调用所传入的实参匹配的函数,称为可行函数。然后从可行函数里面选择一个最佳函数,即参数匹配情况最好的函数,执行函数调用。


函数指针:函数指针指向某种特定类型,函数的类型由返回值和参数列表决定,与函数名无关。函数指针可以指向一个函数,也可以不指向任何函数,即为空。以下是一个函数指针定义的例子:

bool (*fp)(int,int);//定义一个函数指针fd,指向有两个整型参数返回值为bool型的函数

可以直接把函数名赋值给函数指针,此时编译器会将函数名转换为函数指针:fp=f(f为有两个整型参数返回值为bool型的函数),也可以使用取址运算符:fp=&f

调用函数时,可以直接使用函数名,也可以直接使用函数指针,也可以使用函数指针解引用。

注:函数指针不存在转换规则,函数指针必须与函数精确匹配,特别是在指向重载函数时,必须与参数列表和返回值类型精确匹配

当用函数指针作为形参时,函数名和函数指针的效果一样,编译器会将函数名转换为函数指针。

但是当用函数指针作为返回值时,不能直接返回函数名,必须显式地返回函数指针。推荐使用类型别名、auto与decltype关键字和尾置返回类型。


函数指针简化了函数调用的情况,并且使得一个函数可以作为另外一个函数的形参被使用,这样有利于增强程序的可维护性、可拓展性以及可重用性。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值