C++基础 inline 默认参数 函数占位参数 函数重载
程序员文章站
2022-06-27 14:08:20
1. inline内联函数 内联函数用于替换宏, 实例: 其中宏和 ++ 连用有副作用。 有以下注意: (1)必须inline int myfunc(int a, int b)和函数体的实现,写在一块 (2)内联函数在最终生成的代码中没有定义,C++编译器直接将函数体插入函数调用处,所以内联函数没有 ......
1. inline内联函数
内联函数用于替换宏,
实例:
其中宏和 ++ 连用有副作用。
#include "iostream" using namespace std; #define myfunc(a, b) ((a) < (b) ? (a) : (b)) inline int myfunc(int a, int b) { return a < b ? a : b; } int main() { int a = 1; int b = 3; //int c = myfunc(++a, b); int c = myfunc(++a, b); printf("a = %d\n", a); printf("b = %d\n", b); printf("c = %d\n", c); system("pause"); return 0; }
有以下注意:
(1)必须inline int myfunc(int a, int b)和函数体的实现,写在一块
(2)内联函数在最终生成的代码中没有定义,c++编译器直接将函数体插入函数调用处,所以内联函数没有普通函数调用时的额外开销(压栈,跳转,返回),也不能取地址。
(3)内联函数由编译器处理,直接将编译后的函数体插入调用的地方,宏由预处理器处理,进行简单文本替换,没有任何编译过程。
(4)内联编译的限制:
不能存在循环语句,不能有太多判断语句,函数体不能过于庞大,不能对函数体取地址,内联声明必须在调用语句之前。
2. 默认参数
如下:
void printab(int x = 3) { printf("x:%d\n", x); }
规则:
(1)只有参数列表后面部分才可以使用默认参数。
(2)一旦在函数中使用默认参数,这个参数之后的参数都必须使用默认参数。
//在默认参数规则 ,如果默认参数出现,那么右边的都必须有默认参数 void printabc(int a, int b, int x = 3, int y=4, int z = 5) { printf("x:%d\n", x); } int main62(int argc, char *argv[]) { printab(2); printab(); system("pause"); return 0; }
3. 函数占位参数
如下:
int func(int a, int b, int ) { return a + b; } int main01() { //func(1, 2); //可以吗? printf("func(1, 2, 3) = %d\n", func(1, 2, 3)); getchar(); return 0; }
函数占位参数:
(1)占位参数只有参数类型声明,而没有参数名声明
(2)一般情况下,在函数体内部无法使用占位参数。
函数占位参数与默认参数结合
int func2(int a, int b, int = 0) { return a + b; } void main() { //如果默认参数和占位参数在一起,都能调用起来 func2(1, 2); func2(1, 2, 3); system("pause"); }
4. 函数重载
(1)函数重载的概念
当函数名或函数参数不同时,函数的含义不同。
(2)函数重载的判断标准
参数类型,个数、顺序
返回值不是判断标准。
(3)编译器调用函数重载的准则
将所有同名函数作为候选者
进行精准匹配实参,和默认参数匹配实参
如果失败,进行默认类型转换匹配实参。
如果失败,就失败。
匹配不能出现二义性。
(4)函数重载与函数默认参数
//当函数默认参数遇上函数重载会发生什么 int func(int a, int b, int c = 0) { return a * b * c; } int func(int a, int b) { return a + b; } //1个参数的允许吗 int func(int a) { return a + b; } int main() { int c = 0; c = func(1, 2); // 存在二义性,调用失败,编译不能通过 printf("c = %d\n", c); printf("press enter to continue ..."); getchar(); return 0; }
5. 函数重载和函数指针
/* 函数重载与函数指针 当使用重载函数名对函数指针进行赋值时 根据重载规则挑选与函数指针参数列表一致的候选者 严格匹配候选者的函数类型与函数指针的函数类型 */ int func(int x) // int(int a) { return x; } int func(int a, int b) { return a + b; } int func(const char* s) { return strlen(s); } typedef int(*pfunc)(int a); // int(int a) int main() { int c = 0; pfunc p = func; c = p(1); printf("c = %d\n", c); printf("press enter to continue ..."); getchar(); return 0; }