C++之引用

1、引用的概念:引用即内存的别名,本身不占内存,并非实体,对引用的操作就是对目标内存的操作。

int a = 10;
int &b = a;

2、引用必须初始化,不能更换目标。

int a = 10;
int &b = a;
int c = 20;
b = c;//并不是更改b引用的目标内存,仅仅是对b引用的目标内存进行赋值

这样写的话,b依然是a的引用,只是把c的值传给了引用b,而把a的值也间接的改成了20.
3、没有引用的引用,但是有指针的指针,及二级指针

int a = 10;
int &b = a;
int &d = b;//没有引用的引用,所以d也是a的引用

4、引用的常属性必须和目标内存的常属性一致

const int a = 10;
int &b = a;//ERROR,通过b这个引用访问目标内存的权限变大了
const int &e = a;//OK

但是引用的类型可以比目标类型的常属性限定更加严格

int a = 10;
const int &b = a;//OK

5、引用可以延长右值的生命周期

10;//10占据的内存空间的生命周期是很短暂的
int &b = 10;//ERROR,因为直接去改变右值是毫无意义的,即便给了名字也不可以直接更改
const int &b = 10;//OK,因为加上const后就表明该值是不可以更改的,并且这个引用延长了右值的生命周期

6、常引用是万能引用,可以当任何类型的引用

7、引用的生命周期不能长于目标

8、引用型参数,函数的形参就是实参的别名
在函数中修改实参值,可以避免对象复制的开销

void swap(int &a,int &b)
{
...//实现交换
}
int c = 10;
int d = 20;
swap(c,d);

9、常引用型参数:防止对实参的意外修改,接受常量型实参

10、引用型返回值:从函数中返回引用,一定要保证在函数返回以后,该引用的目标依然有效
(1)可以返回全局、静态变量的引用
(2)可以返回成员变量的引用
(3)可以返回在堆中动态创建的对象的引用
(4)可以返回调用对象自身的引用
(5)可以返回引用型参数本身
(6)不能返回局部变量的引用

#include <iostream>
using namespace std;
int g_value;
int &func()
{
	return g_value;
}

int &bar()
{
	static int s_value = 0;
	cout << "s_value = " << endl;
	return s_value;
}

int &hum()
{
	int *pn  = new int;
	return *pn;
}

int main()
{
	func() = 100;//相当于是返回了一个全局变量g_value的引用,并赋值100
	cout << "g_value = " << g_value << endl;//输出的g_value等于100

	bar() = 200;//先打印s_value = 0,然后在赋值200给返回的静态变量的引用
	bar();//打印200,说明赋值成功了,也说明了返回的是引用型的静态变量

	hum() = 300;//把300赋值给了开辟出来的内存里
	//等等	
	return 0;
}	

11、非常引用型返回值,可以通过引用修改目标

int &func()
{
	return g_value;
}

12、常引用型返回值,不可以通过引用修改目标


const int &func()
{
	return g_value;
}

在实用层面,引用就是指针,但在语言层面,引用不是实体类型,因此与指针存在明显的差别:
(1)指针可以不初始化,其目标可以在初始化后随意变更(除非是指针常量),而引用必须初始化,且一旦初始化就无法变更其目标。
(2)存在空指针,不存在空引用
(3)存在指向指针的指针,不存在引用的引用
(4)存在指针的引用,不存在引用的指针
(5)存在指针数组,不存在引用数组,但存在数组引用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值