本质
引用的本质其实就是指针常量 *const p
引用的底层机制实际上是和指针一样的。不要相信有别名,不要认为引用可以节省一个指针的空间,因为这一切不会发生,编译器还是会把引用解释为指针。
引用和指针本质上没有区别。
举例:
int a = 3; // 声明普通的整型变量。int& ra = a; // 创建引用ra,ra是a的别名。 把int&替换成int* const 把a替换成&aint* const rb = &a; // 声明指针常量rb,让它指向变量a。cout << "a的地址:" << &a << endl;cout << "ra的地址:" << &ra << endl;cout << "rb的地址:" << rb << endl;
输出的地址都是相同的。
注意
引用作为函数形参时
传引用不必使用二级指针
传递引用给函数就相当于传递变量本身。在函数内部,这个引用将作为原始数据的别名出现,所以你对这个引用的任何操作就是对原始数据的操作。
当你在 C 或 C++ 中使用二级指针(指向指针的指针)时,你通常是希望在函数内部修改指针的值,这样就可以影响到函数外部的指针。因为在 C 和 C++ 中,函数参数是以值传递的方式传入函数的,所以如果你希望修改传入的指针,你需要传入该指针的地址,即需要用到二级指针。
然而在C++中,引用类型让我们可以直接传入变量本身,然后在函数内部进行修改,从而影响到函数外部的变量,所以无需使用二级指针。这就是为什么在C++中,传引用不必使用二级指针的原因。
引用的形参和const
将引用形参声明为const的理由有三个:
- 使用const可以避免无意中修改数据的编程错误。
- 使用const使函数能够处理const和非const实参,否则将只能接受非const实参。
- 使用const,函数能正确生成并使用临时变量。