C++[函数]

打印 上一主题 下一主题

主题 1072|帖子 1072|积分 3216

  1. 2023-3-5首次编辑
  2. 2024-3-7第一次修改(增加目录)
复制代码

  
Unit 3:函数

一.内联函数

  1. #define _CRT_SECIRE_NO_WARNINGS
  2. #include <iostream>
  3. using namespace std;
  4. //1.宏函数:
  5. #define ADD(x,y) x+y
  6. //2.内联函数:
  7. //普通函数前加上inline,向编译器申请成为内联函数
  8. //加上inline可能成为内联函数,可能不成为内联函数
  9. inline int Add(int x, int y)
  10. {
  11.         return x + y;
  12. }
  13. void test1()
  14. {
  15.         int ref1 = ADD(10, 20) * 2; //err:宏函数编译为:10+20*2
  16.         cout << "ref1=" << ref1 << endl;
  17.         int ref2 = Add(10, 20) * 2;//内联函数编译为(10+20)*2
  18.         cout << "ref2=" << ref2 << endl;
  19. }
  20. //1.宏函数结合三目运算符与自增运算符
  21. #define COMAPD(x,y)((x)<(y)?(x):(y))
  22. //2.内联函数结合三目运算符与自增运算符
  23. inline int func(int x, int y)
  24. {
  25.         return x < y ? x : y;
  26. }
  27. void test2()
  28. {
  29.         int a = 1;
  30.         int b = 3;
  31.         //((++a)<(b)?(++a):(b))
  32.         //cout << "宏函数计算结果:" << COMAPD(++a, b) << endl;//err:优化掉了一次++a
  33.         cout << "内联函数计算结果:" << func(++a, b) << endl;
  34. }
  35. int main()
  36. {
  37.         test1();
  38.         test2();
  39.         system("pause");
  40.         return 0;
  41. }
复制代码
  内联函数申请失败:
  

  • 存在过多的条件判定语句
  • 存在任何形式的循环语句
  • 函数体过大
  • 对函数进行取值操作
    内联函数优点:
  

  • 有宏函数的效率,没有宏函数的缺点
    留意:
  

  • 类的成员函数默认加上inline
  • 在普通函数前面加上inline是申请成为内联函数
  二.函数的默认参数

   函数的默认参数就是给函数的形参赋值
  1. #define _CRT_SECIRE_NO_WARNINGS
  2. #include <iostream>
  3. using namespace std;
  4. //此处int b = 0;就是函数的默认参数(不一定是0)
  5. int myFunc1(int a, int b = 0)
  6. {
  7.         return a + b;
  8. }
  9. void test1()
  10. {
  11.         //函数的默认参数的作用:
  12.         //当函数内经常要用到形参的某个值,但偶尔要使用其他值
  13.         //增加函数的灵活性
  14.         cout << myFunc1(10, 20) << endl;
  15.         cout << myFunc1(10) << endl;
  16. }
  17. //注意1:函数的默认参数后面的参数必须都是默认参数
  18. int myFunc2(int a, int b = 0, int c = 2, int d = 3)
  19. {
  20.         return a + b + c + d;
  21. }
  22. //注意2:函数声明和实现不能同时有函数默认参数
  23. void myFunc3(int a, int b);
  24. void myFunc3(int a, int b = 0)
  25. {
  26. }
  27. int main()
  28. {
  29.         test1();
  30.         system("pause");
  31.         return 0;
  32. }
复制代码
三.函数的占位参数

  1. #define _CRT_SECIRE_NO_WARNINGS
  2. #include <iostream>
  3. using namespace std;
  4. //函数的占位参数在运算符重载时区分前++和后++
  5. //占位参数也有默认值
  6. void func1(int a, int = 10)
  7. {
  8. }
  9. void test1()
  10. {
  11.         func1(10);
  12. }
  13. //占位参数和默认参数混搭
  14. void func2(int = 10, int a = 20)
  15. {
  16. }
  17. void test2()
  18. {
  19.         func2();
  20.         func2(30);
  21.         func2(30, 40);
  22. }
  23. int main()
  24. {
  25.         system("pause");
  26.         return 0;
  27. }
