c++引用作函数参数为何传变量

tech2024-12-03  6

void zeng(int& r) // 引用作函数参数 { ++r; } int main() { int a; // 变量a int& ra = a; // ra是a的引用 zeng(a); // 传int类型变量a std::cout << a << std::endl; zeng(ra); // 传int& 引用类型ra std::cout << a << std::endl; }

引用作函数的参数, 可能有这个疑问, 以上面例子中的变量为例, 函数形参要求传引用类型int&, 而调用函数时却传入了int类型. 不是类型不匹配吗? 甚至可能会思考会不会有隐式类型转换, 把int类型转换为了int&?

答案是这里面弄错了几个概念. 

第一, 引用是什么? 引用的定义必须是 定义时要初始化绑定到唯一一个变量, 而且不能重新绑定, 终身只绑定这一个变量, 不能不绑定. 所以函数形参int& r根本就不是完整的引用类型, 因为它不符合引用的定义. 单独的 int& r没有绑定变量根本不是完整的引用.

而一般的函数参数传递,无论传指针地址还是传值, 都是传递参数, 而引用传参是特殊处理, 不是传参, 而是用实参绑定形参, 这一点很多教材教程里都能找到说明. 而这样操作的依据就是上面说的 引用的完整定义必须是初始化. 所以引用类型传参非常类似引用的初始化, 不是普通的传参, 而是传参绑定. 

而上面例子中传入引用类型ra到函数zeng的形参也不是类型匹配, 而是形参r作为引用的引用, 仍然会绑定原对象a. 而引用的引用在c++是合法的.

而形参表int& r虽然不算完整的引用类型定义, 但仍然是指明这里需要传引用类型. 这应该符合逻辑感觉, 实际编译器也是这样认定的.

所以, 引用作为函数参数, 实参不是简单的传参, 而是实参绑定到形参. 这里有一个函数传参的特殊处理. 而这个特殊处理的依据是: 引用的定义必须初始化. 所以也不是类型不匹配问题, 而是绑定传参的特殊处理, 也没有类型转换.

第二, 引用是什么数据类型? 上例中, int& ra = a; 右边直接=a, 而a是int类型, 那ra也是int类型吗? 引用不是一种对象, 只是一个别名, 引用作为对象的别名存放的也是对象的地址, 我们不能另某个指针指向引用, 也不能定义引用的数组. 它不是一种对象就没有类型, 或者可以说它就是引用类型, 就是int&类型.

最新回复(0)