• C++ 学习(六)函数 及 函数的分文件编写


    函数

    函数是将段经常使用的代码封装起来,减少重复代码量。

    C++函数

    语法:

    返回值类型  函数名(参数列表)

    {

            函数体语句

            return 表达式

    }

    下面示例包含了函数声明、函数定义、函数调用、函数形参与实参、参数值传递、函数常见样式(无参无返、无参有返、有参无返及有参有返)。

    1. #include
    2. using namespace std;
    3. //定义函数(参数为形参):两个整数相加(函数定义在调用前面,否则报错,也可以先定义函数声明,函数写在调用函数后面,参见下面的函数声明max函数)
    4. int add(int a, int b)
    5. {
    6. int sum = a + b;
    7. return sum;
    8. }
    9. //定义函数(值传递):交换两个数值(参数值传递,形参发生改变不影响实参)
    10. void swap(int a, int b)
    11. {
    12. cout << "交换前形参:a = " << a << " , b = " << b << endl;
    13. int tmp = a;
    14. a = b;
    15. b = tmp;
    16. cout << "交换后形参:a = " << a << " , b = " << b << endl;
    17. }
    18. //函数声明:提前告诉编译器函数的存在,在定义前调用函数不会报错
    19. //函数声明可以写多次(不建议写多次),但是定义只能写一次
    20. int max(int a, int b);
    21. int max(int a, int b);
    22. //函数常见样式
    23. //1、无参无返
    24. void func1() {
    25. cout << "这是一个无参无返回值函数" << endl;
    26. }
    27. //2、有参无返:参见上面的swap函数
    28. //3、无参有返
    29. string func3()
    30. {
    31. return "这是一个无参有返回值函数,这是返回的字符串";
    32. }
    33. //4、有参有返回,参见上面的add函数
    34. int main()
    35. {
    36. //调用函数 - 两数相加(参数为实参)
    37. cout << "调用函数:两数相加:add(5, 3) = " << add(5, 3) << endl;;
    38. cout << "--- 参数值传递,形参发生改变不影响实参 ---" << endl;
    39. //调用函数 - 交换两数(值传递)
    40. int x = 5;
    41. int y = 3;
    42. swap(5, 3);
    43. cout << "主函数调用交换函数(值传递)实参值, x = " << x << " , y = " << y << endl;
    44. //调用函数 - 无参无返
    45. func1();
    46. //调用函数 - 无参有返
    47. cout << func3() << endl;
    48. //调用声明函数
    49. cout << "调用函数声明函数max = " << max(3, 5) << endl;
    50. system("pause");
    51. return 0;
    52. }
    53. //函数定义(函数已在调用前声明)
    54. int max(int a, int b)
    55. {
    56. return a > b ? a : b;
    57. }

    输出结果

    调用函数:两数相加:add(5, 3) = 8
    --- 参数值传递,形参发生改变不影响实参 ---
    交换前形参:a = 5 , b = 3
    交换后形参:a = 3 , b = 5
    主函数调用交换函数(值传递)实参值, x = 5 , y = 3
    这是一个无参无返回值函数
    这是一个无参有返回值函数,这是返回的字符串
    调用函数声明函数max = 5

    Go语言函数

    Go语言函数与C++函数区别:

    1.  函数声明与定义一起,且不区别函数定义的位置
    2.  可以包含多个返回值
    1. package main
    2. import "fmt"
    3. func main() {
    4. fmt.Println("调用函数:两数相加:add(5, 3) = ", add(5, 3))
    5. fmt.Println("--- 参数值传递,形参发生改变不影响实参 ---")
    6. x , y:= 5, 3
    7. swap(x, y)
    8. fmt.Printf("主函数调用交换函数(值传递)实参值, x = %d, y = %d\n", x, y)
    9. fmt.Println("--- 实参通过接收函数返回值交换数据 ---")
    10. x, y = swap1(x, y)
    11. fmt.Printf("调用函数可以有多个返回值(返回值写法1 - 返回值没有定义名称) - 实现两数交换: x = %d, y = %d\n", x, y)
    12. x, y = swap1(x, y)
    13. fmt.Printf("调用函数可以有多个返回值(返回值写法2 - 返回值定义名称) - 实现两数交换: x = %d, y = %d\n", x, y)
    14. }
    15. //定义函数(参数为形参)
    16. func add(a int, b int) int {
    17. return a + b
    18. }
    19. //定义函数(值传递):交换两个数值(参数值传递,形参发生改变不影响实参)
    20. func swap(a int, b int) {
    21. fmt.Printf("交换前形参:a = %d, b = %d\n", a, b)
    22. a, b = b, a
    23. fmt.Printf("交换后形参:a = %d, b = %d\n", a, b)
    24. }
    25. //函数可以有多个返回值(返回值写法1 - 返回值没有定义名称):交换两个数
    26. func swap1(a int, b int) (int, int) {
    27. return b, a
    28. }
    29. //函数可以有多个返回值(返回值写法2 - 返回值定义名称):交换两个数
    30. func swap2(a int, b int) (x int, y int) {
    31. x, y = b, a
    32. return
    33. }

    输出结果

    调用函数:两数相加:add(5, 3) =  8
    --- 参数值传递,形参发生改变不影响实参 ---
    交换前形参:a = 5, b = 3
    交换后形参:a = 3, b = 5
    主函数调用交换函数(值传递)实参值, x = 5, y = 3
    --- 实参通过接收函数返回值交换数据 ---
    调用函数可以有多个返回值(返回值写法1 - 返回值没有定义名称) - 实现两数交换: x = 3, y = 5
    调用函数可以有多个返回值(返回值写法2 - 返回值定义名称) - 实现两数交换: x = 5, y = 3

    函数分文件编写

    可以把上面的交换函数swap放在一个公共文件中,供其他文件调用。

    C++ 分文件编写

    (1)创建.h头文件

    在解决方案中,右键单击“头文件” -> 选择“添加” -> 选择“新建项”,如下图所示:

    选择“头文件” -> 修改文件名称(.h结尾) -> 单击“添加”按钮,如下图所示:

     

    (2)在.h头文件声明函数

    1. #include
    2. using namespace std;
    3. //两数交换函数声明
    4. void swap(int a, int b);

    (3)创建.cpp源文件

    在源文件中创建swap.cpp文件,与创建头文件几乎相同,在学习(一)时已经演示过了,此处不再赘述。

    (4)在.cpp源文件中定义函数

    在swap.cpp文件中,引用头文件swap.h,即与其关联,代码如下所示:

    1. #include "swap.h"
    2. //定义函数(值传递):交换两个数值(参数值传递,形参发生改变不影响实参)
    3. void swap(int a, int b)
    4. {
    5. cout << "交换前形参:a = " << a << " , b = " << b << endl;
    6. int tmp = a;
    7. a = b;
    8. b = tmp;
    9. cout << "交换后形参:a = " << a << " , b = " << b << endl;
    10. }

    (5)测试主函数调用(另一个.cpp文件)

    创建一个新的.cpp文件,引.h入头文件,在main函数中调用头文件中的swap函数,文件结构如下:

     调用函数文件代码如下:

    1. #include
    2. #include "swap.h"
    3. using namespace std;
    4. int main()
    5. {
    6. //调用头文件中声明的函数
    7. cout << "调用头文件中声明的函数 swap(5, 3) " << endl;;
    8. swap(5, 3);
    9. system("pause");
    10. return 0;
    11. }

    输出结果

    调用头文件中声明的函数 swap(5, 3)
    交换前形参:a = 5 , b = 3
    交换后形参:a = 3 , b = 5

    Go语言调用其它包中的函数

    (1)创建公共函数

    新建一个文件夹 “19-函数-公用函数”, 此处作为演示使用,实际项目中不建议使用中文名命名文件或文件夹。在该文件夹中创建一个.go文件(common.go),定义函数如下:

    1. package common
    2. import "fmt"
    3. //定义函数(值传递):交换两个数值(参数值传递,形参发生改变不影响实参)
    4. func Swap(a int, b int) {
    5. fmt.Printf("交换前形参:a = %d, b = %d\n", a, b)
    6. a, b = b, a
    7. fmt.Printf("交换后形参:a = %d, b = %d\n", a, b)
    8. }

     注:在Go语言中,若想函数被其它包能够访问,函数名首字母需要大写(其含义为其它语言中的public)

    (2)调用公共函数

    创建主文件.go,调用公共函数(Swap),文件结构如下图所示:

    源码如下:

    1. package main
    2. import (
    3. "fmt"
    4. common "testProject/CPlus/19-函数-公用函数"
    5. )
    6. func main() {
    7. fmt.Println("调用公共函数 swap(5, 3)")
    8. common.Swap(5, 3)
    9. }

    输出结果

    调用公共函数 swap(5, 3)
    交换前形参:a = 5, b = 3
    交换后形参:a = 3, b = 5

  • 相关阅读:
    docker
    一键安装上新版本的QQ
    建模仿真分析软件:Wolfram SystemModeler mac
    【2023复旦微电子提前批笔试题】~ 题目及参考答案
    My Forty-Second Page - 二叉搜索树的最近公共祖先 - By Nicolas
    ES-Docker部署的ES中安装IK分词器
    【数据结构】6.1 二叉树(C语言)
    又一个微信聊天机器人横空出世了,人人可用
    一次搞懂SpringBoot核心原理:自动配置、事件驱动、Condition
    Netty基础入门和基本使用
  • 原文地址:https://blog.csdn.net/ling1998/article/details/125898906