引用变量是一种复合类型。
引用是已定义的变量的别名(另一个名称),假设蟑螂的小名叫小强,那么我们说蟑螂和小强就是同一个东西,只是名字不一样。换成变量也一样,假设有变量A,它的引用为B,那么B就是A的别名,A就是B,B就是A,它们的值和地址都一样。
【创建引用变量】
C++将&符号作为地址运算符,假设有个变量C,那么&C就是C的地址(内存单元);同时&符号也可以用来声明引用。
例如:
int a=10;
int &b=a;
int &就是指向int变量的引用。
a和b的值都为10,它们的地址也相同,如果是a或者b变化了(进行了运算),另外一个也会随着改变,这个跟指针差不多,下面用代码来解释更为直接明了,为了跟指针进行对比,代码前一部分为引用,后一部分为指针。
#注意:必须在声明引用变量时将其进行初始化,不然系统会随机给个值。
【代码示例】
#include
#include
int main()
{
using namespace std;
int a = 10;
//引用
int &b = a;
cout << "没变时:a = " << a << "\tb = " << b << endl;
a += 10;
cout << "a变化后:a = " << a << "\tb = " << b << endl;
b += 10;
cout << "b变化后:a = " << a << "\tb = " << b << endl;
cout << "此时a的地址为:" << &a << "\tb的地址为:" << &b<<"\n\n";
//指针
int *c = &a;
cout << "没变时:a = " << a << "\tb = " << *c << endl;
a += 10;
cout << "a变时:a = " << a << "\tb = " << *c << endl;
*c += 10;
cout << "*c变时:a = " << a << "\tb = " << *c << endl;
cout << "此时a的地址为:" << &a << "\tb的地址为:" << c << endl;
system("pause");
return 0;
}
【演示结果】
如果将一个变量的引用改为另一个变量的引用,那会发生什么情况?
例如:
int a=10;
int &b=a;
int c=20;
b=c;
这样会使得a=b=c,但是&a=&b!=&c;也就是说a、b、c的值相同,但是a和b的地址相同,c却不相同。这是为什么呢?
原因是:引用可以通过初始化声明来设置,像这样int &b=a;但不能通过赋值来设置,像这样子b=c;这样只赋值,而不改变地址,因为a就是b,所以把c的值赋给b,就相当于把值赋给了a,所以才导致了a=b=c,&a=&b!=&c的出现。
【代码示例】
#include
#include
int main()
{
using namespace std;
int a =10;
//引用
int &b = a;
cout << "没变时:a = " << a << "\tb = " << b << endl;
a += 10;
cout << "a变化后:a = " << a << "\tb = " << b << endl;
b += 10;
cout << "b变化后:a = " << a << "\tb = " << b << endl;
cout << "此时a的地址为:" << &a << "\tb的地址为:" << &b<<"\n\n";
int c = 10;
b = c;
cout << "引用变化后:a = " << a << "\tb = " << b <<"\tc = "<
【演示结果】
【将引用用作函数参数】
引用经常被用作函数参数,使得函数中的变量名成为调用函数中变量的别名。而这种传递参数的方法被称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。
传递参数常见的三种方法:1、按值传递 2、按引用传递 3、按地址传递
【按值传递】
例如:
void love(int x)
int main()
{
int a = 10;
love(a);
}
void love(int x)
{
x += x;
}
int a=10;
love(a);
这里创建了一个变量a,并把值20赋给它;
void love(int x)
{
x += x;
}
这里则创建了一个变量x,将传递的值20赋给x,注意只是传值,所以a和x不是同一个东西,是不同的变量。
【按引用传递】
对刚才的代码进行一下修改:
void love(int &x)
int main()
{
int a = 10;
love(a);
}
void love(int &x)
{
x += x;
}
int a=10;
love(a);
这里创建了一个变量a,并把值20赋给它,这一部分是没变的;
void love(int &x)
{
x += x;
}
这一部分就变了,加上了引用,那么x就成为了a的别名,也就是说a就x,x就是a,同一个变量,只是名字不同而已,只要两者其中一个改变,另外一个也得跟着改变。
下面的代码就按值传递 、按指针传递 、按引用传递进行比较。比较结果可想而知,按指针传递、按引用传递都能交换love1和love2的值,而按值传递就不行。
【代码示例】
#include
#include
void swap1(int &a,int &b);
void swap2(int *a1,int *b1);
void swap3(int a2,int b2);
int main()
{
using namespace std;
int love1 = 10;
int love2 = 20;
cout << "-----------------------磊神---------------------------\n";
cout << "没交换之前:love1 = " << love1 << "\tlove2 = " << love2 << endl;
swap1(love1, love2);
cout << "按引用传递交换之后:love1 = " << love1 << "\tlove2 = " << love2 << endl;
swap2(&love1, &love2);
cout << "按指针传递交换之后:love1 = " << love1 << "\tlove2 = " << love2 << endl;
swap3(love1, love2);
cout << "按值传递交换之后:love1 = " << love1 << "\tlove2 = " << love2 << endl;
system("pause");
return 0;
}
void swap1(int &a, int &b)
{
int t;
t = a;
a = b;
b = t;
}
void swap2(int *a1, int *b1)
{
int t;
t = *a1;
*a1 = *b1;
*b1 = t;
}
void swap3(int a2, int b2)
{
int t;
t = a2;
a2 = b2;
b2 = t;
}
【演示结果】
再举一个例子:
下面的代码中,引用变量ra修改了主函数中x的值,而a则没有修改。
【代码示例】
#include
#include
//#include "mytime0.h"
double cube(double a);
double recube(double &ra);
int main()
{
//using std::cout;
//using std::endl;
using namespace std;
double x=3.0;
cout << cube(x);
cout << "此时x = " << x << endl;
cout << recube(x);
cout << "此时x = "<
【演示结果】