C++学习笔记_2_ C++入门(2)

C++学习笔记_2_ C++入门(2)

前言

重点是引用


一、引用

引用概念

引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
比如:诸葛亮,有人称为"孔明",有人称"卧龙",江湖上人称"诸葛村夫"。
如下:

int main()
{
    
    
	int a = 10;
	int& b = a;//这里的&是引用,不是取地址
	a = 20;
	b = 30;
	return 0;
}

在这里插入图片描述
通过监视可以看出,b是a的别名,所以a、b的取值改变,地址也会改变,且二者拥有一个地址。

引用特性:

  1. 引用在定义时必须初始化。(权限可以缩小不能放大)

  2. 一个变量可以有多个引用,即多个别名。

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

int main()
{
    
    
	//指针和引用在初始化赋值时,权限可以缩小,不能放大
	const int a = 10;
	//int& b = a;
	const int& b = a;

	int c = 10;
	const int& d = c;
	const int& r = 10;
	
	//整形和浮点数之间互相隐式类型转换
	double dd = 2.22;
	int i = dd;
	
	const int& ri = dd;
	return 0;

}

二、引用的作用

1.引用做参数

  1. 输出型参数
    代码如下:
void Swap(int& x, int& y)//引用
{
    
    
	int tmp = x;
	x = y;
	y = tmp;
}
void Swap(int* px, int* py)//指针
{
    
    
	int tmp = *px;
	*px = *py;
	*py = tmp;
}
int main()
{
    
    
	int a = 0, b = 1;
	Swap(&a, &b);
	Swap(a, b);
	return 0;
}

通过监视,看出两次地址doum
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2. 大对象引用传参可以提高效率
代码对比如下:
在这里插入图片描述

2.引用做返回值

代码如下:

int& Add(int a, int b)
{
    
    
	int c = a + b;
	return c;
}

int main()
{
    
    
	int& ret = Add(1, 2);
	cout << "Add(1, 2) = " << ret << endl;
	return 0;
}

此时输出为:
在这里插入图片描述
对比如下代码:

int& Add(int a, int b)
{
    
    
	int c = a + b;
	return c;
}

int main()
{
    
    
	int& ret = Add(1, 2);
	Add(3, 4);
	cout << "Add(1, 2) = " << ret << endl;
	return 0;
}

结果如下:
在这里插入图片描述
结果不同的原因就在于在进行**Add(3, 4)操作的时候,所用的地址还是Add(1, 2)的,在进行完操作后,ret作为引用,ret的地址就是Add(3, 4)**的地址。所以结果为7.
在这里插入图片描述
在这里插入图片描述


三、指针和引用的区别

  1. 引用在定义时必须初始化,指针没有要求。
  2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体。
  3. 没有NULL引用,但有NULL指针。
  4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数。(32位平台下占4个字节)
  5. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。
  6. 有多级指针,但是没有多级引用。
  7. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理。
  8. 引用相对安全。

猜你喜欢

转载自blog.csdn.net/kris_paul/article/details/113525642
今日推荐