“引用”的概念与应用
———————————————————————————
“引用”的定义:
类型名&引用名=某变量名;
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 的。