Bootstrap

C++ 引用介绍

引用是C++基础中比较重要的一部分,像引用的意义和作用。接下来我会逐步介绍。

(1)引用概念

   引用不是一个新的变量,引用是一个变量的别名,别名的意思就是另一个名字,打个比方就是你的名字和你的小名都是你,别名改变,其本身也会改变,本身改变也会让别名改变。 因此在编译器中,它是不会给引用开辟一个新的空间,它与它引用的变量公用同一块空间,但这也只是限制在语法中,在底层实现时还是不同的空间,如下图所示:

补充: 引用的类型必须和实体的类型相同

引用格式: 类型 + & + 引用变量名(对象名) = 引用的实体

 (2)引用特性

①引用在定义时必须初始化,下面不初始化时,在VS下会报出这个错误:

int& ra;

 ②一个变量可以有多个引用

	//就像一个人,可以同时拥有多个名字
    int a = 10;
	int& ra = a;
	int& rra = ra;
	int& rrra = rra;

③引用一旦引用了一个实体,就不能再去引用其他实体

这句话的意思就是: 有两个变量a, b,如果其中一个变量a被引用,引用的变量名字是: ra, 那么这个ra就不能再去作为b的引用。

(3)引用的两个价值

第一个价值: 作为参数

如下代码所示 (引用和指针):

//引用
void Swap(int& num1, int& num2)
{
	int tmp = num1;
	num1 = num2;
	num2 = tmp;
}
//应用了引用的特性。num1 和 num2 是我们要交换的两个值
//对别名的改变也会改变其本身

//指针
void Swap(int* num1, int* num2)
{
	int tmp = *num1;
	*num1 = *num2;
	*num2 = tmp;
}


  我们发现:引用时, 其中a 和 num1 地址是一样的, b 和 num2地址是一样,指针时, 其中形参也会各自开辟一块空间, 因此在使用传引用时:可以减少拷贝,提高效率

结论: 当引用作为参数时,可以不用去开辟新的空间,可以提高效率。

第二价值:作为返回值

①static 修饰的静态变量返回

有如下代码: 

int& Count()
{
	static int n = 0;
	n++;
	return n;
}

int main()
{
	int& ret = Count();
	cout << ret << endl;
	return 0;
}

 其中引用返回值类型时, 我们返回的其实相当于是 n 的一个别名,我们知道,在函数开辟空间时,出了函数时函数所占用的空间也随之销毁,但是由于我们定义的变量 n 为静态的,它是在我们的静态区,出了函数也不会随之销毁,去访问n时也能访问。

补充:空间销毁意义

(1)空间销毁,其空间还在,只是使用权并非是我们

(2)我们依然能访问这块空间,只是空间的内容是不确定的,可能未被覆盖,也可能被覆盖

②非static 修饰的额变量

int& Count()
{
	int n = 0;
	n++;
	return n;
}

int main()
{
	int& ret = Count();
	cout << ret << endl;
	return 0;
}

出了函数的作用域,函数空间就销毁了,其中的变量空间也随之销毁 ,此时再用引用去访问这个空间时,此时空间上的内容就已经是不确定的了

结论:

返回值不存在,则不能用引用返回

返回值存在,则可以用引用返回

引用返回的优点:

1.减小拷贝,提高效率

2.修改返回值

 笔记补充:

指针和引用赋值中,权限可以缩小,但不能放大。

类型转换中会有临时变量产生(临时变量具有常性)。

船只返回也不能用引用接收,传值返回本质也是临时拷贝。

;