首页 > 编程笔记

C++引用的用法

引用是 C++ 引入的新语言特性,它是某一变量的一个别名,使用 “&” 符号标识。引用的定义格式如下:

数据类型& 引用名 = 变量名;

习惯使用C语言开发的读者看到“&”符号就会想到取地址。但是在 C++ 引用中,“&”只是起到标识的作用。

【示例1】通过案例演示引用的用法。C++ 代码如下:
#include<iostream>
using namespace std;
int main()
{
    int a=10;
    int& ra=a;
    cout<<"变量a的地址"<<hex<<&a<<endl;
    cout<<"引用ra的地址:"<<hex<<&ra<<endl;
    cout<<"引用ra的值:"<<dec<<ra<<endl;
    return 0;
}
运行结果:

变量a的地址0x6ffe04
引用ra的地址:0x6ffe04
引用ra的值:10

示例分析:
由运行结果可知,引用 ra 的地址和变量 a 的地址相同;引用 ra 的值为 10,与变量 a 的值相同。

在定义引用时,有以下几点需要注意:

在 C++ 中,引用的一个重要作用是作为函数参数。

【示例2】通过案例演示引用作为函数参数的用法。代码如下:
#include<iostream>
using namespace std;
void exchange(int& x, int& y)
{
   int temp = x;
   x = y;
   y = temp;
}
int main()
{
   int a, b;
   cout << "please input two nums: " << endl;
   cin >> a >> b;
   exchange(a, b);
   cout << "exchange: " << a << " "<< b << endl;
   return 0;
}
运行结果:

please input two nums:
10 20
exchange: 20 10

示例分析:
在【示例2】中,exchange() 函数的形参如果为普通变量(值传递),由于副本机制无法实现变量 a、b 的交换。

如果形参为指针(址传递),可以完成变量 a、b 的交换,但需要为形参(指针)分配存储单元,在调用时要反复使用*指针名获取数据,且实参传递时要取地址(&a、&b),这样很容易出现错误,且程序的可读性也会下降。

而使用引用作为形参,就克服了值传递和址传递的缺点,通过引用可以直接操作变量,简单高效,可读性又好。

引用是隐式的指针,但引用却不等同于指针,使用引用与使用指针有着本质的区别。

显然,引用比指针更简单、直观、方便。

使用引用可以代替指针的部分操作。在C语言中只能用指针来处理的问题,在 C++中 可以通过引用完成,从而降低了程序设计的难度。

如果想使用常量值初始化引用,则引用必须用const修饰,用 const 修饰的引用称为 const 引用,也称为常引用。

const 引用可以用 const 对象和常量值进行初始化。示例代码如下所示:

const int &a = 10;
const int b = 10;   
const int &rb = b;

上述代码解析:
常变量的引用必须是 const 引用,但 const 引用不是必须使用常量或常变量进行初始化,const 引用可以使用普通变量进行初始化,只是使用普通变量初始化 const 引用时,不允许通过该引用修改变量的值。示例代码如下所示:

int a = 10;     //变量a
const int &b = a;    //使用a初始化const引用b
b=20;     //错误

当引用作函数参数时,也可以使用const修饰,表示不能在函数内部修改参数的值。例如下面的函数,比较两个字符串长度:

bool isLonger(const string &s1, const string &s2)
{
   return s1.size() > s2.size();
}

在 isLonger() 函数中,只能比较两个字符串长度而不能改变字符串内容。

优秀文章