函数是将段经常使用的代码封装起来,减少重复代码量。
C++函数语法:
返回值类型 函数名(参数列表)
{
函数体语句
return 表达式
}
下面示例包含了函数声明、函数定义、函数调用、函数形参与实参、参数值传递、函数常见样式(无参无返、无参有返、有参无返及有参有返)。
#includeusing 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; }
输出结果
Go语言函数调用函数:两数相加: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 = %dn", x, y)
fmt.Println("--- 实参通过接收函数返回值交换数据 ---")
x, y = swap1(x, y)
fmt.Printf("调用函数可以有多个返回值(返回值写法1 - 返回值没有定义名称) - 实现两数交换: x = %d, y = %dn", x, y)
x, y = swap1(x, y)
fmt.Printf("调用函数可以有多个返回值(返回值写法2 - 返回值定义名称) - 实现两数交换: x = %d, y = %dn", x, y)
}
//定义函数(参数为形参)
func add(a int, b int) int {
return a + b
}
//定义函数(值传递):交换两个数值(参数值传递,形参发生改变不影响实参)
func swap(a int, b int) {
fmt.Printf("交换前形参:a = %d, b = %dn", a, b)
a, b = b, a
fmt.Printf("交换后形参:a = %d, b = %dn", 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放在一个公共文件中,供其他文件调用。
C++ 分文件编写 (1)创建.h头文件在解决方案中,右键单击“头文件” -> 选择“添加” -> 选择“新建项”,如下图所示:
选择“头文件” -> 修改文件名称(.h结尾) -> 单击“添加”按钮,如下图所示:
(2)在.h头文件声明函数
#include(3)创建.cpp源文件using namespace std; //两数交换函数声明 void swap(int a, int b);
在源文件中创建swap.cpp文件,与创建头文件几乎相同,在学习(一)时已经演示过了,此处不再赘述。
(4)在.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;
}
(5)测试主函数调用(另一个.cpp文件)
创建一个新的.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; }
输出结果
Go语言调用其它包中的函数 (1)创建公共函数调用头文件中声明的函数 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 = %dn", a, b)
a, b = b, a
fmt.Printf("交换后形参:a = %d, b = %dn", a, b)
}
(2)调用公共函数注:在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



