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");
}

c++ 中ref关键字的应用_第1张图片
正常调用函数,有无ref,对结果和过程都无影响

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

#include 
#include 
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 
#include 
#include 
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 和引用的区别

你可能感兴趣的:(C++笔记,c++)