“引用”的概念与应用
中国大学慕课——程序设计算法:c++面向对象程序设计(https://www.icourse163.org/learn/PKU-1002029030?tid=1450432459#/learn/content?type=detail&id=1214925543)
“引用”的定义:
类型名&引用名=某变量名;
int n = 4;
int & r = n;// r 引用了 n , r 的类型是 int&
某个变量的引用,等价于这个变量,相当于该变量的一个别名。
int n = 7; int & r = n; r = 4; cout<<r;//输出 4 cout<<n;//输出 4 n = 5; cout<<r;//输出 5
定义引用时一定要将其初始化成引用某个变量。
初始化后,它就一直引用该变量不会再引用别的变量了。
引用只能引用变量,不能引用常量和表达式。
double a = 4,b = 5; double & r1 = a; double & r2 = r1;//r2也引用 a r2 = 10; cout <<a<<endl;//输出 10 r1 = b; //r1并没有引用 b cout<<a<<endl;//输出 5
引用应用的简单实例
c语言中,编写交换两个整型变量值的函数
void swap(int a,int b) { int tmp; tmp = a; a = b; b = tmp; } int n1, n2; swap(n1,n2);//n1,n2的值不被交换
在上述代码之中,n1 和n2 的值并不会被改变。
因为a , b 仅仅是作为形参的值存在于函数中,形参的改变并不会引起实参的改变。
于是,我们便将代码修改如下:
void swap(int *a, int *b) { int tmp; tmp = * a; * a = * b; * b = tmp; }
int n1, n2;
swap(& n1, & n2);//n1,n2的值被交换
上述代码参与交换的就不是n1与n2了,而是n1与n2的地址。函数的参数变成了指针,函数对指针的所指的内容进行了交换。
但是在学习了C++的引用之后,我们的代码可以改成:
void swap(int & a,int & b) { int tmp; tmp = a; a = b; b = tmp; } int n1, n2; swap(n1,n2);//n1 ,n2的值被交换
a引用了n1。
b引用了n2。
所以当 a 和 b 的值发生改变时,也会影响到 n1 , n2 。
引用作为函数的返回值:
int n = 4;//n 为全局变量 int & SetValue() { return n;}//函数的返回值类型为 int& int main() { SetValue() = 40;//对函数赋值也就相当于对n赋值 cout<<n; return 0; }//输出:40
常引用:
定义引用时,前面加上const关键字,即为“常引用”
int n; const int & r = n;
r 的类型是 const int &
特点:不能通过常引用去修改其引用的内容。
int n = 100; const int & r = n; r = 200;//编译出错 n = 300;//正确
常引用和非常引用的转换:
const T & 和 T & 是不同的类型!
T & 类型的引用或 T 类型的变量可以用来初始化 const T & 类型的引用。
const T类型的常变量 和const T &类型的引用则不能用来初始化T &类型的引用,除非强制类型转换。
总之 加了 const 的常变量不能用来初始化没加 const 的。