这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
引用可以理解为给变量起一个别名,主要用于传参,通过定义引用变量,可以不使用副本,直接使用原始数据。通过将声明符写成&d的形式来定义引用类型,其中d是声明的变量名。
引用的定义
int val = 1024;
int &reval = val; //reval指向val(是val的另一个名字)
int &reval2; //报错,引用必须被初始化
int &reval3 = 1024; //报错,引用类型的初始值必须是一个对象
double dval = 3.14;
int &reval4 = dval; //报错,引用类型的初始值必须与其修饰符类型一致
- 引用并非对象,只是一个已经存在的对象所起的另一个名字。因此定义一个引用,并不会开辟对象的内存空间,只会开辟存储引用变量的内存空间。
- 因为引用并非对象,所以定义时必须进行初始化,也不能定义引用的引用。
- 定义一个引用之后,对其进行的操作都是在与之绑定的对象上进行的。
来看一个例子:
#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 <stdio.h>
void add(int &p_a){
p_a = p_a+1;
}
int main(){
int a = 2;
printf("a=%d\n", a);
add(a);
printf("a=%d\n", a);
return 0;
}
-
注意此时add()函数的传入参数必须是int型变量,如果传入int数或公式会报错,例如:
- add(3); //错误
- add(b+3); //错误
-
如果将引用定义为
const,就可以使用常数和公式了。