函数的参数
课上练习
知识总结
L2-10.函数的参数-知识总结
函数的参数-知识总结 函数的参数 函数的参数就是函数可以获得的细节信息,写在函数名后的括号内。
形式参数 在函数声明和函数定义中的参数叫做形式参数,形式参数代表一个类别,即函数可以接受什么样的信息。形式参数就像函数内的其他局部变量一样,在进入函数时被创建,退出函数时被销毁。
实际参数 如果定义了有参数的函数,那么在使用函数,也就是调用函数的时候必须传入其所需要的参数,由于该数值决定了函数的实际运算结果,所以我们称调用函数时传入的参数为实际参数。
该过程可以理解为,将实际参数中的数值赋值给形式参数,然后利用形式参数去计算。
1//函数声明
2void 函数名(参数1类型 形式参数1,参数2类型 形式参数2);
3
4int main() {
5 //主函数内调用
6 函数名(实际参数1,实际参数2);
7 return 0;
8}
9
10//函数定义void 函数名(参数1类型 形式参数1,参数2类型 形式参数2) { 函数内代码
}传参方式 按值传参 按值传递是指将实际参数的值复制一份传递给函数参数。函数内部对参数的修改不会影响到原来的实际参数。
优点: 简单、易于理解。 不会改变实际参数的值。 缺点: 复制操作可能会带来性能开销,特别是对于大型对象。
按值传参代码示例:
1void foo(int x) {
2 x = 20;
3}
4
5int main() {
6 int a = 10;
7 foo(a);
8 // a的值依然是10
9 return 0;
10}引用传参 按引用传递是指将实际参数的引用传递给函数参数,函数内部对参数的修改会直接影响到实际参数。
优点: 没有复制开销,适合传递大型对象。 函数内部可以直接修改实际参数。 缺点: 需要小心引用带来的副作用,可能导致原数据被意外修改。
引用传参代码示例:
1void foo(int &x) {
2 x = 20;
3}
4
5int main() {
6 int a = 10;
7 foo(a);
8 // a的值被修改为20
9 return 0;
10}特殊参数 默认参数 默认参数在函数声明中指定,如果函数定义与声明分开,默认参数只能在声明中指定。
默认参数代码示例:
1#include <iostream>
2using namespace std;
3
4void displayInfo(string name = "Unknown", int age = 0) {
5 cout << "Name: " << name << ", Age: " << age << endl;
6}
7
8int main() {
9 displayInfo(); // 输出:Name: Unknown, Age: 0
10 displayInfo("Bob"); // 输出:Name: Bob, Age: 0
11 displayInfo("Charlie", 30); // 输出:Name: Charlie, Age: 30
12 return 0;
13}默认参数注意事项: 默认参数必须从右向左依次指定。例如,不能为第一个参数指定默认值而不给第二个参数指定默认值。
void func(int a, int b = 10, int c = 20); // 正确
// void func(int a = 10, int b, int c = 20); // 错误如果函数的声明和定义分离,默认参数只能在声明中指定。
1// 函数声明
2void showMessage(string message = "Hello");
3
4// 函数定义
5void showMessage(string message) {
6 std::cout << message << std::endl;
7}
8
9int main() {
10 showMessage(); // 输出:Hello
11 showMessage("Hi there!"); // 输出:Hi there!
12 return 0;
13}数组参数 数组参数虽然是以按值传单的方式传递进函数的,但是在函数内部修改数组元素时,函数外部也会发生变化。
数组传参代码示例:
1#include <iostream>
2using namespace std;
3
4// 使用 int a[] 作为参数的函数,可以修改数组元素
5void modifyArray(int a[], int size) {
6 for (int i = 0; i < size; ++i) {
7 a[i] += 10; // 每个元素加10
8 }
9}
10
11int main() {
12 int arr[] = {1, 2, 3, 4, 5};
13 int size = sizeof(arr) / sizeof(arr[0]);
14
15 // 修改数组元素
16 modifyArray(arr, size);
17
18 // 输出修改后的数组,11 12 13 14 15
19 for (int i = 0; i < size; ++i) {
20 cout << arr[i] << (i + 1 == size ? "\n" : " ");
21 }
22 return 0;
23}注意事项: 在函数声明中仅需要加上中括号表示出传递参数为数组即可,不需要写明具体的数组大小 需要添加数组大小的参数,辅助数组操作 在函数内修改数组元素后,函数外部也会发生变化
️课后作业
☝️单选作业
错误的题目要弄懂,不会的千万要来问老师⚠️
✌️总结作业
总结作业非常重要,请务必认真完成✔️
- 函数的形式参数是指什么参数?
- 函数的实际参数是指什么参数?
- 按值传参和引用传参的区别是什么?
- 当参数是数组时有什么特别之处?
- 参数的默认值应该如何设置?
👌编程作业
考试只有一次提交机会,请务必本地检查正确后再提交❇️
👌编程作业标准答案
函数的参数-选择题
函数的参数-选择题 下面有关函数参数的说法,正确的是( )。 A. 函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中的参数值不变。 B. 函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中的参数值将随子函数一样改变而改变。 C. 函数参数传递时,主函数如果将参数的地址传递给子函数,若子函数将参数值改变,主函数当中的参数值将不改变。 D. 函数参数传递可以不满足子函数的参数个数要求
在C++语言中 ,在函数调用时 ,通过引用传递的参数不会复制实际参数, 因此不会额外占用内存。 A. 正确 B. 错误
在C++中,如果函数的返回类型声明为int,它必须返回什么类型的值? A. 整数 B. 浮点数 C. 字符 D. 布尔值
在C++中,如何为函数参数提供默认值? A. 在函数声明时指定默认值 B. 在函数定义时指定默认值 C. 在函数调用时指定默认值 D. 不能为函数参数提供默认值
在C++中,引用传参的主要好处是什么? A. 提高程序运行速度 B. 减少内存占用 C. 允许函数修改传递的参数 D. 增加程序的安全性
在C++中,函数参数按值传递意味着什么? A. 函数可以直接修改传递的变量 B. 函数接收的是变量的副本 C. 函数接收的是变量的直接引用 D. 函数参数将变为全局变量
如何声明一个 void 函数并接受两个整数参数的函数 sum?
A. void sum(int a, int b);
B. sum(int a, int b);
C. void sum(a, b);
D. sum(int a; int b);如果函数 calculate 的声明为 int calculate(int x, int y = 10),哪种调用是有效的?
A. calculate(5);
B. calculate();
C. calculate(5, ,20);
D. calculate(,20);为什么在C++中使用引用作为函数参数? A. 为了避免复制大型对象 B. 为了增加函数的效率 C. 为了允许函数修改传递的参数 D. 所有上述原因
如何在C++中声明一个接受引用参数的函数 modifyValue?
A. void modifyValue(int& val);
B. void modifyValue(int val);
C. void modifyValue(int* val);
D. void modifyValue(&int val);L2-09.函数的参数-选择题答案
L2-09.函数的参数-选择题答案 A 解析:在值传递方式下,主函数将参数的一个副本传递给子函数。子函数对这个副本所做的任何修改都不会影响到主函数中的原始参数。 B 解析:虽然引用传参时不会复制实参,但是存储引用参数的名字本身需要占用内存,因此当调用引用传参的函数时,其参数也会占用内存。 A 解析:在C++中,如果函数的返回类型声明为int,它必须返回整数值。 A 解析:正确的方法是在函数的声明中指定默认值,而不是在定义中。这样做是为了在函数声明可见的任何地方调用函数时,都能知道参数的默认值。 C 解析:通过引用传递参数可以让函数修改被传递的参数。此题中A、B、C选项都是引用传参的好处,但是最主要的好处是C。 B 解析:通过值传递参数时函数调用时实际访问的是参数的副本 A 解析:A选项指定了返回类型为void,函数名为sum,并且接受两个整数参数a和b。 A 解析:此声明中,只有b有默认值,因此必须至少提供a的值。 D 解析:A、B、C三个选项都是C++中使用引用作为函数参数的原因。 A 解析:A选项指定了返回类型为void,函数名为modifyValue,并且接受一个整数引用参数val。
L2095题解+参考代码
L2095题解+参考代码 题目链接 求三个数的大小顺序(使用引用):L2095
题解 我们可以定义一个函数来排序三个数,并使用引用参数来实现。这样可以直接在主函数中调用该函数,并获得按从大到小顺序排列的三个数。
算法步骤 定义函数 sortDescending: 参数:三个整数引用 a、b 和 c。 通过比较和交换的方法,将 a、b 和 c 排序。 读取输入:读取三个整数 a、b 和 c。 调用函数 sortDescending:对三个整数进行排序。 输出结果:按从大到小的顺序输出三个整数。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4// 定义函数,将三个整数按从大到小的顺序排列
5void sortDescending(int &a, int &b, int &c) {
6 if (a < b) swap(a, b);
7 if (a < c) swap(a, c);
8 if (b < c) swap(b, c);
9}
10
11int main() {
12 // 读取输入
13 int a, b, c;
14 cin >> a >> b >> c;
15
16 // 调用函数进行排序
17 sortDescending(a, b, c);
18
19 // 输出结果
20 cout << a << " " << b << " " << c << endl;
21
22 return 0;
23}L2096题解+参考代码
L2096题解+参考代码 题目链接 数组元素的删除:L2096
题解 题目要求我们删除一组大小为 n 的数据中第 x 个位置的元素,并输出更新后的数组。我们可以使用函数来实现这个任务。
算法步骤 定义函数 deleteElement: 输入:整数数组 arr,数组大小 n,要删除的元素位置 x。 输出:更新后的数组(通过引用修改数组)。 通过循环将第 x 个位置之后的元素依次向前移动一个位置。 减少数组大小 n。 读取输入: 读取数组大小 n。 读取包含 n 个整数的数组。 读取要删除的元素位置 x。 调用函数 deleteElement: 使用输入的数组、数组大小 n 和位置 x 作为参数调用函数 deleteElement。 输出结果: 输出更新后的数组,数字间以空格分隔。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4// 定义删除元素的函数
5void deleteElement(int arr[], int &n, int x) {
6 for (int i = x - 1; i < n - 1; ++i) {
7 arr[i] = arr[i + 1];
8 }
9 --n; // 更新数组大小
10}
11
12int main() {
13 // 读取输入
14 int n;
15 cin >> n;
16 int arr[10];
17 for (int i = 0; i < n; ++i) {
18 cin >> arr[i];
19 }
20 int x;
21 cin >> x;
22
23 // 调用函数删除元素
24 deleteElement(arr, n, x);
25
26 // 输出结果
27 for (int i = 0; i < n; ++i) {
28 cout << arr[i] << " ";
29 }
30 cout << endl;
31
32 return 0;
33}