定义引用类型:
int ival = 1024;
int &refVal = ival;
意义:
实质是给ival变量起了别名,叫refVal。
比如你爸可以叫你全名,也可以叫你乳名,还可以叫你儿子,都是指你。
注意以下3点:
(1)定义时必须要赋值,不赋值会报错,下面这样是错的:
int &refVal2; //此行报错
(2)直接用字面值赋值给引用也是错的:
int &refVal2 = 100; //此行报错
(3)引用的类型和被引用的变量类型不一致也是错的:
double dval = 3.14;
int &refVal3 = dval; //此行报错
既然是别名,那么引用就等价于变量,可以在等号右边给其他变量赋值。
int ival = 1024;
int &refVal = ival;
int ival2;
ival2 = refVal; //等价于ival2 = ival;
当然也可以放在等号右边,被其他变量赋值。
int ival = 1024;
int &refVal = ival;
int ival2 = 1;
refVal = ival2;
std::cout << ival << " " << refVal << " " << ival2 << std::endl;
输出结果
1 1 1
你可能会认为现在refVal转去引用ival2了。并不会这样,ta
引用不能转绑,赋值之后只能访问最初的引用
也就是你的名字会跟你一辈子(不考虑改名的情况)
如果引用加上了const,那就是来搞事情了。此时,上文提到要注意的3点只剩1点了:
</br>
(1)const特性本来就是必须要初始化的,所以定义时还是必须要赋值
const int &r1; //此行报错
(2)现在直接用字面值赋值给引用完全没问题了:
const int &r1 = 100; //合法
std::cout << r1 << std::endl; //输出100
(3)引用的类型和被引用的变量类型不一致也是对的:
double dval = 3.14;
const int &r2 = dval;
std::cout << ri << std::endl; //输出3
//实际上等价于:
double dval = 3.14;
const int temp = dval;
const int &ri = temp;
std::cout << ri << std::endl; //输出3
另
指针和引用的主要区别:
(1)指针本身是一个对象,可以对指针赋值和靠背,指针可以改变指向对象;引用不是一个对象,不能重新绑定到另一个对象。
(2)指针不需要在定义时就赋值;引用必须在定义时赋值。