c++学习------c++的引用

1、什么是引用?

通俗来讲,引用就是给一个已有的变量取别名,它与引用的变量共用一段内存。打个比方,你学名叫张三,你还有个小名叫铁柱。虽然名字不一样,但两个都是你。

2、引用的初始化

引用在定义的时候就要初始化,也就是一上来就要明确它是谁的别名。

注意:它引用的变量一定要在它之前定义。举个例子,你要先定义一个变量的名字为a,才能给这个变量a取其他名字。

#include <iostream>
using namespace std;
int main()
{
    int a = 9;
    int &b = a;//正确的定义,定义的同时初始化,且a的定义在引用定义之前
    cout<<b<<endl;
    return 0;
}

这就是正确的定义方法。引用在初始化后,不可以改变。以上面的代码为例,b初始化为a的别名以后只能是a的别名,不能是其他变量的别名。但是a可以有多个别名。

打个比方,你叫张三,你小名可以叫铁柱,二牛,狗剩等等多个小名。但是铁柱,二牛,狗剩这些名字做了你的小名以后就不能做别人的小名了。

3、引用做函数参数

看下面这段代码:

#include <iostream>
using namespace std;
void swap0(int x, int y)//值传递
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}
int main()
{
    int a = 9;
    int b = 6;
    cout<<"a:"<<a<<"b:"<<b<<endl;
    swap0(a, b);
    cout<<"a:"<<a<<"b:"<<b<<endl;
    return 0;
}

运行结果:

a:9b:6
a:9b:6

如我们所料,值传递的方式不能交换a和b的值。我们再来看看引用传递:

#include <iostream>
using namespace std;
void swap0(int &x, int &y)//引用传递
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}
int main()
{
    int a = 9;
    int b = 6;
    cout<<"a:"<<a<<"b:"<<b<<endl;
    swap0(a, b);
    cout<<"a:"<<a<<"b:"<<b<<endl;
    return 0;
}

运行结果:

a:9b:6
a:6b:9

引用传递的方式可以交换a和b的值,因为传引用的方式不会在函数体中开辟新的内存来处理,而是用原来的那片内存处理,和指针传递的方式实现效果一样。如何理解刚刚这句话呢,我们来看看这段代码:

include <iostream>
using namespace std;
void swap0(int &x, int &y) //引用传递
{
    int temp;
    temp = x;
    x = y;
    y = temp;
    cout<<__func__<<"  "<<"a:"<<&x<<"b:"<<&y<<endl;
}
void swap1(int *x, int *y) //指针传递
{
    int temp;
    temp = *x; 
    *x = *y; 
    *y = temp;
    cout<<__func__<<"  "<<"a:"<<x<<"b:"<<y<<endl;
}

void swap2(int x, int y) //值传递
{
    int temp;
    temp = x;
    x = y;
    y = temp;
    cout<<__func__<<"  "<<"a:"<<&x<<"b:"<<&y<<endl;
}

int main()
{
    int a = 9;
    int b = 6;
    cout<<__func__<<"  "<<"a:"<<&a<<"b:"<<&b<<endl;
    swap0(a , b); 
    swap1(&a , &b);
    swap2(a, b); 
    return 0;
}

我们分别用指针传递,引用传递和值传递的方式交换a和b的值,并在main函数中打印a和b的地址,我们又在三个函数内部打印传进去的参数的地址,程序运行的结果如下:

main  a:0x7ffe8cce44d0b:0x7ffe8cce44d4
swap0  a:0x7ffe8cce44d0b:0x7ffe8cce44d4
swap1  a:0x7ffe8cce44d0b:0x7ffe8cce44d4
swap2  a:0x7ffe8cce44acb:0x7ffe8cce44a8

可以看到引用传递和指针传递操作的内存是同一块内存,而值传递的函数里面操作的是一块新的内存,函数运行结束后这块内存就被释放了。这也解释了为什么指针传递和引用传递可以修改原来变量的值而值传递无法修改原来的值。

4、引用的优点

简化指针修改实参。

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值