3.C++内联函数,默认参数,占位参数
本章主要内容:
- 1)内联函数(替代宏代码段)
- 2)默认参数
- 3)占位参数
1.C++的内联函数分析
1.1讲解内联函数之前,首先回忆下之前讲的define宏定义:
之前讲过宏定义会经过预处理器进行文本替换,缺点就在于没有类型检查,没有任何编译过程,编译器根本不知道类型是什么.
所以,C++中,当需要某个类型的常量时,可以使用const常量来替代宏常数,如:
const int A=; <---> #define A 3
1.2那如果#define 定义的是宏代码段,例子如下:
#include <stdio.h>
#define MAX(A,B) (A>B?A:B)
int main()
{
int a=;
int b=;
printf("%d",MAX(++a,b));
}
输出结果:
这就是宏定义的缺点,因为上面的printf()会被预处理器展开为:
printf("%d", ((++a) > b ? (++a) : b ) );
从而a被加了两次,所以输出结果为7.
1.3所以C++便添加了内联函数来代替宏代码段
内联函数用inline关键字声明,比如上面的MAX(A,B)宏,则可以替换为:
inline int MAX(int a, int b)
{
return a > b ? a : b ;
}
而内联函数和普通函数两者区别:
- 普通函数:每次调用前,CPU都会保存现场(入栈),调用完后还要恢复现场(出栈)等额外开销.
- 内联函数:就会在每次调用的地方,将内联函数里的代码段”内联地”展开,所以省去了额外的开销
注意:当内联函数里的代码过多,且流程复杂时,编译器可能会拒绝该函数的内联请求,从而变成普通函数
2.函数的参数默认值
C++中允许为函数提供参数默认值,主要有两种定义方式
1)函数声明时:
int show(int x=); //声明show函数,并定义参数x默认值为10
int main()
{
show();
} int show(int x)
{
printf("x=%d\n",x);
}
输出结果:
x=
2)没有函数声明时:
int show(int x=) //定义参数x默认值为10
{
printf("x=%d\n",x);
} int main()
{
show();
}
输出结果:
x=
2.1当有多个默认参数时
1)定义时,参数的默认值必须从右向左定义,例如:
int show(int x, int y,int z=); //定义正确 int show(int x, int y=,int z=); //定义正确 //int show(int x=6, int y=8,int z); //定义错误,没有从右开始定义 //int show(int x, int y=8,int z); //定义错误,没有从右开始定义
2)调用函数时,参数则从左向右匹配,例如:
#include <stdio.h>
int show(int x, int y=,int z=); int main()
{
show(); //x=6,y=8,z=10;
show(,); //x=6,y=7,z=10;
show(,,); //x=6,y=7,z=8;
return ;
} int show(int x,int y,int z)
{
printf("x=%d y=%d z=%d\n",x,y,z);
}
输出结果:
x= y= z= x= y= z= x= y= z=
3.C++函数的占位参数
占位参数,是指该函数的参数只有类型声明,却没有参数名
注意:该占位参数在函数体内是无法被使用的
实例1:
int func(int x,int ); ... ... func(,); //调用func函数
实例2,使用占位参数+默认参数一起使用:
int func(int =,int =); ... ... int main()
{
/*调用func函数*/
func();
func();
func(,);
return ;
}
从实例2可以看到,其实占位参数和默认参数主要目的是为了兼容代码
下章接着来学习: 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)
3.C++内联函数,默认参数,占位参数的更多相关文章
- const引用和函数占位参数遇上默认参数以及内联函数
1.const引用: 但是加上const之后是可以的,const int &a=100;就不会报错了. 2.函数占位参数: 如果给最后的占位参数加上默认值: 3.内联函数 内联只是对编译器发起 ...
- c++-内联函数和函数重载和默认参数和函数指针
内联函数 C++ 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方. 对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编 ...
- 我的c++学习(6)默认参数和内联函数
默认参数 一般情况下,函数调用时实参个数应与形参相同,但为了更方便地使用函数,C++也允许定义具有默认参数的函数,这种函数调用时实参个数可以与形参不相同.“默认参数”指在定义或声明函数时为形参指定默认 ...
- 特殊用途语言特性——默认参数、内联函数和constexptr函数
1 默认实参 某些函数有这样一些参数,在函数的很多次调用中它们都被赋予一个相同的值,此时,我们把这个反复出现的值称为函数的默认实参.调用含有默认实参的函数时,可以包含该实参,也可以省略该实参. 我们可 ...
- 拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友
1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.另外一种初始化的方式是直接在构造方法里面实现初始化. 案比例如以 ...
- C++命名空间、函数重载、缺省参数、内联函数、引用
一 .C++入门 1.C++关键字 2.命名空间 3.C++输入&输出 4.缺省参数 5.函数重载 6.引用 7.内联函数 8.auto关键字 9.基于范围的for循环 10.指针空值null ...
- C++中对C的扩展学习新增语法——内联函数以及函数参数
内联函数以及函数参数 内联函数 使用 inline 关键字必须和函数体放在一起. 内联函数具有内部链接属性. 内联函数会被编译器在编译阶段替换到函数调用的地方. 可以把内联函数定义写到头文件中,多个c ...
- c++中函数的参数传递,内联函数和默认实参的理解
1.参数传递 1)函数调用时,c++中有三种传递方法:值传递.指针传递.引用传递. 给函数传递参数,遵循变量初始化规则.非引用类型的形参一相应的实参的副本初始化.对(非引用)形参的任何修改仅作用域局部 ...
- C++初阶(命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字)
命名空间 概述 在C/C++中,变量.函数和后面要学到的类都是大量存在的,这些变量.函数和类的名称将都存在于全局作用域中,可能会导致很多冲突.使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲 ...
随机推荐
- QQ群友在线/离线,如何测试?
上篇文章『QQ好友在线/离线,如何测试?』针对即时通讯的"状态"进行了分析和总结,主要说到了QQ好友在线/离线实现方案,测试过程中需要注意的测试点. 针对好友状态实时性的要求需要使 ...
- 算法,java代码实现打印万年历
万年历 以1900年1月1号星期一为时间原点 星期日 第一天 星期一 第二天 星期二 第三天 星期三 第四天 星期四 第五天 星期五 第六天 星期六 第七天 1.计算出当前日 ...
- memcached经典问题和现象
缓存刷新时间集中问题 某个缓存失效了,导致其他节点的缓存命中率下降, 缓存中缺失的数据 去数据库查询.短时间内,会造成数据库服务器崩溃 需要将缓存失效时间离散分布在访问量比较低的时间段 multige ...
- 网站开启cdn加速的最简单步骤
https://jingyan.baidu.com/article/fedf0737ac414f35ac897704.html https://su.baidu.com/console/website ...
- 如何给网站添加CNZZ站长统计功能代码的常用办法
前几天有个客户来问小编怎么给网站添加上CNZZ站长统计工具,其实这个很简单,只要把cnzz免费代码复制到我们的footer文件就行.今天小编正好有空就来分享一下具体的操作过程. 首先要想获得这个免费的 ...
- Thinkphp5.0+Vue2.0前后端分离框架Vuethink
VueThink是一套基于Vue全家桶(Vue2.x + Vue-router2.x + Vuex)+ Thinkphp的前后端分离框架. 脚手架构建也可以通过vue官方的vue-cli脚手架工具构建 ...
- 关于PHP 开启zlib gzip配置
一般有两种方法:一种是使用ob_start("ob_gzhandler") ,是开启php自带的zlib配置,这里要说的是后者,此两种方法只能选其一,否则会报错 一.打开php.i ...
- [转载]利用memcached在多台服务器之间共享PHP的session数据
原文地址:利用memcached在多台服务器之间共享PHP的session数据作者:a1049709658 最近我的几篇文章都是是最近项目的一点心得^^ 这个项目一开始就设计的"很大&quo ...
- DT_修改注册项
所用语法: /* */用于注释掉某些非必要的判断语句 修改的文件及路径如下: 前台: 文件路径:/根目录/lang/zh-cn/ 编辑文件:member.inc.php 修改其中一些提示信息(如,将[ ...
- Java常用的框架
一.SpringMVC http://blog.csdn.net/evankaka/article/details/45501811 Spring Web MVC是一种基于Java的实现了Web MV ...