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


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&类型.

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值