基础而丰富的C++参数传递方法指南
2023-10-29 17:08:24
在编程中,函数参数是传递给函数的数据。函数可以使用这些参数来执行计算或操作。在 C++ 中,有三种向函数传递参数的方法:值传递、引用传递和指针传递。
值传递
值传递是默认的参数传递方式。在这种方式下,实参的值被复制到形式参数中。这意味着实参和形式参数是两个独立的变量。对形式参数的任何修改都不会影响实参的值。
例如,以下代码演示了值传递:
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 10;
int y = 20;
swap(x, y);
cout << "x = " << x << endl; // 输出:10
cout << "y = " << y << endl; // 输出:20
}
在上面的代码中,swap
函数接受两个整型参数 a
和 b
。当调用 swap
函数时,x
和 y
的值被复制到 a
和 b
中。函数 swap
内部交换了 a
和 b
的值,但因为是值传递,所以对 a
和 b
的修改不会影响 x
和 y
的值。因此,在 main
函数中,x
和 y
的值仍然是 10 和 20。
引用传递
引用传递是一种更有效率的参数传递方式。在这种方式下,形式参数是指向实参的引用。这意味着形式参数和实参是同一个变量。对形式参数的任何修改都会直接影响实参的值。
要声明引用参数,需要在参数类型前面加上一个 &
符号。例如,以下代码演示了引用传递:
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 10;
int y = 20;
swap(x, y);
cout << "x = " << x << endl; // 输出:20
cout << "y = " << y << endl; // 输出:10
}
在上面的代码中,swap
函数接受两个整型引用参数 a
和 b
。当调用 swap
函数时,x
和 y
的引用被复制到 a
和 b
中。函数 swap
内部交换了 a
和 b
的值,因为是引用传递,所以对 a
和 b
的修改直接影响 x
和 y
的值。因此,在 main
函数中,x
和 y
的值都变成了 20 和 10。
指针传递
指针传递也是一种参数传递方式。在这种方式下,形式参数是指向实参的指针。这意味着形式参数可以访问实参的值,但不能直接修改实参的值。要修改实参的值,需要通过指针来修改。
要声明指针参数,需要在参数类型前面加上一个 *
符号。例如,以下代码演示了指针传递:
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 10;
int y = 20;
swap(&x, &y);
cout << "x = " << x << endl; // 输出:20
cout << "y = " << y << endl; // 输出:10
}
在上面的代码中,swap
函数接受两个整型指针参数 a
和 b
。当调用 swap
函数时,x
和 y
的地址被复制到 a
和 b
中。函数 swap
内部交换了 a
和 b
指向的值,因为是指针传递,所以对 a
和 b
的修改直接影响 x
和 y
的值。因此,在 main
函数中,x
和 y
的值都变成了 20 和 10。
默认参数
默认参数允许函数在没有提供参数的情况下使用默认值。要声明默认参数,需要在参数类型后面加上一个 =
号,然后指定默认值。例如,以下代码演示了默认参数:
void print_name(string name = "John Doe") {
cout << "Hello, " << name << "!" << endl;
}
int main() {
print_name(); // 输出:Hello, John Doe!
print_name("Jane Doe"); // 输出:Hello, Jane Doe!
}
在上面的代码中,print_name
函数接受一个字符串参数 name
,并为其指定默认值 "John Doe"
。当调用 print_name
函数时,如果未提供参数,则使用默认值 "John Doe"
。否则,使用提供的参数值。
函数重载
函数重载允许函数具有相同的名称,但不同的参数列表。这允许函数根据不同的参数类型或数量执行不同的操作。例如,以下代码演示了函数重载:
void print_number(int number) {
cout << "The number is " << number << endl;
}
void print_number(double number) {
cout << "The number is " << number << endl;
}
int main() {
print_number(10); // 输出:The number is 10
print_number(3.14); // 输出:The number is 3.14
}
在上面的代码中,print_number
函数有两个重载版本。第一个版本接受一个整型参数,第二个版本接受一个双精度浮点型参数。当调用 print_number
函数时,编译器会根据提供的参数类型选择适当的重载版本。