c++的引用

引用

引用的概念

C++是C语言的继承,它可进行过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。引用(reference)就是C++对C语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。 —百度百科

引用不是新定义一个变量,而是给已存在变量(引用实体)取了一个别名,编译器不会为引用变量开辟内存空间,引用变量与引用实体引共用同一块内存空间。

引用的定义

类型& 引用变量名= 引用实体;

int a = 10;
int& b = a;

引用的性质

1.引用在定义时必须初始化

int a=10;
int& b =a;
//int &b; 编译出错
  1. 一个变量可以有多个引用
int a=10;
int &b=a;
int &c=b;

3.引用一旦引用一个实体,再不能引用其他实体

int c=10;
int a=20;
int &b=a;
int &b=c;//编译出错“b”: 重定义;多次初始化	

4.引用类型必须和引用实体是同种类型的

常引用

引用变量对于空间内容的操作权限不能高于引用常量

const int a = 10;//不能修改a的内容
//int& b = a;  权限放大,编译时会出错,
const &b=a;// 权限相同,可以使用
/*权限缩小,可以使用
int a=10;
const int &b=a; 
*/

引用的使用

引用做参数

#include<iostream>
using namespace std;
void swap(int* p1, int* p2) // 传地址
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
void swap(int& r1, int& r2) // 传引用
{//输出型参数,形参的改变可以改变实参
	int tmp = r1;
	r1 = r2;
	r2 = tmp;
}
int main()
{
	int a = 1;
	int b = 2;
	swap(&a, &b);
	cout << a << endl << b << endl;
	swap(a, b);
	cout << a <<endl<< b << endl;
}

引用做返回值(常量和全局变量)

int& add(int a ,int b)
{
	int c = a + b;
	return c;//引用返回不会生成c的拷贝,而是返回c的引用,赋值给d
	         //传值返回会生成c的拷贝(tmp),之后把c的拷贝(tmp)赋值都给d
}
int main()
{
	int d = add(1, 2);//1.
	cout << d << endl;
}
//这段代码存在的问题
//1.非法访问,d的值为c的引用,在add栈帧销毁以后,去访问得到c
//2.如果add栈帧销毁,清理空间,那得到的是一个随机值
//ps:vs2022,栈帧销毁不会清理空间
//总结:传引用做返回值时:不可以用临时变量的引用做返回值,而用常量和全局变量传引用做返回值
//传引用做参数时:则都可以使用。

在这里插入图片描述

临时变量的存放
1.如果临时变量比较小(4,8字节),一般在寄存器中
2.如果临时变量比较大,存放在调用add函数的栈帧中

传引用与传值效率的比较

传值作为参数或返回值传递时,函数不会直接传递实参或返回值,而是会发生临时拷贝,因此效率低下。
引用传递函数的参数时,在内存中并没有产生实参的副本,而是对实参直接操作。当使用一般变量传递函数的参数时,当函数发生调用,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率更高,所占空间更少。

总结

传引用的价值:
1.提高效率
2.修改返回变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值