传值调用和引用调用是函数参数传递的两种方式。
1. **传值调用:**
- 在传值调用中,函数的参数是被传递值的副本。
- 当函数被调用时,实际参数的值被复制到形式参数中。在函数内部,对形式参数的任何修改都不会影响到实际参数。
- 传递基本数据类型(如整数、浮点数等)时,通常使用传值调用。
void square(int num) {
num = num * num;
}
int main() {
int x = 5;
square(x);
// x 不受 square 函数的影响,仍然是 5
return 0;
}
#include "iostream.h"
void swap(int a, int b)
{ int temp;
temp=a;
a=b;
b=temp;
}
main()
{ int x=5, y=10;
cout<<"before x="<<x<<" y="<<y<<endl;
swap(x,y);
cout<<"after x="<<x<<" y="<<y<<endl;
}
2. **引用调用:**
引用:给对象取一个别名,主要用于: 独立引用 作为参数传递
- 在引用调用中,函数的参数是实际参数的引用。
- 当函数被调用时,形式参数的引用被绑定到实际参数,对形式参数的修改会直接影响到实际参数。
- 传递大型数据结构或对象时,使用引用调用可以避免复制整个对象,提高效率。
独立引用:
一般形式:基类型 &引用名 = 标识符; 为“标识符”所代表的变量声明一个叫“引用名”的别名
void addTen(int &num) {
num += 10;
}
int main() {
int y = 7;
addTen(y);
// y 的值变为 17,因为 addTen 函数中引用了 y
return 0;
}
#include "iostream.h"
void swap(int& a, int& b)
{ int temp;
temp=a;
a=b;
b=temp;
}
main()
{ int x=5, y=10;
cout<<"before x="<<x<<" y="<<y<<endl;
swap(x,y);
cout<<"after x="<<x<<" y="<<y<<endl;
}
总的来说,传值调用适用于基本数据类型,而引用调用适用于需要修改实际参数或者避免复制大型对象的情况.
代码验证
#include<iostream>
using namespace std;
void f(int& x, int y)
{
x = x + y; y = x % y;
cout << x << '\t' << y << endl;
}
void main()
{
int x, y;
x = 1; y = 2;
f(x, y); cout << x << '\t' << y << '\t' << endl;
f(y, x); cout << x << '\t' << y << '\t' << endl;
}
分析:初始时x=1 y=2
x=1+2=3;y=3%2=1 但y是传值调用 不改变原y的值
所以第二行x=3 y=2;
第二次调用y是引用传递 会改变y的值
y=2+3=5;x=5%3=2
第四行输出x的原值3 y的引用改变值5