C++中引用、常量引用的使用,引用与指针的区别,以及什么时候使用引用,什么时候使用指针

引用

引用变量是一个别名,即它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

创建非常量引用

//********************普通引用********************
int itmp;
itmp = 10;
//定义普通引用
int& itmp_r = itmp;		//引用必须在定义的时候就要初始化

//输出地址和值
cout << "itmp=" << itmp <<"	address="<<&itmp<< endl;
cout << "itmp_r=" << itmp_r << "	address=" << &itmp_r <<endl;    //引用指向了同一个地址

输出结果:
在这里插入图片描述

创建形参为非常量引用的交换函数

形参为非常量引用,实参实际是传递变量的地址,在函数内部任何对形参的操作实际都是对实际对象的操作。

/********************************************
* @brief  :交换参数x和y的值
* @param  :int& x, int& y
* @note	  :此处采用的形参为非常量引用,一般形参为非常量引用时,表示引用的值在函数内部可以被修改
* @output :none
* @time   :2019-07-27
*********************************************/
void Swap(int& x, int& y)
{
	int tmp;
	tmp = x;
	x = y;
	y = tmp;

	return;
}

main函数中调用此交换函数

//引用作为参数
int a = 10;
int b = 20;
cout << "交换前a的值,a:" << a << endl;
cout << "交换前b的值,b:" << b << endl;
swap(a, b);
cout << "交换后a的值,a:" << a << endl;
cout << "交换后b的值,b:" << b << endl;

输出结果:
在这里插入图片描述

创建常量引用

很多时候函数的形参为常量引用,因此我们需要去定义常量引用。

int itemp2 = 10;
const int& itemp2_r = itemp2;

通常引用的类型需要与所引用对象的类型保持一致,如果不一致会提示编译错误

//double& dtemp2_r = itemp2;    //编译器会报错,引用的类型必须与其所引用对象的类型一致

但是常量引用的类型可以与所引用对象的类型不一致,常量引用的初始值可以是任意表达式,只要该表达式的结果能转换成引用的类型即可。

int itemp2 = 10;
const double& dtemp2_r = itemp2;  //编译通过

中间实际上是经历了一个转换过程:

/*解释
	const double &dtemp2_r = itemp2;
	由于类型不匹配,实际相当于:
	const double inner_tmp = (double)itemp2;  //这里就产生了一个临时变量
	const double &dtemp2_r = inner_tmp;
	临时的中间变量都是const,所有没有const的引用会失败。
*/

我们可以输出引用的值:

    int itemp2 = 10;
    const int& itemp2_r = itemp2;
    const double& dtemp2_r = itemp2; 
    cout << "the value of itemp2 : " << itemp2 << endl;
    cout << "the value of itemp2_r : " << itemp2_r << endl;
    cout << "the value of dtemp2_r : " << dtemp2_r << endl;

输出:
在这里插入图片描述
但是这里面有一个需要注意的事项,就是当常量引用的类型与所引用对象的类型不一致时,常量引用实际上是绑定到强制转换后的临时变量上。这时改变所引用对象的值时,不会影响常量引用的值。

int itemp2 = 10;
const int& itemp2_r = itemp2;
const double& dtemp2_r = itemp2; 
//改变被引用对象的值
itemp2 = itemp2 * 2;
cout << "the value of itemp2 : " << itemp2 << endl;			//output:20
//当对象类型与常量引用类型相同时,常量引用会绑定到实际对象
cout << "the value of itemp2_r : " << itemp2_r << endl;		//output:20
//对于一般表达式,常量引用绑定到临时变量上
cout << "the value of dtemp2_r : " << dtemp2_r << endl;		//output:10 

引用与指针的区别

它们之间有三个主要的不同:

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

什么时候使用引用?和什么时候使用指针?

1.使用引用参数的主要原因

  • 形参为非常量引用:程序员能够修改调用函数中的数据对象
  • 通过传递引用而不是整个数据对象,可以提高运行速度

2.对于使用传递的值而不做修改的函数

  • 如果数据对象很小,如内置数据对象,则按值传递
  • 如果数据对象是数组,则使用指针,并将指针声明为指向const的指针
  • 如果数据对象是较大的结构则使用const指针或const引用,以提高效率,节省复制结构所需的时间和空间
  • 如果数据对象是类对象则使用const引用。 类设计的语义常常要求使用引用,这是C++新增这项特性的主要原因,因此传递类对象的标准方式是按照引用传递。

3.对于修改调用函数中数据的函数

  • 如果数据对象是内置数据类型则使用指针
  • 如果数据对象是数组则只能使用指针
  • 如果数据对象是结构则使用引用或指针
  • 如果数据对象是类对象则使用引用

参考文档:什么时候使用引用?和什么时候使用指针?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值