C++中引用的分析

本文详细介绍了C++中的引用概念,包括其定义、特性及应用场景。引用作为变量的别名,不需额外内存,且一经初始化不可改变。常见用途包括高效参数传递、返回值及常量引用。引用与指针有显著区别,如引用必须初始化,不能为NULL,并在使用上更为安全。理解引用对于提升C++编程效率和代码质量至关重要。
摘要由CSDN通过智能技术生成

@引用详解

引用概念

引用:引用就是给变量取别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存。
例如:高中同学给我起的外号:疙瘩。疙瘩是我,我也是我

类型& 引用变量名(对象命)=引用实体
void test()
{
	int a=10;
	int& ra=a;  // 定义引用类型
	return 0;
}

引用特性

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

int& r;  // 编译时会出错

2.一个变量可以有多个引用

int a=10;
int& ra = a;
int& rra = a; 

3.引用变量与引用实体的类型必须要一致

int a=10;
int& ra = a;
double& rd = a;  // 编译时会出错

在这里插入图片描述

4.引用一旦引用一个实体,再不能引用其他的实体,该引用在其生命周期内,只能和一个实体结合

引用使用场景

1.做参数

void Swap(int& left, int& right)
{
	int tmp = left;
	left = right;
	right = tmp;
}
/// 建议:如果不想通过形参来改变外部实体的情况下,可以以const类型引用作为形参
void Print(const int& r)
{
	cout << r << endl;
}

2.做返回值

// 错误示例:
int& Add(int a, int b) 
{
	int c = a + b;
 	return c; 
}
int main()
{
	int& result = Add(1, 2);

	Add(3, 4);  //result=7
	Add(5, 6);  //result=11
	//Add函数运行结束后,它并没有清理栈帧中所留下的垃圾数据,
	//因此:result是ret的别名,result可以看到空间中的垃圾数据。
	return 0;
}

因此:以引用方式作为函数返回值时,一定不能返回函数栈上的空间(典型:局部变量),因为函数结束后,函数体内的局部变量就被销毁了。如果在外部以引用的方式来接收函数的返回值,外部的引用实际引用的就是一块非法的内存空间。

// 正确使用方法:
int& Count()
{
	static int n = 0;
	n++;
	return n;
}

3.常引用

void Test()
{
	const int a = 10;
	//int& ra = a;     //编译出错,a为常量
	const int& ra = a; 

	//int& b = 10;      //编译出错,b为常量
	const int& b = 10;

	double d = 12.34;
	//int& rd = d;        //编译时出错,类型不同
	const int& rd = d;
}

传值,传地址,传引用效率比较

在C++中,函数传参有三种方式:传值,传地址,传引用

传值:形参是实参的一份拷贝,传参的效率低,不会通过改变形参而改变外部的实参。
传地址:形参保存的是实参的地址,传参效率高,可以通过形参改变外部的实参。
传引用:形参实际是实参的别名,传递效率高,可以通过形参改变外部的实参-->可以达到与指针类似的效果,而且比指针可用性更高更安全。

引用和指针的区别

1.从概念上来看

    指针是通过某个指针变量指向一个对象后,对它所指向的变量间接操作。
	引用本身就是目标变量的别名,编译器不会给引用类型的变量开辟内存空间,引用与其引用的实体公用的是同一块内存空间,对引用的操作就是对目标变量的操作。

2.在底层实现上

引用实际是有空间的-->因为引用就是指针,它里面存储的是引用实体的地址。

在这里插入图片描述
引用和指针的不同点的总结:

1. 引用在定义时必须初始化,指针没有要求
2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型
实体
3. 没有NULL引用,但有NULL指针
4.sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占
4个字节)
5. 引用自加即引用变量所引用的实体增加1,指针自加即指针向后偏移一个类型的大小
6. 有多级指针,但是没有多级引用
7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
8. 引用比指针使用起来相对更安全
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 C#入门 1.1 NET框架和C#语言简介 1.1.1 NET框架简介 1.1.2 认识C≠语言 1.2 Visual Studio.NET集成开发环境简介 1.2.1 VS.NET起始页 1.2.2 VS.NET集成开发环境 1.2.3 窗口布局调整 1.3 第一个控制台应用程序 1.3.1 案例说明 1.3.2 案例实现步骤 1.3.3 代码及分析 1.3.4 相关知识及注意事项 1.4 我的第一个Windows窗体应用程序 1.4.1 案例说明 1.4.2 案例实现步骤 1.4.3 代码及分析 1.4.4 相关知识及注意事项 1.5 本章小结 1.6 习题 第2章 C#语法基础 2.1 C#语言的数据类型 2.1.1 案例说明 2.1.2 代码及分析 2.1.3 相关知识及滓意事项 2.2 C#语言的运算符和表达式 2.2.1 案例说明 2.2.2 代码及分析 2.2.3 相关知识及注意事项 2.3 本章小结 2.4 习题 第3章 C#程序结构 3.1 顺序与选择结构 3.1.1 案例说明 3.1.2 代码及分析 3.1.3 相关知识及注意事项 3.2 选择结构的窗体应用 3.2.1 案例说明 3.2.2 案例实现步骤 3.2.3 代码及分析 3.2.4 相关知识及注意事项 3.3 while、do.while循环 3.3.1 案例说明 3.3.2 代码及分析 3.3.3 相关知识及注意事项 3.4 for循环 3.4.1 案例说明 3.4.2 代码及分析 3.4.3 相关知识及注意事项 3.5 本章小结 3.6 习题 第4章 方法 4.1 方法的定义与调用 4.1.1 案例说明 4.1.2 代码及分析 4.1.3 相关知识及注意事项 4.2 方法的嵌套调用 4.2.1 案例说明 4.2.2 代码及分析 4.2.3 相关知识及注意事项   …… 第5章 类与对象 第6章 数组和索引器 第7章 继承 第8章 多态 第9章 接口 第10章 异常处理 第11章 委托和事件 第12章 文件操作 第13章 课程设计 参考文献
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值