C++入门之引用(&)

我们都知道引用的符号是&,而它还有另外两个含义(取地址和按位与),我们应该如何去区分它们呢?简单来说:

按位与存在于变量与变量之间

int a ,b;
a&b; //&存在于变量与变量之间

与地址存在于变量之前

int a,b;

Add(&a,&b); //变量之前

引用存在于类型与变量之间

int a = 1;

int& b = a;

int& c = b;

注意:引用一定要进行初始化 

一.引用的概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空
间,它和它引用的变量共用同一块内存空间。
可以理解为鲁迅和周树人的关系,周树人是鲁迅的引用(别名),都指的是一个人。

类型& 引用变量名(对象名) = 引用实体

int main()
{
    int a = 10;
    int& ra = a; //引用的基本书写形式,ra是a的引用(别名)
    return 0;
}

注意:引用类型必须和引用实体是同种类型,比如上方都是int。

二:引用特性

  1. 引用在定义时必须初始化。
  2. 一个变量可以有多个引用。     
  3. 引用一旦引用一个实体,再不能引用其他实体。(引用定义后不能改变指向)

引用了一个实体,相当于周树人已经是鲁迅的引用(别名)了,无法在成为另一个人的引用          (别名)

三:常引用

常引用就是用const修饰或初始化为一个常量的引用,常引用无法对变量的值进行修改,起到保护变量或常量的作用,主要涉及到权限的放大缩小问题

引用变量,权限只能缩小,不能放大,加上const就代表权限缩小了

void TestConstRef()
{
    const int a = 10;//权限缩小
    //int& ra = a; // 该语句编译时会出错,权限无法放大,要加上const
    const int& ra = a;

    // int& b = 10; // 该语句编译时会出错,b为常量,因该加const修饰
    const int& b = 10;

   
}

四:引用的使用场景:

        1.作参数

void Swap(int& left, int& right)//一定程度上代替了指针
{
    int temp = left;
    left = right;
    right = temp;
}

        2.做返回值

int add()
{
    int a = 1;
    return a;
}

int main()
{
    int b = add();
    return 0;
}

我们以前常用传值返回的方式,但这样有一样弊端,以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。,为了增加效率,我们可以采用引用返回

int& Func()   // 错误
{             //返回了n的别名,但n出了函数作用域就被销毁了
    int n = 1;//n所在的空间还在,但访问的值却不一定是1
    return n; //会造成野指针的访问
}

int & Func()//正确
{           //static修饰出了函数作用域也不会被销毁
    static int n = 1;
    return n;
}

int main()
{
    int& ret = Func();
    return 0;
}

 五:引用和指针的区别

在语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。
但在底层实现上实际是有空间的,因为引用是按照指针方式来实现的。


语法上的区别

  1. 引用是别名不开空间,指针是地址要开空间。
  2. 引用必须初始化,指针不用。
  3. 引用不可以改变指向,指针可以
  4. 引用更加安全,不存在空引用,存在空指针,指针容易造成野指针,引用不易造成野引用
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数。
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。

底层上的区别

  1. 引用底层由指针实现。
  2. 引用的语法含义和底层是背离的
  3. 从汇编层面,没有引用,都是指针,引用在编译后也会变成指针
     
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值