C++学习随手记——引用

61 阅读3分钟

引用为变量提供另一个名称,对引用所做的任何操作都作用于它所指的对象。 可以将引用理解为变量的一个别名。比如说一个人既有正式的姓名,也有朋友为他取的昵称,可以将变量视为这个人,创建变量时所指定的变量名是他的正式名称,而引用则是它的昵称。 引用的创建如下所示:

int num = 100;
int& rNum = num;

在上述代码中,num是变量的名称,而rNum即为num的引用。由于引用总是指向另一个值,所以引用创建的时候必须进行初始化。这两者指向的是存储数字100的同一块内存。

有点弯弯绕的一个部分

需要注意的是,引用总是指向其初始化时所用的变量,无法通过为引用重新赋值的方式来改变引用的指向。以下面这段代码为例:

int a = 100;
int& rA = a;
int  b = 200;
rA = b;

rA = b这段代码处,实际上rA的指向仍然是变量a,因为正如上文所述,引用是不能通过重新赋值来改变其指向的。但是,因为rA和a实际上指向的是内存中的同一块区域,因此这段代码可以等同为a = b,将b的值赋给a。

常量引用

常量引用是受限的引用,无法用它来修改其引用的值。需要注意的是,常量引用所指向的并不一定是常量,而仍是一个变量。使用常量引用的意义在于不允许使用此常量引用的对象修改被引用的对象的值,如同为此常量引用的对象提供只读的权限。常量引用同样可以指向一个常量,且常量只能为常量引用所用

传递实参的三种方式

  • 按值传递:如果实参是bool,int等基本类型时,使用按值传递参数。这类对象很小,即便使用引用来传递参数也不会获得任何效率上的提升。
  • 按常量引用:希望高效传递,但又不需要对其进行修改
  • 按引用传递:希望高效传递,且有修改实参的需要。(应当尽可能避免对实参的修改)

返回引用

正如在传递值时一样,从函数返回值时,真正返回的是值的副本。对于基本类型则无甚影响,然而若是返回的是一个较大的对象,这个操作可能就会有较大的开销,返回值的引用是这种情况下应当采用的,更加高效的选择。 在从函数中返回一个引用之前,必须指定要返回的是一个引用。

string& refToElement(vector<string>& strs, int i);

在上述代码中,通过使用引用运算符说明函数将会返回一个指向string对象的引用而非此对象本身。