C++ 引用传递

以前对引用传递一知半解,尤其是 & 符号。现在做一下梳理。

Get idea from here.

先来看下 alias:

int i = 5;
int &j = i;  // j is an alias to i

j = 5;

这里 j 就是 i 这个变量的另一个名字。所以这个对象现在有两个名字 i 和 j.

现在就好理解引用传递了。用这种方法,形参就变成了实参的一个 alias.

 1 #include<iostream>
 2 using namespace std;
 3 //值传递
 4  void change1(int n){
 5     cout<<"值传递--函数操作地址"<<&n<<endl;         //显示的是拷贝的地址而不是源地址 
 6     n++;
 7 }
 8 
 9 //引用传递
10 void change2(int & n){
11     cout<<"引用传递--函数操作地址"<<&n<<endl; 
12     n++;
13 }
14  //指针传递
15 void change3(int *n){
16      cout<<"指针传递--函数操作地址 "<<n<<endl; 
17     *n=*n+1;
18  } 
19 int     main(){
20     int n=10;
21     cout<<"实参的地址"<<&n<<endl;
22     change1(n);
23     cout<<"after change1() n="<<n<<endl;
24     change2(n);
25     cout<<"after change2() n="<<n<<endl;
26     change3(&n);
27     cout<<"after change3() n="<<n<<endl;
28     return true;
29 }
### C++ 引用传递与值传递的区别 #### 1. 定义上的差异 值传递是指将实参的副本传入函数内部,因此函数内的任何修改都不会影响到外部的实际变量[^1]。而引用传递则是将实参本身作为参数传递给函数,在这种情况下,函数可以直接操作原始数据,而不是其拷贝[^3]。 #### 2. 性能对比 由于值传递会创建一份新的副本,当处理大型对象或复杂结构体时,可能会带来较大的性能开销。相比之下,引用传递不会复制数据,从而减少了内存占用并提高了效率[^4]。 #### 3. 修改行为的不同 在值传递模式下,即使函数内部对形参进行了更改,这些变化也不会反映回调用者处;然而对于引用传递而言,所有的改动都会直接影响到原变量[^5]。 ```cpp #include <iostream> using namespace std; void valuePass(int b){ b += 10; } void referencePass(int& c){ c += 10; } int main(){ int x=5,y=7; cout << "Before Value Pass: "<< y<< endl; valuePass(y); cout << "After Value Pass: "<<y<<endl; cout << "\nBefore Reference Pass:"<<x<<endl; referencePass(x); cout << "After Reference Pass:"<<x<<endl; return 0; } ``` 上述代码展示了两种不同的效果:`valuePass()` 对 `b` 的增加并不会作用于全局变量 `y`, 而 `referencePass()` 则确实改变了 `x`. #### 4. 类型安全性和多态支持 使用引用的方式还可以避免类型截断问题,并且可以在涉及继承体系的时候保持正确的动态绑定机制。 --- ### § - **适合使用值传递的情况** 当不需要改变源数据或者希望保护输入免受意外篡改时可以选择此方法。 - **推荐应用引用传递的情形** 如果目标是对现有资源做出实质性的调整,则应该优先考虑引用形式来减少不必要的计算成本以及提升程序执行速度。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值