来探一探C++的引用

2021/7/30 17:06:28

本文主要是介绍来探一探C++的引用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

这里写目录标题

  • 创建引用变量
  • 引用用作函数参数
  • 按值传递与按引用传递
    • 使用const的理由
  • 引用用作类对象
  • 何时使用引用参数

创建引用变量

1.		引用是已定义变量的别名(另一个名称)。
			定义引用的一般格式:类型 &引用名 = 变量名;
				例如:int a = 1;
				int &ra = a;  // b是a的别名,因此a和b是同一个单元
			注意:定义引用时一定要初始化,指明该引用变量是谁的别名。
		
2.		引用的主要用途:
	2.1	用作函数的形参(主要指结构和对象参数)。通过将引用变量用作参数,函数将使用原始数据,而不是其副本。

引用用作函数参数

//	演示交换两个变量的值
#include <iostream>

using namespace std;

void swapref(int &ra, int &rb)	//	引用传递
{
	int tmp;
	tmp = ra;
	ra = rb;
	rb = tmp;
}

void swappoi(int *p, int *q)	//	指针传递
{
	int tmp;
	tmp = *p;
	*p = *q;
	*q = tmp;
}

int main()
{
	int a = 100;
	int b = 200;
	cout << "a = " << a << " b = " << b << endl;

	swapref(a, b);
	cout << "a = " << a << " b = " << b << endl;

	swappoi(&a, &b);
	cout << "a = " << a << " b = " << b << endl;
	return 0;
}

结果:

按值传递与按引用传递

#include <iostream>

using namespace std;

double cube(double val)
{
	val *= val * val;
	return val;
}

double refcube(double &rval)
{
	rval *= rval * rval;
	return rval;
}

double const_refcube(const double &rval)
{
	return rval * rval * rval;
}

int main()
{
	double x = 3.0;

	//	按值传递
	//double val = cube(x + 2.0);
	cout << cube(x) << endl;
	cout << cube(x + 2.0) << endl;
	int k = 10;
	cout << cube(k) << endl;
	double d[3] = { 2.0, 3.0, 4.0 };
	cout << cube(d[2]) << endl;

	//	按引用传递
	cout << refcube(x) << endl;
	//cout << refcube(3.0) << endl;	//	error,	非常量引用的初始值为左值
	//cout << refcube(x + 2.0) << endl;	//	error,	非常量引用的初始值为左值
	long ll = 3.0;
	//cout << refcube(ll) << endl;	//	error
	//如果引用参数是const,则编译器将在下面两种情况下生成临时变量:
		//	1.实参的类型正确,但不是左值;
		//	2.实参的类型不正确,但可以转换为正确的类型;
	cout << const_refcube(3.0) << endl;
	cout << const_refcube(ll) << endl;
	cout << const_refcube(ll + 1.0) << endl;
	return 0;
}

使用const的理由

1.使用const可以避免无意中修改数据的编程错误;

2.使用const可以使函数能够处理const和非const实参,否则将只能接受非const数据;

3.使用const引用使函数能够正确生成并使用临时变量。

引用用作类对象

1.引用的另一个作用是用于返回引用的函数。
2.函数返回引用的一个主要目的是可以将函数放在赋值运算符的左边。
3.注意:不能返回对局部变量的引用。
//	演示字符串拼接
#include <iostream>
#include <string>
using namespace std;

string str_join1(const string &s1, const string &s2)
{
	string str;
	str = s1 + s2;
	return str;
}

const string& str_join2(string &s1, const string &s2)
{
	s1 = s1 + s2;
	return s1;
}

const string& str_join3(const string &s1, const string &s2)
{
	string str;
	str = s1 + s2;
	return str;
}

int main()
{
	string ss1("aaaaaa");
	string ss2("bbbbbb");

	string result;
	result = str_join1(ss1, ss2);
	cout << result << endl;

	result = str_join2(ss1, ss2);
	cout << result << endl;

	//result = str_join3(ss1, ss2);	//	程序崩溃,不能返回对局部变量的引用。
	//cout << result << endl;

	return 0;
}

何时使用引用参数

1.使用引用参数的主要原因有两个。
		1.1	能够修改调用函数中的数据对象
		1.2	通过传递引用而不是整个数据对象(当数据对象较大时,如结构和类对象),可以提高程序运行的速度。

2.	对于传递的值而不作修改的函数。
		2.1	如果数据对象很小,如内置数据类型或小型结构,则按值传递。
		2.2	如果数据对象是数组,则使用指针,并将指针声明为指向const的指针。
		2.3	如果数据对象是较大的结构,则使用const指针或const引用,以提高程序的效率。这样可以节省拷贝结构所需的时间和空间。
		2.4	如果数据对象是类对象,则使用const引用。类设计的语义常常要求使用引用,这是C++新增这项特性的主要原因。因此,传递类对象的标准方式是按引用传递。

3.	对于修改调用函数中数据的函数。
		3.1	如果数据对象是内置数据类型,则使用指针。
		3.2	如果数据对象是数组,则只能使用指针。
		3.3	如果数据对象是结构,则使用引用或指针。
		3.4	如果数据对象是类对象,则使用引用。


这篇关于来探一探C++的引用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程