C++中的值传递和引用传递

在C++中,每当我们将一个简单的变量从一个函数传递给另一个函数时,该函数将获取一个调用值的副本(copy)。在函数中会为参数分配一个新值会更改本地变量,但对调用参数没有影响。或者我们换个角度去理解:我们在用变量作为函数参数的时候,我们是默认通过值传递的,这个时候系统把值的副本传递给函数作为参数,但是我们都知道在函数的内部,变量称为本地变量(local variable),当函数执行完毕,这个变量就会消失,所以说至始至终都跟原本的参数没有任何的关系,自然也不存在改变它的值了。
例如,如果我们尝试实现使用代码将变量初始化为零的过程:

void setToZero(int var) {
var = 0;
}

当我们执行 setToZero(x);时,x的值在后面是不会被置为0的。

我们的程序是从上往下执行的,如果说我们不能返回改变后的值,那么写这些函数的意义又在哪里呢?所以肯定是有方法的。如果我们有足够的原因要更改调用参数的值,我们可以通过添加 & 将参数从通常类型的C++参数(称为值参数( value parameter))更改为引用参数(reference parameter) 位置在函数头中的类型和名称之间。 与值参数不同,引用参数不被复制。反而发生的是,该函数接收到对原始变量的引用,这意味着用于该变量的内存,在函数和其调用者之间共享。新版本的setToZero看起来像这样:

void setToZero(int & var) {
var = 0;
}

下面我们来段更加直观的代码来展示一下:

#include <iostream>
using namespace std;
/*function prototype*/
void binky(int x, int y);
void binky1(int &x, int y);
void binky2(int &x, int &y);
int main() {
    int a = 4, b = 20;
    binky(a, b);
    cout << "值传递后,a和b的值分别为:" << endl;
    cout << a << "  " << b << endl;
    cout << "将a设为引用参数后,a和b的值分别为:" << endl;
    binky1(a, b);
    cout << a << "  " << b << endl;
    /*我们下面调用的方法,两者都是引用参数,但是上一个函数的a为引用,就会执行函
    *数后,改变它的值,所以接下来的函数的a是上一个函数已经改变的a,但是b为值传递
    *所以b不受影响仍然为20。*/
    binky2(a, b);
    cout << "将a和b都设为引用参数后,a和b的值分别为:" << endl;
    cout << a << "  " << b << endl;
    return 0; 
}
void binky(int x, int y) {
    x *= 2;
    y = 0;
}
void binky1(int &x, int y) {
    x *= 2;
    y = 0;
}
void binky2(int &x, int &y) {
    x *= 2;
    y = 0;
}

运行的结果为:
这里写图片描述

总结

总之就是,函数的默认参数传递方式是值传递,这种方式不会改变调用函数后参数的值。当我们希望改变参数的值,并返回给主调函数的时候,我们可以使用引用参数。下面贴上一个帮你决定使用哪种参数的图:
这里写图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值