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关键字来定义常引用,不可通过常引用来修改被引用变量的值。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。