引用

一,引用的概念及与指针区别

int a;

int & b = a;

其中,&不是地址操作符,而是类型标识符的一部分。就像声明中char*指的是指向char的指针一样,int &指的是指向int的引用。上述引用声明允许a和b进行互换,它们指向相同的值和内存单元。

再看下面:

int a = 10;

int & b = a;

int *p = a;

这样表达式b和*p都可以同a互换,而&b和p都可以同&a互换。从这一点看,引用像是伪装表示的指针,但注意它们是有区别的:

1.必须在声明引用时就将其初始化,而指针可以先声明,再赋值;

int a = 10;

int & b;

b = a;//不能这样做!

2.引用更接近const指针,必须在创建时进行初始化,一旦与某个变量关联起来,就一直效忠于它,就是说, int & b = a;  实际上是下述代码  int * const p = a;  的伪装表示。其中,引用b相当于*p。

二,函数中的引用

引用常被用作函数参数,使的函数中的变量名成为调用程序中的变量的别名。这种传递参数的方法称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。

这项特性是C++对C的超越,C只能按值传递。按值传递导致被调用函数使用调用程序中的值的拷贝。当然,C语言也允许避开按值传递的限制,采用按指针传递的方式。


比较:

  1. void swap(int &a,int &b);//函数功能是实现参数值的交换,按引用传递
  2. void swap(int c,int d);//按值传递
  3. void swap(int *e,int *f);//按指针传递

  • 首先,三者的声明形式不同,这是区别一;
  • 1和2的区别为:a和b分别为函数调用时实参的别名,所以交换a、b的值就是交换实参的值;而c、d只是复制了调用函数时实参的值的新变量,交换c、d的值不会对实参的值造成影响。
  • 1和3的区别为:指针版本需要在函数使用e、f的整个过程中使用解引用操作符*。

三,引用的特点

//本程序提醒我们为什么通常选择按值传递,而不是按引用传递
#include <iostream>
using namespace std;

int cube(int a)
{
	a *= a * a;
	return a;
}

int refcube(int & ra)
{
	ra *= ra * ra;
	return ra;
}


int main()
{
	int x = 3;
	cout << cube(x) << " = cube of " << x << endl;	 //按值传递中,x的值没有改变
	cout << refcube(x) << " = cube of " << x << endl;//按引用传递,x的值发生改变

	return 0;
}

问:由以上代码我们会有疑问,就是当我们想要使用按引用传递而又不想改变被引用的值时候,应该怎么做?

答:当程序员意图是让函数使用传递给它的信息,而不对这些信息进行修改,同时想使用引用时候,应该在函数原型(声明)和函数头中使用const:

int refcube(const int &ra);
这样,当编译器发现代码修改了ra的值时候,就会生成错误信息。另外,若要编写类似上述的cube函数时候,应采用按值传递,而非按引用传递。

四,临时变量、引用参数和const


若实参和引用参数不匹配,C++将生成临时变量。现在(使用引用情况),仅当参数为const引用时,C++

才允许这样做。

若引用变量为const,则编译器将在下面两种情况生成临时变量:

  • 实参类型正确,但不是左值;
  • 实参的类型不正确,但可以转换成正确的类型;

分析:左值参数是可被引用的数据对象,如:变量、数组元素、结构成员、和被解引用的指针等;非左值包括:字面常量和包含多项式的表达式。实际上,对于形参为const引用的C++函数,如果实参不匹配,则其行为类似于按值传递,为确保原始数据不被修改,将使用临时变量来存储值。

注意:如果函数调用的参数不是左值或与相应的const引用参数的类型不匹配,则C++将创建类型正确的匿名变量,将函数调用的参数的值传递给该匿名变量,并让参数来引用该变量。

应尽可能使用const

将引用参数声明为常量数据的引用的理由:

  1. 使用const可以避免无意中修改数据的编程错误;
  2. 使用const使函数能够处理const和非const实参,否则将只能接受非const数据;
  3. 使用const引用使函数能够正确生成并使用临时变量。

五,将引用应用于结构

引用非常适合用于结构和类,引用的引入就是主要为了用于这些类型的,而非基本的内置类型。(未完待续)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值