1. 背景
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
C++ 引用 vs 指针
引用很容易与指针混淆,它们之间有三个主要的不同:
- 不存在空引用。引用必须连接到一块合法的内存。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。
2. 引用的概念
下面的写法定义了一个引用,并将其初始化为引用某个变量。
类型名 & 引用名 = 某变量名;
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
1.定义引用时一定要将其初始化成引用某个变量。
2.初始化后,它就一直引用该变量,不会再引用别的变量了。
3.引用只能引用变量,不能引用常量和表达式。
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
3. 引用应用的简单示例
C语言中,如何编写交换两个整型变量值的函数?
void swap(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
int n1, n2;
swap(n1, n2); //n1, n2的值不会被交换
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int n1, n2;
swap(& 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的值被交换
4. 引用作为函数的返回值
int n = 4;
int & SetValue(){return n;}
int main()
{
SetValue() = 40;
cout << n;
return 0;
} //输出:40
5. 常引用
定义引用时,前面加const关键字,即为“常引用”
int n;
const int & r = n;
r的类型是 const int &
不能通过常引用去修改其引用的内容:
int n = 100;
comst int & r = n;
r = 200; //编译错
n = 300; //没问题
6. 常引用和非常引用的转换
const T & 和T & 是不同的类型!!!
T & 类型的引用或T类型的变量可以用来初始化const T & 类型的引用。
const T 类型的常变量和const T &类型的引用则不能用来初始化T &类型的引用,除非进行 强制类型转换。
站在巨人的肩上
【1】北京大学信息技术学院《程序设计实习》