引用可以理解为给变量起一个别名,主要用于传参,通过定义引用变量,可以不使用副本,直接使用原始数据。
引用变量
定义引用变量:
int a; int &b = a;//注意一定要初始化
这里的&不是取地址符,是引用的标符号,这里定义了a的一个引用b,a和b会指向相同的内存单元,有相同的值,而且使用方法都是相同的。也就是说,此时可以把b看做a,两者是一样的。
来看一个例子:
#include<iostream> using namespace std;
int main() { int a = 1; int c = 2; int &b = a; cout << "a=" << a << " 地址:" <<&a <<endl << "b="<< b << " 地址:" << &b <<endl<<endl;
a++; cout << "a=" << a << " 地址:" <<&a <<endl << "b="<< b << " 地址:" << &b <<endl<<endl;
b++; cout << "a=" << a << " 地址:" <<&a <<endl << "b="<< b << " 地址:" << &b <<endl<<endl;
b=c;//这里是赋值,将c的值赋给b,而不是将b改为c的引用 cout << "a=" << a << " 地址:" <<&a <<endl << "b="<< b << " 地址:" << &b <<endl<<endl; system("pause"); }
运行结果如下:
a=1 地址:0015FAB8 b=1 地址:0015FAB8
a=2 地址:0015FAB8 b=2 地址:0015FAB8
a=3 地址:0015FAB8 b=3 地址:0015FAB8
a=2 地址:0015FAB8 b=2 地址:0015FAB8
请按任意键继续. . .
,可见,a和b的值和地址是完全相同的,修改a或b任意一个变量,另一个会随之改变。
引用传参
引用常被用于传参,通过定义引用变量,可以不使用副本,直接使用原始数据,这样可以代替传递指针。下面来看引用传参的例子:
#include<iostream> using namespace std;
void swap(int &i,int &j);
int main() { int a = 1; int b = 2; cout << "a=" << a << " 地址:" <<&a <<endl << "b="<< b << " 地址:" << &b <<endl<<endl; swap(a,b); cout << "a=" << a << " 地址:" <<&a <<endl << "b="<< b << " 地址:" << &b <<endl<<endl; system("pause"); }
void swap(int &i,int &j) { cout << "i=" << i << " 地址:" <<&i <<endl << "j="<< j << " 地址:" << &j <<endl<<endl; int temp = i; i = j; j = temp; };
结果如下:
a=1 地址:003AFBC0 b=2 地址:003AFBB4
i=1 地址:003AFBC0 j=2 地址:003AFBB4
a=2 地址:003AFBC0 b=1 地址:003AFBB4
请按任意键继续. . .
可以看到,通过引用来传参,可以直接对原始数据进行修改,从而达到和传递指针一样的效果,而且操作起来更加直观方便。 注意此时swap()函数的传入参数必须是int型变量,如果传入int数或公式会报错,例如:
swap(a,3); //错误 swap(a,b+3); //错误 1 2 但如果将引用定义为const,就可以使用常数和公式了,例如:
#include<iostream> #include<fstream> using namespace std;
void swap(const int &i,const int &j);
int main() { int a = 1; int b = 2; cout << "a=" << a << " 地址:" <<&a <<endl << "b="<< b << " 地址:" << &b <<endl<<endl; swap(a,b+3); cout << "a=" << a << " 地址:" <<&a <<endl << "b="<< b << " 地址:" << &b <<endl<<endl; system("pause"); }
void swap(const int &i,const int &j) { cout << "i=" << i << " 地址:" <<&i <<endl << "j="<< j << " 地址:" << &j <<endl<<endl; };
结果如下:
a=1 地址:002CF790 b=2 地址:002CF784
i=1 地址:002CF790 j=5 地址:002CF6B8
a=1 地址:002CF790 b=2 地址:002CF784
请按任意键继续. . .
可以看到使用const来修饰引用后,可以使用常数和公式作用参数,但实际是创建了临时变量,并没有修改引用变量的值。 |
|