C++ —— C++内联函数

C++内联函数

 

一、内联函数

1、C++中的const常量可以替代宏常数定义,如:

const int A = 3;   #define A 3

C++中是否有解决方案替代宏代码片段呢?(替代宏代码片段就可以避免宏的副作用!)

 

2、C++中推荐使用内联函数替代宏代码片段

C++中使用inline关键字声明内联函数

内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求。

#include <iostream>using namespacestd;#define MIN(a,b) ((a) < (b) ? (a) : (b))inline int myfunc(inta, int b)
{return a < b ? a : b;
}int main(void)
{int a = 1;int b = 3;//int c = myfunc(++a, b);int c = MIN(++a, b);printf("a = %d\n", a);printf("b = %d\n", b);printf("c = %d\n", c);return 0;
}

说明1:必须inline intmyfunc(int a,int b)和实现的地方,写在一块。

说明2:C++编译器可以将一个函数进行内联编译;被C++编译器内联编译的函数叫做内联函数;内联函数在最终生成的代码中是没有定义的;C++编译器直接将函数体插入函数调用的地方;内联函数没有普通函数调用时的额外开销(压栈,跳转,返回)。

说明3:C++编译器不一定准许函数的内联请求

说明4:内联函数是一种特殊的函数,具有普通函数的特征(参数检查,返回类型等);内联函数是对编译器的一种请求,因此编译器可能拒绝这种请求;内联函数由编译器处理,直接将编译后的函数体插入调用的地方;宏代码片段由预处理器处理,进行简单的文本替换,没有任何编译过程。

说明5:现代C++编译器能够进行编译优化,因此一些函数即使没有inline声明,也可能被编译器内联编译;另外,一些现代C++编译器提供了扩展语法,能够对函数进行强制内联,如:g++中的__attribute__((always_inline))属性。

说明6:

C++中内联编译的限制:

不能存在任何形式的循环语句;不能存在过多的条件判断语句;函数体不能过于庞大;不能对函数进行取址操作;函数内联声明必须在调用语句之前。

 

结论:
(1)内联函数在编译时直接将函数体插入函数调用的地方

(2)inline只是一种请求,编译器不一定允许这种请求

(3)内联函数省去了普通函数调用时压栈,跳转和返回的开销

 

二、默认参数

1、C++中可以在函数声明时为参数提供一个默认值,     当函数调用时没有指定这个参数的值,编译器会自动用默认值代替。

2、只有参数列表后面部分的参数才可以提供默认参数值,一旦在一个函数调用中开始使用默认参数值,那么这个参数后的所有参数都必须使用默认参数值。

 

三、函数占位参数

占位参数只有参数类型声明,而没有参数名声明;一般情况下,在函数体内部无法使用占位参数。

 

四、函数重载

用同一个函数名定义不同的函数;当函数名和不同的参数搭配时函数的含义不同。

int func(int x)
{return x;
}int func(int a, int b)
{return a + b;
}int func(const char *s)
{return strlen(s);
}int main(intargc, char *argv[])
{int c = 0;c = func(1);printf("c = %d\n", c);c = func(1, 2);printf("c = %d\n", c);c = func("12345");printf("c = %d\n", c);return 0;
}


函数重载至少满足下面的一个条件:

       参数个数不同

       参数类型不同

       参数顺序不同

编译器调用重载函数的准则

       将所有同名函数作为候选者

       尝试寻找可行的候选函数

       精确匹配实参

       通过默认参数能够匹配实参

       通过默认类型转换匹配实参

       匹配失败

       最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。

       无法匹配所有候选者,函数未定义,编译失败。

函数重载的注意事项

       重载函数在本质上是相互独立的不同函数(静态链编)

       重载函数的函数类型是不同的

       函数返回值不能作为函数重载的依据

函数重载是由函数名和参数列表决定的。

函数重载与函数指针

       当使用重载函数名对函数指针进行赋值时

       根据重载规则挑选与函数指针参数列表一致的候选者

       严格匹配候选者的函数类型与函数指针的函数类型

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大佬为何可以把单片机描述得如此形象生动?

某年某日某产房&#xff0c;你诞生了&#xff08;power up , 上电运行&#xff09;&#xff0c;结果你不哭&#xff0c;医生把你提起来&#xff0c;屁股上狠狠一巴掌&#xff0c;你哇哇大哭&#xff08;reset, 复位成功&#xff09;&#xff0c;护士给你检查&#xff0c;看有没…

CWinThread

https://baike.baidu.com/item/CWinThread/5902501 https://blog.51cto.com/5412097/1643861 https://blog.csdn.net/thanklife/article/details/78677688 CWinThread&#xff1a;&#xff1a;SuspendThread https://blog.csdn.net/h315444352/article/details/22091361 工作者…

html总结:文本框填满表格

<style> input { width: 100%; }</style>转载于:https://www.cnblogs.com/iCheny/p/8798808.html

双硬盘奇怪问题...

今天下午打开文件夹....提示错误....指定的文件夹无法打开....汗...文件夹大小变成0KB..而有的文件夹又是正常的...可以打开,可以访问....一切正常...但是就是那么几个文件夹.里面放的东西比较的多....打不开...由于本人是双硬盘.上次出现了RAW 的错误...让我有一种一朝被蛇咬,…

51单片机温度控制系统报警器,不会做课程设计的就拿走

