引用的概念
引用是变量的一个别名,相当于已经存在的变量的另一个名字。引用名与被引用的变量名都指向同一个内存地址。
引用的创建
引用创建的语法格式如下,其中T
为任意类型:
T &引用名 = 变量名;
例如:
#include<iostream>
using namespace std;
int main() {
int a = 10;
int b = 20;
//定义r引用a
int& r = a;
cout << "a=" << a << "\tr=" << r << endl;
//修改a的值
a = 100;
cout << "a=" << a << "\tr=" << r << endl;
//修改r的值
r = 1000;
cout << "a=" << a << "\tr=" << r << endl;
//用已知变量对r赋值
r = b;
cout << "a=" << a << "\tr=" << r << endl;
//输出a和r的地址
cout << "a的地址为:" << (void*)a << "\tb的地址为:" << (void*)b;
return 0;
}
运行上面程序,可以得到如下所示的结果:
a=10 r=10
a=100 r=100
a=1000 r=1000
a=20 r=20
a的地址为:0000000000000014 b的地址为:0000000000000014
通过观察上面的结果,我们可以得知
- 引用必须在定义的时候初始化
- 引用是始终如一的,即引用了一个变量后就不能再引用其它变量
- 引用和被引用的变量都指向同一个内存地址
- 引用只能引用同一种类型的变量,不能引用常量。
int a=10;double &b=a;
这种引用是非法的,以及int &a=10;
也是非法的。
常引用(const &)
引用也可以用const
关键字修饰,这样就不能通过引用名来修改变量值了。
如下代码所示:
#include<iostream>
using namespace std;
int main() {
int a = 10;
const int& r = a;
a = 10;//正常
r = 10;//报错
}
在执行到r=10;
这条语句时编译器会报错,提示表达式必须是可修改的左值,因为我们再初始化引用时将其加上了了const
关键字,我们就不能通过引用名来修改变量的值了。
对于a = 10;
这条语句则执行正常,因为a没有const
关键字修饰。
再考量下面的代码:
#include<iostream>
using namespace std;
int main() {
const int a = 10;
const int& b = a;//正确
int& r = a;//错误
r = 100;//错误
a = 100;//错误
return 0;
}
对于用const
关键字修饰的变量,我们在为其创建引用对象时,任然需要创建const
类型的引用对象,且无法通过变量名或引用名来修改变量的值。
引用的简单实例:
在学习C/C++
的过程中,我们难免会遇到交换两个变量值的题目。在没有学习引用之前,我们只能通过指针的方式来修改两个变量的值,如下:
#include<iostream>
using namespace std;
void swap(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int a = 10, b = 20;
swap(&a, &b);
return 0;
}
这样写显得很复杂,而且在调用的地方还要通过&
符号来对变量进行取地址操作。其实我们可以将函数的两个参数改写为引用,这样就可以简化我们的代码,增强可读性了,改写如下:
#include<iostream>
using namespace std;
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 10, b = 20;
swap(a, b);
return 0;
}
引用作为函数返回值
定义
类型 &函数名(形参列表){ 函数体 }
实现
观察如下代码:
#include<iostream>
using namespace std;
int n = 4;
int& setValue() {
return n;
}
int main() {
cout << "n=" << n << endl;
setValue() = 10;
cout << "n=" << n << endl;
return 0;
}
执行后得到如下结果:
n=4
n=10
函数setValue()
返回一个全局变量n
的引用,然后将函数名作为左值修改n的值。
用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本
对于引用作为函数返回值,在这里我们可以先不明觉厉。以后会说到。
网友评论