复制代码
四.函数重载

   答应函数名类似
    作用: 为了方便使用函数名
    条件:
  

  • 同一个作用域
  • 参数的个数不同
  • 参数的顺序不同
  • 参数的范例不同
    留意1:
  

  • 调用重载函数时,有着严格的范例匹配
  • 如果范例不匹配,那么尝试转换
  • 转换乐成就调用,失败就报错
  
  留意2:
  

  • 函数重载和函数的默认参数一起使用时
  • 需要留意二义性问题
  
  留意3:
  

  • 函数的返回值不作为函数重载的条件
  • 编译器是通过调用函数时
  • 传入的参数来判定调用重载的哪个函数
  • 我们调用函数时不需要写返回值
  • 所以返回值不能成为函数重载的条件
  1. #define _CRT_SECIRE_NO_WARNINGS
  2. #include <iostream>
  3. using namespace std;
  4. void func()
  5. {
  6.         cout << "func()" << endl;
  7. }
  8. //参数的个数不同
  9. void func(int a)
  10. {
  11.         cout << "func(int a)" << endl;
  12. }
  13. //参数的类型不同
  14. void func(char c)
  15. {
  16.         cout << "func(char c)" << endl;
  17. }
  18. //参数的顺序不同
  19. void func(int a, double b)
  20. {
  21.         cout << "func(int a, double b)" << endl;
  22. }
  23. void func(double b, int a)
  24. {
  25.         cout << "func(double b, int a)" << endl;
  26. }
  27. void test1()
  28. {
  29.         int a = 10;
  30.         double b = 3.14;
  31.         char c = 'c';
  32.         func();
  33.         //func(b);
  34.         //err:double转换不了int或char
  35.         func(c);
  36.         //char转换int成功,调用int参数的函数
  37.         func(a, b);
  38.         func(b, a);
  39. }
  40. //函数重载和函数的默认参数一起使用
  41. void myfunc(int a, int b = 10)
  42. {
  43.         cout << "myfunc(int a, int b = 10)" << endl;
  44. }
  45. void myfunc(int a)
  46. {
  47.         cout << "myfunc(int a)" << endl;
  48. }
  49. void test2()
  50. {
  51.         //myfunc(10); //err:二义性问题(不知调用哪个函数)
  52. }
  53. int main()
  54. {
  55.         test1();
  56.         test2();
  57.         system("pause");
  58.         return 0;
  59. }
复制代码
五.函数重载的原理

   函数重载的原理:
  

  • 在汇编时
  • 给各个函数取别名
  • C语言不能重载的愿意时没有取别名
    汇编文件天生:
  

  • gcc -S test.c -o test.s
  • g++ -S test.cpp -o test.s
  
  检察文件内容:
  

  • type 文件名
  六.C++调用C语言的函数

   C++的函数在汇编时,会给函数取别名
C语言的不会
    如果C++来调用C语言的函数
C++会去找取了别名的函数
但是C语言没有取别名
此时就会报错
  1.test.h
  1. //这是告诉C++编译器,找下面的函数时,要以C语言的方式去寻找
  2. #ifdef __cplusplus
  3. extern "C"
  4. {
  5. #endif
  6.         void func(); //C语言的函数声明
  7. }
复制代码
2.test.c
  1. #define _CRT_SECIRE_NO_WARNINGS
  2. #include <stdio.h>
  3. void func()
  4. {
  5.         printf("C语言\n");
  6. }
复制代码
3.main.cpp
  1. #define _CRT_SECIRE_NO_WARNINGS
  2. #include <iostream>
  3. using namespace std;
  4. #include"test.h"
  5. int main()
  6. {
  7.         func();//调用.c中的函数
  8.         system("pause");
  9.         return 0;
  10. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表