C++中的引用变量详解

声明及定义

[const] int& 变量名 = 右值
注意:[]内的是可选的。即这里的const限定词是可选的。

代码

void test01(){
    int a = 2;
    int& b = a;
    printf("\n");
    printf("value of a =%d\n",a);//2
    printf("value of b =%d\n",b);//2
    printf("address of a =%p\n",&a);//0073fde4
    printf("address of a =%p\n",&b);//0073fde4
    b = 3;
    printf("value of a =%d\n",a);//3
    printf("value of b =%d\n",b);//3
    int* const d = &b;//d是一个指向int类型的指针常量
    printf("address of d =%p\n",&(*d));//0073fde4
    printf("address of d =%p\n",d);//0073fde4
}

打印结果:
在这里插入图片描述

引用变量的特点

1.声明定义时,必须初始化。 不能 int& b;可以 int& b = 变量;
2.一旦指定指向某个变量,不能修改为指向其他变量,始终效忠此变量。
3.引用变量 是 所指向的变量的别名,即一个变量,有两个名称。根据其中一个名称修改其值,另一个也会跟着变。
4.虽然引用变量是所指向的变量的别名,但是它也占用内存,即有自己的内存块,其中存储的所指向的变量的地址,只是编译器,给我们做了优化,再执行&b时,直接访问的是所指向的变量的地址,而不是自己的分配的内存的地址。编译器把引用变量的内存给屏蔽掉了,我们无法访问,所以给我们产生了一种引用变量不占内存的假象。其实是占内存的。

图片解释

在这里插入图片描述

引用变量的本质

1.int a = 10;
2. int& b = a;
3. int * const c = &a;//将变量a的内存地址,赋值给 指针常量 c。指针常量的特点是,一旦确定指向,不可修改其指向,但可以,修改其指向的内存地址储存的值。
所以这里 引用变量b的作用 就和 c扮演的角色一样。只是这里在引用变量中把解引用符给隐藏了。这就是引用变量的特点及本质。我们用b,肯定比用 *c方便的多,是吧。 通过&b,我们可以获取变量a的地址,通过 &(*c) 我们也可以获取变量a的内存地址。所以引用变量的底层用到的就是 指针常量,只是这里编译器给我们特殊处理了。

引用变量的用途

1.最常用的是做为函数的参数,定义为 const int& b;使通过b只能读去变量内容,不能修改其内容。

类型 & 和 const 类型 & 的区别

类型 &:引用的是变量。也就是它的右值必须是一个具名的变量。也就是可以通过 &操作符 取地址的变量。
const 类型 &:可以引用的是变量,也可以引用的是常量或者不具名(匿名)的对象,也就是对它的右值的存在形式没有要求。是个万能引用类型。

    int a = 2;
    int& b1 = a;//correct
    const int& b2 = a;//correct
	
	
    const int c = 3;
    int& d1 = c;//error  当所引用的变量是 const限定的,这里的 引用变量定义时也必须是const的。
    const int& d2 = c;//correct
	
	//区别2
	int &d3 = 4;//error  右值不能是字面量,即确定的值
	const int& d4= 4;//correct ,右值可以是实数值,底层会先把右值赋值给一个临时变量,然后d4 所引用的变量就是这个临时变量。

注:const 类型 & 类型也称为万能引用类型

引用变量和宏定义(#define)的区别

区别就是在于 宏定义的内容,是在编译期,都被使用此宏定义的地方,替换掉了。所以 #define NUMBER 2; 这种代码将来是真正的不占内存的。而引用变量 ,上面也已介绍,表面看是不占内存,其实底层本质是占内存的。

引用类型和指针类型的区别

指针是C语言中就存在的数据类型,C++中的指针是从C语言中继承过来的二者无啥区别。
引用时C++语言中开始存在的数据类型,C语言中并不存在引用数据类型。
引用和指针在使用效率上不分伯仲,引用和指针在使用上也并不是比普通变量操作效率高。
普通类型 做函数形参类型时,在调用函数传实参数时是值传递,会发生数据的拷贝,效率低。
而引用或指针类型做函数形参类型时,在调用函数传实参数时是引用传递或指针传递,不会发生数据的拷贝,效率高。
引用类型的优点:
1.使用上更加简介明了,因为引用是变量的别名,使用上表明上看使用变量一样。不需要像指针那样需要 解引用符*来操作内存地址。
2.使用上更加安全,使用指针类型可能会遇到空指针,野指针,悬空指针,已经内存泄漏的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值