C++知识点9——函数重载,默认实参,内联函数
函数重载
同一作用域内,函数名相同但是形参列表不同的函数,为重载函数
下面两个函数就是重载函数,编译时会根据形参列表将这两个函数编译成不同的函数,在调用时传入对应的参数就可以调用不同的重载函数
void overloadfunc(int a[10], int len);
void overloadfunc(int *s, int *e);int main(int argc, char const *argv[])
{int a[6]={10,9,7};overloadfunc(a,5);overloadfunc(a, a+sizeof(a)/sizeof(int));return 0;
}void overloadfunc(int a[], int len)
{cout<<"overloadfunc(int a[], int len)"<<endl;
}void overloadfunc(int *s, int *e)
{cout<<"overloadfunc(int *s, int *e)"<<endl;
}
注意:如果两个函数的函数名相同,形参列表也相同,只是返回值不同,那么在调用该函数时会报错
void overloadfunc(int *s, int *e);
int overloadfunc(int *s, int *e);
所以函数是否重载与返回值无关,两个函数除了返回值不同,其余均相同时,编译时会报二义性错误
函数重载与const
拥有修饰形参本身的const的形参无法和一个没有const修饰的形参区分出来
int main(int argc, char const *argv[])
{int a=7;overloadfunc(a);return 0;
}void overloadfunc(int c)
{cout<<"overloadfunc(int c)"<<endl;}void overloadfunc(const int c)
{cout<<"overloadfunc(const int c)"<<endl;
}
当编译上述代码时,会提示函数重定义,因为当把a传入overloadfunc时,既能匹配void overloadfunc(int c),也能匹配void overloadfunc(const int c),因为const int和int都能用一个常量字面值初始化
编译器不知道要调用哪个函数,所以将这两个函数视为同一个,报重定义错误
如果const修饰的是形参所指向或者绑定的对象,而不是形参本身,那么就可以将重载函数区分出来
int main(int argc, char const *argv[])
{int a=7;overloadfunc(a);overloadfunc(7);return 0;
}void overloadfunc(int &c)
{cout<<"overloadfunc(int &c)"<<endl;
}void overloadfunc(const int &c)
{cout<<"overloadfunc(const int &c)"<<endl;
}
调用overloadfunc(a)时,会有限匹配overloadfunc(int &c),当传入一个常量值时,只有overloadfunc(const int &c)能接受该实参,所以匹配overloadfunc(const int &c)
所以,当const修饰的是形参所指向或绑定的对象,而不是形参本身时,将生成两个不同的函数
不要滥用重载函数
void overloadfunc(int c){}
void overloadfunc(const int &c){}
void overloadfunc(int &){}int main(int argc, char const *argv[])
{int a=7;overloadfunc(a);return 0;
}
上述代码定义的三个重载函数并且在主函数中调用重载函数overloadfunc,但是编译器无法判断到底要调用哪个重载函数(因为三个函数都可以接受a作为函数的实参),所以报函数歧义错误
默认实参
函数在声明或定义时,对函数的形参进行值初始化,而在调用时,可以对该形参重新初始化,也可以忽略对该形参初始化
void defaultpara(int a,int b=10);
void defaultpara(string str=" ");int main(int argc, char const *argv[])
{defaultpara(10);defaultpara(10,20);defaultpara();defaultpara("123");return 0;
}void defaultpara(int a, int b)
{cout<<"defaultpara(int a, int b)"<<endl;
}void defaultpara(string str)
{cout<<"defaultpara(string str)"<<endl;
}
调用函数时,如果想使用默认实参,就直接忽略对形参的初始化,否则,传入新的实参即可
默认实参只能在函数声明或者定义时进行添加,二者选其一,否则报错
内联函数
内联函数主要修饰用在短小,实现简单的函数,用inline修饰该函数
inline void defaultpara(string str=" ");
内联函数在调用点直接将函数展开,减少函数调用的次数和开销,从而让程序速度更快,所有在类的内部定义实现的函数都是内联函数
参考:
《C++ Primer》
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出
C++知识点9——函数重载,默认实参,内联函数相关推荐
- 【Kotlin】Kotlin 函数总结 ( 具名函数 | 匿名函数 | Lambda 表达式 | 闭包 | 内联函数 | 函数引用 )
文章目录 一.函数头声明 二.函数参数 1.默认参数值 2.具名参数 三.Unit 函数 四.TODO 函数抛出异常返回 Nothing 类型 五.反引号函数名 六.匿名函数 七.匿名函数的函数类型 ...
- f ajax event,f:ajax onevent不能使用预定义函数,但可以使用内联函数
我有一个,它提交一个表格.f:ajax onevent不能使用预定义函数,但可以使用内联函数 render=":tblProject" /> 它的工作原理也是应该的,但是当我 ...
- 隐式内联函数和显式内联函数
让一个函数成为内联函数,隐式的为在类里定义函数,显式的则是在函数前加上inline关键字说明. // // inline1.cpp // C++primary // // Created by ...
- c语言函数参数类型检查,内联函数在编译时是否做参数类型检查?
先说宏和函数的区别: 1. 宏做的是简单的字符串替换(注意是字符串的替换,不是其他类型参数的替换),而函数的参数的传递,参数是有数据类型的,可以是各种各样的类型. 2. 宏的参数替换是不经计算而直接处 ...
- c语言什么是内联函数,C语言中内联函数inline的使用方法
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 来源一:比特网 来源二:东方锐智 在C++中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联涵 ...
- C++ 11 新特性(十二)函数新特性、内联函数、const详解
函数后置返回类型 //后置返回类型 auto fun(int, int)->int; 内联函数 在函数定义前增加关键字 inline ,使得该函数变成内联函数 (1) 适用于函数体很小,调用很频 ...
- inline函数返回值_C++ 内联函数 inline的详细分析
1. 什么是内联函数? 就是使用了关键字inline的函数,如 inline int max(int a, int b){ 2. 内联函数有什么作用? C++在调用函数时,会执行一系列的操作: ...
- c++ 函数 -函数重载 -特殊用途的语言特性(默认实参,内联函数 ,constexpr ,assert,NDEBUG)
c++ 函数 -函数重载 -特殊用途的语言特性 文章目录 c++ 函数 -函数重载 -特殊用途的语言特性 函数重载 定义: 重载和const形参 const_cast 和重载 const_cast 重 ...
- js -- 内联函数
内联函数 内联函数是指用inline关键字修饰的函数.在类内定义的函数被默认成内联函数.内联函数从 源代码层看,有函数的结构,而在编译后,却不具备函数的性质. 内联函数不是在调用时发生控制转移,而是在 ...
最新文章
- PHP算法 《树形结构》 之 伸展树(1) - 基本概念
- 目标跟踪 facebook_如何关闭Facebook Messenger的位置跟踪(如果已启用)
- linux网络编程 华清,Linux网络编程之套接字
- java 数据保存内存_java中的各种数据类型在内存中存储的方式 一
- 10054 java,为什么Socket.Receive在远程主机断开连接时抛出SocketException(10054)?
- Redis教程:数据对象分析(二)
- 利用SQL建立数据库
- 电子计算机与多谋种,计算机国二MS_Office高级应用
- 关联分析购物篮案例python_购物篮分析案例_关联分析算法_如何做销售数据分析 – 帆软...
- 【RBF预测】基于RBF神经网络预测模型matlab源码
- matlab平稳性检验,平稳性检验方法的有效性研究
- python实现garch模型_【一点资讯】Python玩转金融时间序列之ARCH与GARCH模型
- 2014最受欢迎的8款免费PSD线框图工具
- Thinkphp 5.1安装
- 软件工程导论第六版 第一章 软件工程学概述知识点总结(下)
- RB女歌手宇西个人单曲《盛宴》上线 诠释独自疗伤的故事
- python:python基础语法三,列表、元组、字典、集合
- CERC 2014 Outer space invaders (hnuoj13405)
- 自荐书中专生计算机应用,中专生求职自荐书
- 缔造三家世界500强公司!杨寿海的“狂人日记”
热门文章
- 空间谱专题09:阵列信号建模方法
- 使用Android BindingAdapter与InverseBindingAdapter实现SeekBar双向(正向/反向)数据绑定...
- FreeBSD手册——配置FreeBSD内核
- android点滴 之 进度条
- virtualbox在装centos5.6时自协把virtualbox add-on 装上了
- c/c++ 修改文件的创建时间,修改时间,访问时间 [和弦]
- pthread相关介绍
- 【特征匹配】BRISK原文内容翻译
- Python中使用librosa包进行mfcc特征参数提取
- pycharm怎么切换到vim编辑模式