函数是将段经常使用的代码封装起来,减少重复代码量。
语法:
返回值类型 函数名(参数列表)
{
函数体语句
return 表达式
}
下面示例包含了函数声明、函数定义、函数调用、函数形参与实参、参数值传递、函数常见样式(无参无返、无参有返、有参无返及有参有返)。
- #include
- using namespace std;
-
- //定义函数(参数为形参):两个整数相加(函数定义在调用前面,否则报错,也可以先定义函数声明,函数写在调用函数后面,参见下面的函数声明max函数)
- int add(int a, int b)
- {
- int sum = a + b;
- return sum;
- }
-
- //定义函数(值传递):交换两个数值(参数值传递,形参发生改变不影响实参)
- void swap(int a, int b)
- {
- cout << "交换前形参:a = " << a << " , b = " << b << endl;
- int tmp = a;
- a = b;
- b = tmp;
- cout << "交换后形参:a = " << a << " , b = " << b << endl;
-
- }
-
- //函数声明:提前告诉编译器函数的存在,在定义前调用函数不会报错
- //函数声明可以写多次(不建议写多次),但是定义只能写一次
- int max(int a, int b);
- int max(int a, int b);
-
- //函数常见样式
- //1、无参无返
- void func1() {
- cout << "这是一个无参无返回值函数" << endl;
- }
-
- //2、有参无返:参见上面的swap函数
-
- //3、无参有返
- string func3()
- {
- return "这是一个无参有返回值函数,这是返回的字符串";
- }
-
- //4、有参有返回,参见上面的add函数
-
- int main()
- {
- //调用函数 - 两数相加(参数为实参)
- cout << "调用函数:两数相加:add(5, 3) = " << add(5, 3) << endl;;
-
- cout << "--- 参数值传递,形参发生改变不影响实参 ---" << endl;
-
- //调用函数 - 交换两数(值传递)
- int x = 5;
- int y = 3;
- swap(5, 3);
- cout << "主函数调用交换函数(值传递)实参值, x = " << x << " , y = " << y << endl;
-
- //调用函数 - 无参无返
- func1();
-
- //调用函数 - 无参有返
- cout << func3() << endl;
-
- //调用声明函数
- cout << "调用函数声明函数max = " << max(3, 5) << endl;
-
- system("pause");
-
- return 0;
- }
-
- //函数定义(函数已在调用前声明)
- int max(int a, int b)
- {
- return a > b ? a : b;
- }
输出结果
调用函数:两数相加:add(5, 3) = 8
--- 参数值传递,形参发生改变不影响实参 ---
交换前形参:a = 5 , b = 3
交换后形参:a = 3 , b = 5
主函数调用交换函数(值传递)实参值, x = 5 , y = 3
这是一个无参无返回值函数
这是一个无参有返回值函数,这是返回的字符串
调用函数声明函数max = 5
Go语言函数与C++函数区别:
- 函数声明与定义一起,且不区别函数定义的位置
- 可以包含多个返回值
- package main
-
- import "fmt"
-
- func main() {
- fmt.Println("调用函数:两数相加:add(5, 3) = ", add(5, 3))
-
- fmt.Println("--- 参数值传递,形参发生改变不影响实参 ---")
- x , y:= 5, 3
-
- swap(x, y)
- fmt.Printf("主函数调用交换函数(值传递)实参值, x = %d, y = %d\n", x, y)
-
- fmt.Println("--- 实参通过接收函数返回值交换数据 ---")
-
- x, y = swap1(x, y)
- fmt.Printf("调用函数可以有多个返回值(返回值写法1 - 返回值没有定义名称) - 实现两数交换: x = %d, y = %d\n", x, y)
-
- x, y = swap1(x, y)
- fmt.Printf("调用函数可以有多个返回值(返回值写法2 - 返回值定义名称) - 实现两数交换: x = %d, y = %d\n", x, y)
- }
-
- //定义函数(参数为形参)
- func add(a int, b int) int {
- return a + b
- }
-
- //定义函数(值传递):交换两个数值(参数值传递,形参发生改变不影响实参)
- func swap(a int, b int) {
- fmt.Printf("交换前形参:a = %d, b = %d\n", a, b)
- a, b = b, a
- fmt.Printf("交换后形参:a = %d, b = %d\n", a, b)
- }
-
- //函数可以有多个返回值(返回值写法1 - 返回值没有定义名称):交换两个数
- func swap1(a int, b int) (int, int) {
- return b, a
- }
-
- //函数可以有多个返回值(返回值写法2 - 返回值定义名称):交换两个数
- func swap2(a int, b int) (x int, y int) {
- x, y = b, a
- return
- }
输出结果
调用函数:两数相加: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放在一个公共文件中,供其他文件调用。
在解决方案中,右键单击“头文件” -> 选择“添加” -> 选择“新建项”,如下图所示:

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

- #include
- using namespace std;
-
- //两数交换函数声明
- void swap(int a, int b);
在源文件中创建swap.cpp文件,与创建头文件几乎相同,在学习(一)时已经演示过了,此处不再赘述。
在swap.cpp文件中,引用头文件swap.h,即与其关联,代码如下所示:
- #include "swap.h"
-
- //定义函数(值传递):交换两个数值(参数值传递,形参发生改变不影响实参)
- void swap(int a, int b)
- {
- cout << "交换前形参:a = " << a << " , b = " << b << endl;
- int tmp = a;
- a = b;
- b = tmp;
- cout << "交换后形参:a = " << a << " , b = " << b << endl;
- }
创建一个新的.cpp文件,引.h入头文件,在main函数中调用头文件中的swap函数,文件结构如下:

调用函数文件代码如下:
- #include
- #include "swap.h"
- using namespace std;
-
- int main()
- {
- //调用头文件中声明的函数
- cout << "调用头文件中声明的函数 swap(5, 3) " << endl;;
- swap(5, 3);
-
- system("pause");
-
- return 0;
- }
输出结果
调用头文件中声明的函数 swap(5, 3)
交换前形参:a = 5 , b = 3
交换后形参:a = 3 , b = 5
新建一个文件夹 “19-函数-公用函数”, 此处作为演示使用,实际项目中不建议使用中文名命名文件或文件夹。在该文件夹中创建一个.go文件(common.go),定义函数如下:
- package common
-
- import "fmt"
-
- //定义函数(值传递):交换两个数值(参数值传递,形参发生改变不影响实参)
- func Swap(a int, b int) {
- fmt.Printf("交换前形参:a = %d, b = %d\n", a, b)
- a, b = b, a
- fmt.Printf("交换后形参:a = %d, b = %d\n", a, b)
- }
注:在Go语言中,若想函数被其它包能够访问,函数名首字母需要大写(其含义为其它语言中的public)
创建主文件.go,调用公共函数(Swap),文件结构如下图所示:

源码如下:
- package main
-
- import (
- "fmt"
- common "testProject/CPlus/19-函数-公用函数"
- )
-
- func main() {
- fmt.Println("调用公共函数 swap(5, 3)")
- common.Swap(5, 3)
- }
输出结果
调用公共函数 swap(5, 3)
交换前形参:a = 5, b = 3
交换后形参:a = 3, b = 5