C++漫谈引用

版权声明:版权所有 https://blog.csdn.net/weixin_43907422/article/details/89093526

C++漫谈引用

(一)引用的概念

引用是c++的新特性,其本质是一个指针常量,实际是某一变量的别名,对引用操作相当于对变量直接操作。

引用的声明方法:类型标识符 &引用名=目标变量名

例如:

int a = 5;
int& a_ = a;

使用引用的注意点:

(1)&在此不是求地址运算符,而是起标识作用。

(2)类型标识符是指目标变量的类型。

(3)声明引用时,必须同时对其进行初始化。

(4)引用声明完毕后,相当于目标变量有两个名称即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。

(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&a_与&a相等。

(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。

(二)引用vs指针

1.不存在空引用。引用必须连接到一块合法的内存。
2.一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以指向另一个对象。
3.引用必须在创建时被初始化。指针可以在任何时间被初始化。

(三)引用的应用

1.引用的一个重要作用就是作为函数的参数。

以前的C语言中函数参数传递是值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针,因为这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引用。

下面我们先看一个例子:

#include <iostream>
using namespace std;
 
void swap(int& x, int& y);
 
int main (){
   int a = 100;
   int b = 200;
 
   cout << "交换前,a 的值:" << a << endl;
   cout << "交换前,b 的值:" << b << endl;
 
   swap(a, b);
 
   cout << "交换后,a 的值:" << a << endl;
   cout << "交换后,b 的值:" << b << endl;
 
   return 0;
}
 
void swap(int& x, int& y){
   int temp;
   temp = x; 
   x = y; 
   y = temp; 
}

问题来了,我们为什么要把引用作为函数参数?

调用函数时实参传给形参的是变量的值,传递是单向的。如果在执行函数期间形参的值发生变化,并不传回给实参。因为在调用函数时,形参和实参不是同一个存储单元。C++提供了 传递变量的引用。形参是引用变量,和实参是一个变量,调用函数时,形参(引用变量)指向实参变量单元。这种通过形参引用可以改变实参的值。

事实上,如果不想用引用,也可以通过传递变量的指针来完成相同的任务。形参是指针变量,实参是一个变量的地址,调用函数时,形参(指针变量)指向实参变量单元。这种通过形参指针可以改变实参的值。

如果对指针有什么不理解的可以看这篇文章:

C++漫谈指针

下面我们将普通参数、指针和引用放在一起看看:

普通:

#include <iostream>
using namespace std;

void swap(int m, int n) {
	int temp; 
	temp = m;
	m = n;
	n = temp;
}

int main() {
	int a = 1;
	int b = 2;
	swap(a, b);
	cout << a << endl << b << endl;
}

指针:

#include <iostream>
using namespace std;

void swap(int* m, int* n) {
	int temp; 
	temp = *m;
	*m = *n;
	*n = temp;
}

int main() {
	int a = 1;
	int b = 2;
	swap(&a, &b);
	cout << a << endl << b << endl;
}

引用:

#include <iostream>
using namespace std;

void swap(int &m, int &n) {
	int temp;
	temp = m;
	m = n;
	n = temp;
}

int main() {
	int a = 1;
	int b = 2;
	swap(a, b);
	cout << a << endl << b << endl;
}

由此可见,不使用指针或者引用无法完成两个变量的数值交换,也可以看出指针和引用在功能上的相似。不过考虑到代码的复杂度和指针的危险性,c++还是更加推荐我们使用引用作为函数参数,而不是指针。

2.引用还可以作为函数的返回值

用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本,可以节约内存开销。当返回的值不是引用型时,编译器会专门给返回值分配出一块内存。

一般全局变量、局部静态变量、局部动态分配内存的变量可以使用引用作为函数的返回值,但是局部变量能使用引用作为返回值,因为局部变量在函数调用完之后会自动销毁内存,这个时候返回的引用就有会问题了,因为此时对局部对象的引用就会指向不确定的内存。

比如看下面两个例子:

int& abc(int a, int b, int c, int& result){
 	result = a * b * c;
  	return result;
}
int& abc(int a, int b, int c){
 	 return a * b * c;
}

很明显下面一个是典型的反例,因为return的临时变量会在函数调用完成之后被释放!

好了,本教程就到此结束啦,喜欢的小伙伴记得点赞哦,也欢迎志同道合的朋友们关注我和我一起交流。

2019年4月8日

猜你喜欢

转载自blog.csdn.net/weixin_43907422/article/details/89093526
今日推荐