在理解C++中的引用之前,先理清一下变量,变量的本质为一块内存空间的地址以及空间中存放的数
据,而如果利用地址调用变量,稍显繁琐,所以一般都是给变量命名,调用时直接使用变量名即可,
那么,一个变量是否可以有多个名称呢?C++中的引用刚好能够做到。
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a;
cout << "a=" << a << endl;
cout << "a.add=" << &a << endl;
cout << "b=" << b << endl;
cout << "b.add=" << &b << endl;
return 0;
}
执行结果:
a=10
a.add=00AFFD98
b=10
b.add=00AFFD98
定义一个变量a,赋值为10,引用变量b,变量b与变量a代表的是同一块内存空间,并且输出打印a和b
的值与地址,得到的值都是相同的。而引用的本质,就是一个指针常量
理解引用之后,再看看引用所能实现的功能:
1、作为函数的参数
#include <iostream>
using namespace std;
//值传递
void mySwap01(int a,int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
//址传递
void mySwap02(int* a, int* b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
//引用传递
void mySwap03(int& a, int& b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int a = 10;
int b = 20;
mySwap01(a, b);
cout << "mySwap01:" << endl;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
mySwap02(&a, &b);
cout << "mySwap02:" << endl;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
mySwap03(a,b);
cout << "mySwap03:" << endl;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
return 0;
}
执行结果:
mySwap01:
a=10
b=20
mySwap02:
a=20
b=10
mySwap03:
a=10
b=20
写了三个交换函数,第一个是值传递,不改变(修饰)实参;第二个是址传递,改变(修饰)实参;
第三个是引用传递,改变(修饰)实参;所以第一个函数执行结果是a,b的值没有改变,第二个的结
果是a,b的值进行了交换,第三个的结果是a,b的值又交换回来了。
2、作为函数返回值
#include <iostream>
using namespace std;
//不要返回局部变量的引用
int& test01()
{
int a = 10;//局部变量存放在栈区
return a;
}
int main()
{
int& ret1 = test01();
cout << "ret=" << ret1 << endl;//第一次正确是编译器做了保留
cout << "ret=" << ret1 << endl;//出现随机值,a的内存已经释放
}
执行结果
ret1=10
ret1=1375054224
首先在引用作为返回值时,需要注意的是,函数内部返回的如果是局部变量,返回的引用在输出时,
第一次能够正确是编译器做了保留,第二次是局部变量被释放,解决的办法就是在函数内,给需要返
回的变量初始化时加上static
#include <iostream>
using namespace std;
//函数引用可以作左值
int& test02()
{
static int a = 10;//静态变量在程序结束后进行释放
return a;
}
int main()
{
int& ret2 = test02();
cout << "ret2=" << ret2 << endl;
cout << "ret2=" << ret2 << endl;
test02() = 1000;
cout << "ret2=" << ret2 << endl;
cout << "ret2=" << ret2 << endl;
}
执行结果
ret2=10
ret2=10
ret2=1000
ret2=1000
返回类型为引用的函数可以作为左值,第一次输出时返回值为10,而第二次为1000,因为test02返回
的是a的引用,其实就相当于返回一个变量,所以可以作为左值,即相当于执行a=1000
#include <iostream>
using namespace std;
void fun1(int& a)
{
cout << "a=" << a << endl;
}
void fun2(int& a)
{
a = 100;
cout << "a=" << a << endl;
}
int main()
{
int a = 10;
fun1(a);
fun2(a);
return 0;
}
执行结果
a=10
a=100
另外,为了防止误操作,可以在作为函数参数的引用前加上const,防止外部实参的引用传入函数中,
实参的值被修改。
void fun1(const int& a)
{
cout << "a=" << a << endl;
}