“按引用传递”或“按值传递”是什么意思?这些参数有何区别?
示例:
class Dog
{
public:
barkAt( const std::string& pOtherDog ); // const reference
barkAt( std::string pOtherDog ); // value
};
const &
。这样就不会产生构造和销毁的开销。如果引用不是const,则表明您的接口将更改传入的数据。1. 传值调用 / 值传递
void printvalue(int x)
{
x = x + 1 ;
cout << x ; // 6
}
int x = 5;
printvalue(x);
cout << x; // 5
printvalue(x)
,即参数为5
时,它会被复制到void printvalue(int x)
。现在,我们有两个不同的值5
和复制的值5
,这两个值存储在不同的内存位置。因此,如果你在void printvalue(int x)
内部进行任何更改,它不会反映回参数。
2. 引用传递/按引用调用
void printvalue(int &x)
{
x = x + 1 ;
cout << x ; // 6
}
int x = 5;
printvalue(x);
cout << x; // 6
&
即地址运算符。通过执行void printvalue(int &x)
,我们引用了x
的地址,这告诉我们它们都指向同一位置。因此,在函数内部进行的任何更改都会反映在外部。 void printvalue(int* x)
{
*x = *x + 1 ;
cout << *x ; // 6
}
int x = 5;
printvalue(&x);
cout << x; // 6
int* x
持有传递给它的地址 printvalue(&x)
。因此,在函数内部进行的任何更改都会反映在外部。这里有一个示例,演示了按值传递 - 指针值 - 引用之间的区别:
void swap_by_value(int a, int b){
int temp;
temp = a;
a = b;
b = temp;
}
void swap_by_pointer(int *a, int *b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void swap_by_reference(int &a, int &b){
int temp;
temp = a;
a = b;
b = temp;
}
int main(void){
int arg1 = 1, arg2 = 2;
swap_by_value(arg1, arg2);
cout << arg1 << " " << arg2 << endl; //prints 1 2
swap_by_pointer(&arg1, &arg2);
cout << arg1 << " " << arg2 << endl; //prints 2 1
arg1 = 1; //reset values
arg2 = 2;
swap_by_reference(arg1, arg2);
cout << arg1 << " " << arg2 << endl; //prints 2 1
}
“传递引用”方法有一个重要的限制。如果一个参数被声明为按引用传递(因此它前面带有 & 符号),则其对应的实际参数必须是一个变量。
对于“按值传递”的形式参数,实际参数可以是表达式,因此不仅可以使用变量,还可以使用字面量甚至函数调用的结果。
函数无法将值放入除变量之外的其他地方。它不能给字面量赋新值或强制表达式改变其结果。
PS:您还可以查看Dylan Beattie在当前线程中的答案,他用简单的语言解释了这个问题。
这个问题是“vs”。
而且没有人指出一个重要的点。在传递值时,需要占用额外的内存来存储传递的变量值。
而在传递引用时,不需要为值占用额外的内存(在某些情况下具有内存效率)。