1. C++函数参数传递方式
在C++中,函数参数传递的方式主要有值传递、指针传递和引用传递三种。
值传递是指将实参的值通过复制的方式传递给形参,函数内部对形参的修改不会影响实参。
void swap(int a, int b){
int temp = a;
a = b;
b = temp;
}
int main(){
int x = 3, y = 5;
swap(x, y);
cout << "x:" << x << " y:" << y << endl;
return 0;
}
以上代码输出结果为:x:3 y:5,说明函数swap并没有对x和y的值进行修改。
指针传递是指将实参的地址传递给形参,函数内部通过指针间接对实参进行修改。
void swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
int main(){
int x = 3, y = 5;
swap(&x, &y);
cout << "x:" << x << " y:" << y << endl;
return 0;
}
以上代码输出结果为:x:5 y:3,说明函数swap成功地将x和y的值互换。
引用传递是指将实参的别名(即引用)传递给形参,函数内部通过引用直接对实参进行修改。
void swap(int &a, int &b){
int temp = a;
a = b;
b = temp;
}
int main(){
int x = 3, y = 5;
swap(x, y);
cout << "x:" << x << " y:" << y << endl;
return 0;
}
以上代码输出结果为:x:5 y:3,说明函数swap成功地将x和y的值互换。
2. 函数参数传递选择
2.1 值传递
值传递适用于不需要修改实参值的场合,也适用于实参是常量或者临时变量的场合。由于值传递需要进行复制,对于大型的结构体或者类对象会带来较大的时间和空间开销,因此不适用于这些场合。
2.2 指针传递
指针传递适用于需要在函数内部修改实参值的场合,也适用于实参是数组的场合。由于指针传递需要进行指向操作,容易出现指向错误,因此需要注意指针为空或者指向非法地址的情况。
2.3 引用传递
引用传递适用于需要在函数内部修改实参值的场合,也适用于实参是大型结构体或者类对象的场合。引用传递与指针传递的效果相同,但是可以避免指针引起的指向错误,因此通常优先选择引用传递。
3. 函数参数常量传递
函数参数可以是常量类型,常量参数既可以传递给常量形参,也可以传递给非常量形参。
void printArray(const int arr[], int len){
for(int i = 0; i < len; i++){
cout << arr[i] << " ";
}
cout << endl;
}
int main(){
int arr[5] = {1, 2, 3, 4, 5};
printArray(arr, 5);
return 0;
}
以上代码中,函数printArray的第一个参数arr是常量指针,表示不能通过该指针修改数组中元素的值。
4. 函数参数默认值
函数参数可以设置默认值,这样调用函数时可以省略这些参数。
void print(int num, char ch = '*'){
for(int i = 0; i < num; i++){
cout << ch;
}
cout << endl;
}
int main(){
print(5);
print(5, '+');
return 0;
}
以上代码中,函数print的第二个参数ch有默认值'*',当调用函数时只传递一个参数时,ch自动使用默认值。
5. 可变参数函数
C++11引入了可变参数函数,使得函数可以接受不定数量的参数。
#include<stdarg.h>
double average(int count, ...){
va_list args;
va_start(args, count);
double sum = 0;
for(int i = 0; i < count; i++){
sum += va_arg(args, int);
}
va_end(args);
return sum / count;
}
int main(){
cout << average(5, 1, 2, 3, 4, 5) << endl;
return 0;
}
以上代码中,函数average接受一个整数count和任意数量的整型参数,使用可变参数实现。通过va_start、va_arg和va_end宏函数来访问可变参数列表,实现参数的遍历访问。
6. 总结
函数参数传递方式对程序的性能和可维护性都有一定的影响。在选择函数参数传递方式时,应该根据实际场景进行选择,必要时可以使用const关键字保护参数的值不被修改。同时,函数参数可以设置默认值和使用可变参数实现不定数量的参数传递,这些功能也有助于提高程序的灵活性。