c/c++语言开发共享C++基础 inline 默认参数 函数占位参数 函数重载

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 = %dn", a);      printf("b = %dn", b);     printf("c = %dn", 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:%dn", x); }

规则:

(1)只有参数列表后面部分才可以使用默认参数。

(2)一旦在函数中使用默认参数,这个参数之后的参数都必须使用默认参数。

//在默认参数规则 ,如果默认参数出现,那么右边的都必须有默认参数 void printabc(int a, int b, int x = 3, int y=4, int z = 5) {     printf("x:%dn", 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) = %dn", 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 = %dn", 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 = %dn", c);      printf("press enter to continue ...");     getchar();         return 0; }

 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/607030.html

(0)
上一篇 2021年5月14日
下一篇 2021年5月14日

精彩推荐