C++中的引用传递

时间:2020-02-23 14:30:01  来源:igfitidea点击:

介绍

在本教程中,我们将讨论C++中按引用传递的概念。

将参数传递给C++中的函数

我们可以通过两种方法中的任何一种来传递对象或者变量,即按值传递和按引用传递。
两者都在不同的机制上工作,各有优缺点。

让我们分别更深入地研究上述两种技术。

在C++中按值传递

在按值传递方法中,被调用函数创建了一组全新的变量并复制了参数的值。
因此,它无权访问原始变量,并且只能处理较早创建的副本。

按值传递的内存状态

上面的框图描述了以下示例的方法的工作。

#include <iostream>
using namespace std;

void my_swapper(int x, int y)
{
	int temp;
	temp=x;
	x=y;
	y=temp;
	//swapping takes place among x & y
	//and not in a &amp; b!
	cout<<"Swapped values are: "; 
	cout<<"a="<<x<<"  b="<<y<<endl;
}
int main()
{
	int a= 10, b= 20;
	cout<<"Original Values: ";
	cout<<"a="<<a<<"  b="<<b<<endl; //original values
	
	my_swapper(a,b); //pass by value
	
	cout<<"After swap: ";
	cout<<"a="<<a<<"  b="<<b<<endl; 
	//pass by value causes no change in original values
	
	return 0;
}

输出:

Original Values: a=10  b=20
Swapped values are: a=20  b=10
After swap: a=10  b=20

其中" x"和" y"是分别存储变量" a"和" b"的值的副本。
如我们所见,函数" my_swapper()"仅在副本之间交换值,而不能更改原始变量。

当不希望修改原始值时,按值传递很有用,并确保函数不会损害原始值。

在C++中通过引用传递

C++中通过引用传递的方法使用不同的机制。
无需将值传递给调用的函数,而是创建或者传递对原始变量的引用。
引用是预定义变量的别名。
即,可以使用任何变量或者引用名称来访问相同的变量。

现在让我们看一个例子来理解它。

通过引用的内存状态

类似地,以上框图描述了以下示例的方法的工作。

#include <iostream>
using namespace std;

void my_swapper(int &x, int &amp;y) //references to variables created
{
	int temp;
	temp=x;
	x=y;
	y=temp;
	//swapping takes place and is reflected in original values
	
	cout<<"Swapped values are: "; 
	cout<<"a="<<x<<"  b="<<y<<endl;
}
int main()
{
	int a=10, b=20;
	cout<<"Original Values: ";
	cout<<"a="<<a<<"  b="<<b<<endl; //original values
	
	my_swapper(a,b); //pass by reference
	
	cout<<"After swap: ";
	cout<<"a="<<a<<"  b="<<b<<endl; 
	//pass by reference causes change in original values
	
	return 0;
}

输出:

Original Values: a=10  b=20
Swapped values are: a=20  b=10
After swap: a=20  b=10

其中将a和b传递给my_swapper()函数。
因此," x"和" y"成为参考变量,分别是a和b的别名。

这样,交换x和y实际上会影响变量a和b。
从上面的输出中可以看出,这次ab实际上是使用它们的引用进行交换的。
这也使我们想到了前面介绍的C++中的指针概念。

示例–使用C++中的"按引用传递"以英尺或者英寸为单位转换距离

此外,让我们看一个示例,以了解C++中按引用传递方法的用法。

#include <iostream>
using namespace std;

void convert(float &, char &amp;,char &);//function prototype

int main()
{
	//variable initialisation
	float distance;
	char choice, type='F';
	
	cout<<"Enter Distance in feet: ";
	cin>>distance;
	cout<<"\nYou want distance in feet or inches? (F/I): ";
	cin>>choice;
	
	switch(choice)
	{
		case 'F': convert(distance,type,choice);
					break;
		case 'I': convert(distance,type,choice);
					break;
					
		default: cout<<"\n\nError!!!"; //if wrong choice is entered
					exit(0);
	}
	cout<<"\nDistance = "<<distance<<" "<<type;
	return 0;
}
//pass by reference
void convert(float &d, char &amp;t, char &ch)
{
	switch(ch)
	{
		case 'F': if(t=='I')
		{
			d=d/12;
			t='F';
		}
		break;
		case 'I': if(t=='F')
		{
			d=d*12;
			t='I';
		}
		break;
	}
}

在上面的代码中,我们将以英尺为单位的距离转换为英尺或者英寸。
与之前的示例类似,这次在函数convert()中,dtch分别引用了变量distancetypechoice
因此,任何参考中的更改也会更新原始值。