本章主要内容:
- 1)内联函数(替代宏代码段)
- 2)默认参数
- 3)占位参数
1.C++的内联函数分析
1.1讲解内联函数之前,首先回忆下之前讲的define宏定义:
之前讲过宏定义会经过预处理器进行文本替换,缺点就在于没有类型检查,没有任何编译过程,编译器根本不知道类型是什么.
所以,C++中,当需要某个类型的常量时,可以使用const常量来替代宏常数,如:
const int A=3; <---> #define A 3
1.2那如果#define 定义的是宏代码段,例子如下:
#include <stdio.h> #define MAX(A,B) (A>B?A:B) int main() { int a=5; int b=4; printf("%d",MAX(++a,b)); }
输出结果:
7
这就是宏定义的缺点,因为上面的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=10); //声明show函数,并定义参数x默认值为10
int main() { show(); } int show(int x) { printf("x=%d ",x); }
输出结果:
x=10
2)没有函数声明时:
int show(int x=10) //定义参数x默认值为10 { printf("x=%d ",x); } int main() { show(); }
输出结果:
x=10
2.1当有多个默认参数时
1)定义时,参数的默认值必须从右向左定义,例如:
int show(int x, int y,int z=10); //定义正确 int show(int x, int y=8,int z=10); //定义正确 //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=8,int z=10); int main() { show(6); //x=6,y=8,z=10; show(6,7); //x=6,y=7,z=10; show(6,7,8); //x=6,y=7,z=8; return 0; } int show(int x,int y,int z) { printf("x=%d y=%d z=%d ",x,y,z); }
输出结果:
x=6 y=8 z=10 x=6 y=7 z=10 x=6 y=7 z=8
3.C++函数的占位参数
占位参数,是指该函数的参数只有类型声明,却没有参数名
注意:该占位参数在函数体内是无法被使用的
实例1:
int func(int x,int ); ... ... func(1,2); //调用func函数
实例2,使用占位参数+默认参数一起使用:
int func(int =0,int =0); ... ... int main() { /*调用func函数*/ func(); func(2); func(1,2); return 0; }
从实例2可以看到,其实占位参数和默认参数主要目的是为了兼容代码