语法

1返回类型 函数名称(参数1, 参数2, 参数3, ...参数N)
2{
3    函数功能;
4    return 返回值;
5}

参数类型

指针参数

非指针参数

 1#include<iostream>
 2
 3struct Role
 4{
 5	int Hp;
 6	int Mp;
 7};
 8
 9int exp(Role role) 
10{
11	return role.Hp + role.Mp;
12}
13
14int main()
15{
16	Role role;
17	role.Hp = 100;
18	role.Mp = 200;
19
20	int result = exp(role);
21	std::cout << "结果: " << result << std::endl;
22	
23	return 0;
24}

指针参数

 1#include<iostream>
 2
 3struct Role
 4{
 5	int Hp;
 6	int Mp;
 7};
 8
 9int exp(Role* role) 
10{
11	return role->Hp + role->Mp;
12}
13
14int main()
15{
16	Role role;
17	role.Hp = 100;
18	role.Mp = 200;
19
20	int result = exp(&role);
21	std::cout << "结果: " << result << std::endl;
22	
23	return 0;
24}

使用指针参数之后,计算速度提高?

数组参数

传参的时候如果(int a[]),这样写是无法获取到数组的大小的。

 1#include<iostream>
 2
 3void sort(int* a, unsigned size)
 4{
 5	for (int i = 0; i < size; i++)
 6	{
 7		for (int j = i; j < size; j++)
 8		{
 9			if (a[i] > a[j])
10			{
11				int temp = a[i];
12				a[i] = a[j];
13				a[j] = temp;
14			}
15		}
16	}
17}
18
19int main()
20{
21	int a[4]{ 6,5,7,4 };
22	sort(a, 4);
23
24	for (int i = 0; i < 4; i++)
25	{
26		std::cout << a[i] << std::endl;
27	}
28}

image-20220509221703390

引用参数

 1#include<iostream>
 2
 3struct Role
 4{
 5	int hp;
 6	int mp;
 7	int damage;
 8};
 9
10bool act(Role& acter, Role& beAct)
11{
12	 beAct.hp -= acter.damage;
13	 return beAct.hp < 0;
14}
15
16int main()
17{
18	Role user{ 200, 300, 500 };
19	Role monster{ 800, 300, 50 };
20	if (act(user, monster))
21	{
22		std::cout << "怪物死亡,获取经验值:xxxx" << std::endl;
23	}
24
25	return 0;
26}

区别:指针可以传入nullptr,而应用必须初始化。

 1#include<iostream>
 2
 3struct Role
 4{
 5	int hp;
 6	int mp;
 7	int damage;
 8};
 9
10// 如果需要在act中改变beAct的内容可以使用指正引用参数
11bool act(const Role* acter, Role*& beAct)
12{
13	beAct->hp -= acter->damage;
14    // beAct = (ROle*) &acter
15	return beAct->hp < 0;
16}
17
18int main() 
19{
20	Role user{ 200, 300, 900 };
21	Role monster{ 800, 300, 50 };
22
23	Role* pRole = &monster;
24
25	if (act(&user, pRole))
26	{
27		std::cout << "怪物死亡,获取经验值:xxxx" << std::endl;
28	}
29
30	return 0;
31}

默认实参

 1void sort(int arr[], unsigned count, bool bigSort=true)
 2{
 3    ...
 4}
 5
 6// 指定参数bigSort调用
 7sort(a, 10, true);
 8
 9// 使用参数默认值调用
10sort(b, 10);
11// bigSort参数的默认值是true

有默认值的参数必须放在参数列表的最后,否则无法知道该函数省略的到底是前面的参数还是后面的参数。

引用必须要给一个实例的地址,不可以随便指向。但是指针可以。

不定量参数

main函数

1int main(unsigned count, char* args[])
2{
3    
4}

自定义

引入头文件<cstdarg>

 1#include<iostream>
 2#include<cstdarg>
 3
 4int average(int count, ...)
 5{
 6	// va_list args; 等价于下面一句
 7	char* args;
 8    // 初始化args
 9	va_start(args, count);
10
11	int sum = 0;
12	for (int i{}; i < count; i++)
13	{
14        // 每调用一次va_arg, 指针向后移动一次
15        // 此时指向下一个参数
16		sum += va_arg(args, int);
17	}
18	
19    // 释放指针空间
20	va_end(args);
21	return sum / count;
22}
23
24
25int main()
26{
27	std::cout << "平均值="<< average(1,2,3,4,5) << std::endl;
28	return 0;
29}

第二种

封装参数

 1#include<iostream>
 2
 3struct SArg
 4{
 5	int count;
 6	char* args;
 7};
 8
 9int average(SArg& args)
10{
11
12	int count = args.count;
13	char* tempArgs = args.args;
14
15	int sum = 0;
16	for (int i{}; i < count; i++)
17	{
18		sum += (int)tempArgs[i];
19	}
20
21	return sum / count;
22}
23
24
25int main()
26{
27	SArg args;
28	args.count = 5;
29	args.args = new char[5]{1, 2,3,4,5};
30	std::cout << "平均值=" << average(args) << std::endl;
31	return 0;
32}

函数指针

定义

1函数返回类型 (*函数指针变量名)(参数类型 参数名称, ...参数类型 参数名称)
2    
3如:
4int (*pAdd) (int a, int b);
 1#include<iostream>
 2
 3// 声明一个函数指针类型
 4typedef int (*pfAdd)(int, int);
 5
 6// 声明一个函数指针类型
 7useing pfAdd = int (*)(int, int)
 8
 9int add_1(int a, int b)
10{
11	return a + b;
12}
13
14int add_2(int a, int b)
15{
16	return a * 10 + b;
17}
18
19float add_3(int a, int b)
20{
21	return (a + b) / 2;
22}
23
24int main()
25{
26	int (*pAdd) (int, int) = add_1;
27	std::cout << "结果=" << pAdd(1, 2) << std::endl;
28
29	pAdd = add_2;
30	std::cout << "结果=" << pAdd(1, 2) << std::endl;
31
32	pAdd = (int (*)(int, int))add_3;
33	std::cout << "结果=" << pAdd(1, 2) << std::endl;
34
35	pfAdd pAdd = (pfAdd)add_3;
36	std::cout << "结果=" << pAdd(1, 2) << std::endl;
37	return 0;
38}

结构体函数

参数是结构体

 1#include<iostream>
 2
 3// 声明一个函数指针类型
 4typedef int (*pfAdd)(int, int);
 5
 6struct Role
 7{
 8	int hp;
 9	int mp;
10};
11
12
13int add_4(Role role)
14{
15	return role.hp + role.mp;
16}
17
18int main()
19{
20	// 虽然add_4传入的是一个结构体,但实际上是还分开传值的开销较大
21	// 可以使用引用
22	pfadd = (pfAdd)add_4;
23	std::cout << "结果=" << pfadd(1, 2) << std::endl;
24	return 0;
25}
26
27输出:
28结果=3

函数本质

函数返回

返回指针

返回引用

右值引用

从函数角度认识栈

— END —