▌功能说明&#xff08;1&#xff09;单片机读取温度传感器当前的温度值并在LCD液晶显示屏上的第一行显示当前的温度值&#xff0c;如Temp&#xff1a;27.5℃。&#xff08;2&#xff09;单片机读取按键状态并通过人为手动按键部分来设置最低温度到最高温度的温度范围后&#x…

C++ —— C++数据类型

C—— C数据类型 1、数据类型分类 &#xff08;1&#xff09;基本数据类型 字符型&#xff08;char&#xff09;—— 1字节 整型&#xff08;int&#xff09; —— 4字节 浮点型&#xff08;实型&#xff09;—— 单精度float4字节&#xff1b;双精度&#xff08;double&a…

参加 CSDN 2009 英雄大会有感(一)

参加 CSDN 2009 英雄大会有感&#xff08;一&#xff09; 我作为 CSDN Blog 专家参加了本次盛会。今天可以算是本次大会的第一天。下午参观了 CSDN 的研发中心&#xff0c;感觉蛮不错&#xff0c;从个人工作环境布局到各会议室的空间布局上都很紧凑&#xff0c;合理、最大化地…

不要怕辛苦

先说点事情一直以来我都非常喜欢跟大家交流各种问题&#xff0c;自我觉得回答比较用心&#xff0c;可能最近因为很多人毕业&#xff0c;遇到抉择的问题比较多&#xff0c;所以这类的提问也偏多一些。从开始做公众号到现在&#xff0c;支持我的人很多。有些读者从开始关注到现在…

SQL Server 连接字符串和身份验证 学习

https://www.cnblogs.com/niuyjdz/p/7533439.html

Win7系统中用anaconda配置tensorflow运行环境

前言&#xff1a;anaconda是一个python Data Science Platform。安装它的契机是因为要用tensorflow。安装完后感觉用它来管理python运行环境还是挺方便的&#xff0c;常用的conda命令&#xff1a;升级conda: conda update conda安装conda环境&#xff1a; conda create -n env_…

区分JavaScript中的undefined,null和NaN

区分underfined,null和NaN 先看看下面语句的运行结果&#xff1a; 1: var a; 2: alert(a); //显示"undefined" 3: alert(typeof a); //显示"undefined" 4: alert(b); //显示"undefined" 以上说明a的值和类型都是underfined 1: var a null; …

C++ —— C++常量和变量

C——常量和变量 1、常量 &#xff08;1&#xff09;整型常量 指不带小数点的整数&#xff0c;整型常量后面加上l或L表示该数为长整型常量 整型常量后面加上u或U表示该数为无符号整型常量 十进制中&#xff0c;由&#xff0c;&#xff0d;&#xff0c;0~9组成 &#xff08…

拆解前苏联产荧光数码管计算器,内部电路结构彪悍!

荧光数码管是用来显示数字和符号的器件。它的数码字形由若千段分立的笔划构成。荧光数码管是一种电真空器件&#xff0c;其工作原理与普通的电子管相似&#xff0c;它的灯丝就是阴极&#xff08;为直热式阴极&#xff09;&#xff0c;当灯丝通电后灯丝就会发热&#xff08;即阴…

silverlight之datagrid的一个问题

this.myDataGrid.itemSourcesitems; 使用泛型数组给datagrid添加itemsource,我想添加一个textblock对象,上面text"sdfd",可运行显示是System.Windows.Controls.TextBlock,如图,请大侠们指点 转载于:https://www.cnblogs.com/wuli00/archive/2009/04/20/1439677.html

什么是套接字(Socket)

什么是套接字(Socket) 应用层通过传输层进行数据通信时&#xff0c;TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据。为了区别不同的应用程序进程和连接&#xff0c;许多计算机操作系统为应用…

洛谷 P2084 进制转换

P4122 [USACO17DEC]Blocked Billboard 题目描述 During long milking sessions, Bessie the cow likes to stare out the window of her barn at two huge rectangular billboards across the street advertising "Farmer Alexs Amazingly Appetizing Alfalfa" and &…

三极管构成的电流负反馈放大器

▌1.题目设计一个有三极管构成的电流负反馈放大器&#xff0c;放大倍数不小于100倍&#xff0c;集电极最大电流不超过20mA&#xff0c;当负载由1000欧姆变10欧姆时&#xff0c;要求输出电流的波动幅度小于5%。▌2.项目总体功能图▌3.测试条件频率为500HZ、幅度为5mv的正弦波。▌…

C++ —— C++运算符与表达式

C ——运算符与表达式 1、关系运算符及其优先级 在&#xff23;语言中有6种关系运算符&#xff1a;<,<,>,>,,! 在六个关系运算符中&#xff0c;<&#xff0c;<&#xff0c;>&#xff0c;>的优先级相同&#xff0c;和!的优先级相同&#xff0c;<&a…

lzg_ad:FBWF配置详解

在安装好Windows XP Embedded FP2007及以后版本的开发工具后&#xff0c;我们就可以在我们的XPE操作系统镜像中添加FBWF功能了。我们可以在目标设计器中配置FBWF&#xff0c;也就是在构建XPE镜像文件前配置好FBWF&#xff0c;也可以在运行时镜像中配置FBWF。本文将详细介绍这两…

耦合,到底是什么!?

在电路中,将前级电路(信号源)的能量递至后级电路(负载)称为耦合&#xff0c;常见的耦合介质有导线、电容器&#xff0c;变压器、光电耦合器&#xff0c;电子电路&#xff0c;根据不同耦合介质常见有以下耦合方式&#xff0c;这几种耦合方式&#xff0c;各有特点,在不同哪种比较…