经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C » 查看文章
C++基础 inline 默认参数 函数占位参数 函数重载
来源:cnblogs  作者:还想抢救抢救  时间:2018/10/15 9:27:01  对本文有异议

1. inline内联函数

内联函数用于替换宏,

实例:

其中宏和 ++ 连用有副作用。

  1. #include "iostream"
  2. using namespace std;
  3. #define MYFUNC(a, b) ((a) < (b) ? (a) : (b))
  4. inline int myfunc(int a, int b)
  5. {
  6. return a < b ? a : b;
  7. }
  8. int main()
  9. {
  10. int a = 1;
  11. int b = 3;
  12. //int c = myfunc(++a, b);
  13. int c = MYFUNC(++a, b);
  14. printf("a = %d\n", a);
  15. printf("b = %d\n", b);
  16. printf("c = %d\n", c);
  17. system("pause");
  18. return 0;
  19. }

 

有以下注意:

(1)必须inline int myfunc(int a, int b)和函数体的实现,写在一块

(2)内联函数在最终生成的代码中没有定义,C++编译器直接将函数体插入函数调用处,所以内联函数没有普通函数调用时的额外开销(压栈,跳转,返回),也不能取地址。

(3)内联函数由编译器处理,直接将编译后的函数体插入调用的地方,宏由预处理器处理,进行简单文本替换,没有任何编译过程。

(4)内联编译的限制:

   不能存在循环语句,不能有太多判断语句,函数体不能过于庞大,不能对函数体取地址,内联声明必须在调用语句之前。

2. 默认参数

如下:

  1. void printAB(int x = 3)
  2. {
  3. printf("x:%d\n", x);
  4. }

规则:

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

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

  1. //在默认参数规则 ,如果默认参数出现,那么右边的都必须有默认参数
  2. void printABC(int a, int b, int x = 3, int y=4, int z = 5)
  3. {
  4. printf("x:%d\n", x);
  5. }
  6. int main62(int argc, char *argv[])
  7. {
  8. printAB(2);
  9. printAB();
  10. system("pause");
  11. return 0;
  12. }

3. 函数占位参数

如下:

  1. int func(int a, int b, int )
  2. {
  3. return a + b;
  4. }
  5. int main01()
  6. {
  7. //func(1, 2); //可以吗?
  8. printf("func(1, 2, 3) = %d\n", func(1, 2, 3));
  9. getchar();
  10. return 0;
  11. }

函数占位参数:

(1)占位参数只有参数类型声明,而没有参数名声明

(2)一般情况下,在函数体内部无法使用占位参数。

 

函数占位参数与默认参数结合

  1. int func2(int a, int b, int = 0)
  2. {
  3. return a + b;
  4. }
  5. void main()
  6. {
  7. //如果默认参数和占位参数在一起,都能调用起来
  8. func2(1, 2);
  9. func2(1, 2, 3);
  10. system("pause");
  11. }

 4. 函数重载

(1)函数重载的概念

   当函数名或函数参数不同时,函数的含义不同。

 (2)函数重载的判断标准

        参数类型,个数、顺序

        返回值不是判断标准。

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

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

    进行精准匹配实参,和默认参数匹配实参

    如果失败,进行默认类型转换匹配实参。

    如果失败,就失败。

     匹配不能出现二义性。

(4)函数重载与函数默认参数

  1. //当函数默认参数遇上函数重载会发生什么
  2.  
  3. int func(int a, int b, int c = 0)
  4. {
  5. return a * b * c;
  6. }
  7. int func(int a, int b)
  8. {
  9. return a + b;
  10. }
  11. //1个参数的允许吗
  12. int func(int a)
  13. {
  14. return a + b;
  15. }
  16. int main()
  17. {
  18. int c = 0;
  19. c = func(1, 2); // 存在二义性,调用失败,编译不能通过
  20. printf("c = %d\n", c);
  21. printf("Press enter to continue ...");
  22. getchar();
  23. return 0;
  24. }

5. 函数重载和函数指针

  1. /*
  2. 函数重载与函数指针
  3. 当使用重载函数名对函数指针进行赋值时
  4. 根据重载规则挑选与函数指针参数列表一致的候选者
  5. 严格匹配候选者的函数类型与函数指针的函数类型
  6. */
  7.  
  8. int func(int x) // int(int a)
  9. {
  10. return x;
  11. }
  12. int func(int a, int b)
  13. {
  14. return a + b;
  15. }
  16. int func(const char* s)
  17. {
  18. return strlen(s);
  19. }
  20. typedef int(*PFUNC)(int a); // int(int a)
  21.  
  22. int main()
  23. {
  24. int c = 0;
  25. PFUNC p = func;
  26. c = p(1);
  27. printf("c = %d\n", c);
  28. printf("Press enter to continue ...");
  29. getchar();
  30. return 0;
  31. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号