C++中引用的常见用法

  在C++中引用类型是一个强大的存在,它一定程度上规避了指针带来的风险,并且使得函数参数之间的传值和通信变得异常灵活。

  1.引用的概念

  在C++中,可以定义引用如下:

1 int n;
2 int &r = n;

  这样定义以后,r就是int型变量n的一个引用。可以理解为给变量n取了一个“别名”叫r,从此r跟n便绑定在一起了。修改r的值,实际上也就等于修改了n的值;使用r,实际上也就等于使用n。

  需要注意的是:引用类型在定义时就必须初始化(如上述代码将其初始化为n)——这是很自然的,试想一下我们如果说给某一物品取了个别名,但却不指定究竟是给什么东西取的别名,那“取别名”这件事就毫无意义了。

  以下示例代码出自《新标准C++程序设计教程》:

 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int n = 4;
 6     int &r = n; //r引用了n
 7     r = 4;        //修改了r就是修改了n
 8     cout << r << endl; //输出4
 9     cout << n << endl; //输出4
10     n = 5; //修改了n就是修改了r
11     cout << r << endl; //输出5
12     int &r2 = r; //r2和r引用同一个变量n
13     cout << r2 << endl; // 输出5
14     return 0;
15 }

  2.引用作为函数的返回值

  函数的返回值也可以是引用。使用引用作为函数的返回值,能够在运算符重载发挥巨大作用。

 1 #include <iostream>
 2 using namespace std;
 3 int n = 4; //n是全局变量
 4 int &SetValue() {
 5     return n;  //返回对n的引用
 6 }
 7 int main()
 8 {
 9     SetValue() = 40; //返回值是引用的函数调用表达式,可作为左值使用,相当于修改了n的值
10     cout << n << endl; //输出40
11     int &r = SetValue(); //r通过函数SetValue()间接引用了n 
12     cout << r << endl; //输出40
13     return 0;
14 }

   3.引用作为函数的形参

  如果将函数的形参定义为引用类型,则当函数被调用时,给函数传入的就是实参的引用。若在函数体里改变了传入参数的值,则处于函数外部的实参值也将改变。

 1 #include <iostream>
 2 using namspace std;
 3 void Swap(int &a, int &b) {
 4     int tmp;
 5     tmp = a;
 6     a = b;
 7     b = tmp;
 8     cout << "In Swap: a = " << a << " b = " << b << endl;  
 9 }
10 int main()
11 {
12     int a = 4, b = 5;
13     Swap(a, b);
14     cout << "After swaping: a = " << a << " b = " << b << endl;
15     return 0;   
16 }

  输出结果为:

In Swap: a = 5 b = 4
After swapping: a = 5 b = 4

   4.常引用

  若在定义引用时加上const关键字,则该引用就成为常引用。如:

1 int n;
2 const int &r = n;

  常引用和普通引用的区别在于不能通过常引用去修改其引用的内容。注:不是常引用的内容不能被修改,只是不能通过常引用修改其内容而已。如:

1 int n = 100;
2 const int &r = n;
3 r = 200;    //编译出错,不能通过常引用修改其引用的内容
4 n = 300;   //没问题,n的值变为300

  const T & 和T &是不同的类型。T & 类型的引用或T类型的变量可以用来初始化const T & 类型的引用。const T 类型的常变量和const T & 类型的引用则不能用来初始化T & 类型的引用,除非进行强制类型转换。例如下面的程序段:

 1 int main()
 2 {
 3     const char cc = a;
 4     char c;
 5     const char &rc1 = cc;  //ok,cc既不能修改也不能通过rc1来修改
 6     const char &rc2 = c;  //ok,c可以修改,但不能通过rc2来修改
 7     char &r = cc;            //error,const char 类型不能用来初始化char类型
 8     char &r2 = (char &)cc; //ok,将const char强制转换成char类型引用
 9     cout << r2 << endl;   //输出a,r2指向了cc
10     r2 = b;
11     cout << cc << endl;   //输出a,无法通过r2修改cc的值
12     cout << r2 << endl;   //输出b,r2指向了字符b,即引用了字符b在内存中的位置
13     return 0;
14 }

  5.总结

  在C++中,声明一个变量为引用,必须对其进行初始化,初始化可以是变量名或者具体值(e.g. int &a = 2; char &b = ‘b‘)。引用可作为函数的返回值,这个时候可将引用作为左值为其赋值。引用可作为函数的形参,当函数被调用时,传递给函数的实际上是实参的引用而不是拷贝。因此在函数中若修改了传入参数的值,则被引用的变量值也将发生改变。可用const关键字来定义常引用,不可通过常引用来修改被引用变量的值。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。