c++ 中ref关键字的应用

c++ 中 本身可以使用 & 来实现引用 ,那为什么还会出现ref 呢?
ref()方法的返回值是reference_wrapper类型,这个类的源码大概的意思就是维持一个指针,并且重载操作符。
ref()能用包装类型reference_wrapper来代替原本会被识别的值类型,而reference_wrapper能隐式转换为被引用的值的引用类型。
std::ref 用于包装按引用传递的值。
std::cref 用于包装按const引用传递的值。

函数调用,有无ref使用的影响:

void fun(int& iInputParam) 
{
    iInputParam++;
    std::cout << "ref:: input iInputParam = " << iInputParam << std::endl;
}
int main()
{
    int iTest1 = 10;
    fun(std::ref(iTest1));
    std::cout << "ref:: iTest1 = " << iTest1 << std::endl;

    std::cout << "" << std::endl;
    int iTest2 = 10;
    fun(iTest2);
    std::cout << "ref:: iTest2 = " << iTest2 << std::endl;
    system("pause");
}

在这里插入图片描述
正常调用函数,有无ref,对结果和过程都无影响

thread的方法传递引用的时候,必须外层用ref来进行引用传递,否则会编译出错。

#include <iostream>
#include <thread>
void f2(int& iInputParam) {
    iInputParam++;
    std::cout << "ref:: input iInputParam = " << iInputParam << std::endl;
}
int main()
{
    int iTest1 = 10;
    std::thread m_T1(f2, std::ref(iTest1));
    m_T1.join();
    std::cout << "m_T1:: iTest1 = " << iTest1 << std::endl;
    system("pause");
}

在这里插入图片描述
std::ref(iTest1) 若改为 iTest1 ,编译会出错

函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用。bind()是一个函数模板,它的原理是根据已有的模板,生成一个函数,但是由于bind()不知道生成的函数执行的时候,传递进来的参数是否还有效。所以它选择参数值传递而不是引用传递。如果想引用传递,std::ref和std::cref就派上用场了。

#include <iostream>
#include <thread>
#include <functional>
void f(int& n1, int& n2, const int& n3)
{
    std::cout << "In function: n1: "<< n1<<", n2: "<<n2<< ", n3: "<< n3<< std::endl;
    ++n1; // 增加存储于函数对象的 n1 副本
    ++n2; // 增加 main() 的 n2
    //++n3; // 编译错误
    std::cout << "In function end: n1: " << n1 << ", n2: " << n2 << ", n3: " << n3 << std::endl;
}
int main()
{
    int n1 = 1, n2 = 1, n3 = 1;
    std::cout << "Before function: n1: " << n1 << ", n2: " << n2 << ", n3: " << n3 << std::endl;
    std::function<void()> bound_f = std::bind(f, n1, std::ref(n2), std::cref(n3));
    bound_f();
    std::cout << "After function: n1: " << n1 << ", n2: " << n2 << ", n3: " << n3 << std::endl;
    system("pause");
}

在用bind的时候,如果不用ref时,调用函数是没有引用的。
n1是值传递,函数内部的修改对外面没有影响。
n2是引用传递,函数内部的修改影响外面。
n3是const引用传递,函数内部不能修改。

参考博客:
std::ref和std::cref使用
c++ 中ref 和引用的区别

  • 11
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qzy0621

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值