c++ 中ref 和引用的区别

2023-11-18

c++ 中 本身可以使用 & 来实现引用 ,那为什么还会出现ref 呢?

ref:

int f2(int &c){
    c++;
    cout<<"in function c = " << c<<endl;
}

int main(){
    int c = 10;
    f2(ref(c));
    cout<<" out function c = " <<c <<endl;
}

&: 

int f2(int &c){
    c++;
    cout<<"in function c = " << c<<endl;
}

int main(){
    int c = 10;
    f2(c);
    cout<<" out function c = " <<c <<endl;
}

这两个得到的结果是一样的,那到底有什么区别呢?

当在使用std::bind时,是对参数直接拷贝,而不是引用。如下例子:

#include <iostream>
#include <functional>

using namespace std;


void f(int &a,int &b,int &c){
    cout<<"in function a = "<<a<<"  b = "<<b<<"  c = "<<c<<endl;
    cout<<"in function a = "<<&a<<"  b = "<<&b<<"  c = "<<&c<<endl;
    a += 1;
    b += 10;
    c += 100;
}
 
int main(){
 
    int n1 = 1 ,n2 = 10,n3 = 100;
 
    function<void()> f1 = bind(f,n1,n2,ref(n3));
        
    f1();
    cout<<"out function a = "<<n1<<"  b = "<<n2<<"  c = "<<n3<<endl;
    cout<<"out function a = "<<&n1<<"  b = "<<&n2<<"  c = "<<&n3<<endl;
    f1();
    cout<<"out function a = "<<n1<<"  b = "<<n2<<"  c = "<<n3<<endl;
    cout<<"out function a = "<<&n1<<"  b = "<<&n2<<"  c = "<<&n3<<endl;
 
    return 0;

}

输出:

in function a = 1  b = 10  c = 100
in function a = 0x56321f137c34  b = 0x56321f137c30  c = 0x7ffc5f2cbacc
out function a = 1  b = 10  c = 200
out function a = 0x7ffc5f2cbac4  b = 0x7ffc5f2cbac8  c = 0x7ffc5f2cbacc
in function a = 2  b = 20  c = 200
in function a = 0x56321f137c34  b = 0x56321f137c30  c = 0x7ffc5f2cbacc
out function a = 1  b = 10  c = 300
out function a = 0x7ffc5f2cbac4  b = 0x7ffc5f2cbac8  c = 0x7ffc5f2cbacc

在这里我们可以发现,在用bind的时候,如果不用ref,那么调用时函数里外就不是相同的地址,而使用ref的话,其地址在函数里外都是相同的。

ref能用包装类型reference_wrapper来代替原本会被识别的值类型,而reference_wrapper能隐式转换为被引用的值的引用类型。 

不仅仅是在使用bind时,在使用thread进行编程时,也会发生这样的问题,thread的方法传递引用的时候,必须外层用ref来进行引用传递,否则会编译出错。

void method(int & a){ a += 5;}

using namespace std;
int main(){

    int a = 0;
    thread th(method,ref(a));
    th.join();
    cout << a <<endl;
    //thread th2(method,a);  //去掉注释会编译出错
    //th2.join();
    cout << a <<endl;
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ 中ref 和引用的区别 的相关文章

  • Windows 上使用 g++ 的 Makefile,链接库

    我已经厌倦了 MSVC 6 以及每个人总是告诉我它是一个蹩脚的编译器等等 所以现在我决定尝试使用 vim 加 g 和 makefile 这是我的问题 我有以下 makefile This is supposed to be a commen
  • 更快的算法来计算有多少数字可以被范围内的特定整数整除

    int a b c d 0 cin gt gt a gt gt b gt gt c for int i a i lt b i if i c 0 d cout lt
  • 为什么opencv videowriter这么慢?

    你好 stackoverflow 社区 我有一个棘手的问题 我需要你的帮助来了解这里发生了什么 我的程序从视频采集卡 Blackmagic 捕获帧 到目前为止 它工作得很好 同时我用 opencv cv imshow 显示捕获的图像 它也工
  • WebClient读取错误页面的内容

    我有一个加载页面内容的应用程序 我使用 WebClient 类 即使服务器返回 404 500 等错误 我也需要检索内容 我需要这样的东西 WebClient wc new WebClient string pageContent try
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • 通过单个 GPIO 引脚转储闪存

    我正在使用 Infineon 的 XMC4500 Relax Kit 并尝试通过单个 GPIO 引脚提取固件 我非常天真的想法是通过 GPIO 引脚一次转储一位 然后用逻辑分析仪以某种方式 嗅探 数据 伪代码 while word by w
  • 如何使用汇编获取BIOS时间?

    我正在从头开始实现一个小型操作系统 用于教育目的 现在 我想使用汇编来获取 BIOS 时间 我对此进行了很多搜索 但找不到任何代码示例来执行此操作 如果有人可以提供任何参考或代码示例或与此相关的任何内容 我将非常感激 See 时钟中断 1a
  • 如何将字节块读入结构体

    我有一个需要处理的资源文件 它包含一组文件 首先 资源文件列出了其中包含的所有文件 以及一些其他数据 例如在此结构中 struct FileEntry byte Value1 char Filename 12 byte Value2 byt
  • F10键没被抓住

    I have a Windows Form and there overriden ProcessCmdKey However this works with all of the F Keys except for F10 I am tr
  • 将成员函数作为参数传递/c++

    我想用 C 实现一个类b可以通过封装该迭代器类型的成员集进行某种迭代 喜欢 b object for each x do function f so 函数 f会得到每个人的x成员并做任何事情 比方说 void function f x me
  • 使用 openssl 检查服务器安全协议

    我有一个框架应用程序 它根据使用方式连接到不同的服务器 对于 https 连接 使用 openssl 我的问题是 我需要知道我连接的服务器是否使用 SSL 还是 TLS 以便我可以创建正确的 SSL 上下文 目前 如果我使用错误的上下文尝试
  • 使用scanf()时如何区分整数和字符

    我只是使用该功能scanf 代码如下 scanf d a printf d a 当我输入1时 它会像我想要的那样打印1 但即使我输入 1a 它也会像以前一样打印 1 当用户输入非整数时 例如 2 3 12ab 1 a 我想向用户显示 输入整
  • c# 如何生成锦标赛括号 HTML 表

    所以我已经被这个问题困扰了三个星期 但我一生都无法弄清楚 我想做的是使用表格获得这种输出 演示 http www esl world net masters season6 hanover sc2 playoffs rankings htt
  • 如何在 C# 中使用 XmlDsigC14NTransform 类

    我正在尝试使用规范化 xml 节点System Security Cryptography Xml XMLDsigC14nTransformC net Framework 2 0 的类 该实例需要三种不同的输入类型 NodeList Str
  • 是什么原因导致 Linq 错误:此方法无法转换为存储表达式?

    我有一堆具有相同 select 语句的 Linq to Entity 方法 所以我想我会很聪明 并将其分离到它自己的方法中以减少冗余 但是当我尝试运行代码时 我得到了以下内容错误 该方法不能转化为 商店表达式 这是我创建的方法 public
  • 如何在 VS Code 中为 CMake 项目设置 C/C++ IntelliSense?

    我正在尝试使用 libTooling 编写一个工具 我对其进行了设置 以便它可以使用 LLVM 文档中的示例进行编译 然而 C C IntelliSense 似乎不适用于 CMake 项目 我的工具位于
  • 你能解释一下这个C++删除问题吗?

    我有以下代码 std string F WideString ws GetMyWideString std string ret StringUtils ConvertWideStringToUTF8 ws ret return ret W
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows

随机推荐

  • 【异常】RuntimeError: Failed to process string with tex because latex could not be found

    1 异常描述 RuntimeError Failed to process string with tex because latex could not be found RuntimeError Failed to process st
  • GLSL-WebGL着色器语言语法详解

    GLSL语法 GLSL它是强类型语言 每一句都必须有分号 它的语法和 typescript 挺像 GLSL的注释语法和 JS 一样 变量名规则也和 JS 一样 不能使用关键字 保留字 不能以 gl webgl 或 webgl 开头 运算符基
  • < Linux >:Linux 环境基础开发工具使用 (3)

    目录 一 Linux 调试器 gdb 的使用 1 1 背景 1 2 开始使用 1 3 理解 二 Linux项目自动化构建工具 make与Makefile makefile 2 1 背景 2 2 项目结构 三 Linux 系统中第一个小程序
  • 生活当中调整时钟时间背后发生的事情

    生活当中调整时钟时间背后发生的事情 我们在生活当中想要设定时钟 手表的时间的事情 我们通过会和大多数人一样 会按照手机上的时间来设定 但是 这背后发生了什么事情 我想大部分人应该是不知道的 其实我们自己的时间是自动设定 每隔一阵子 我们的手
  • springboot集成pagehelper

    1 导入pom xml
  • postman调用参数是对象

    写了一个controller 需要用postman调通测试一下 请求参数是vo controller 端口号是1213 postman调用时传入对象的方式如下
  • STC15单片机-低功耗设计

    低功耗设计 STC15省电模式 数据手册有介绍 STC15系列单片机可以运行3种省电模式以降低功耗 它们分别是 低速模式 空闲模式和掉电模式 正常工作模式下 STC15系列单片机的典型功耗是2 7mA 7mA 而掉电模式下的典型功耗是 lt
  • SpringBoot实现微信支付,微信扫码支付,Native支付(全网最详细教程)

    1 添加微信支付依赖
  • ICCV、ECCV、CVPR三大国际会议

    目录 前言 一 ICCV ECCV CVPR是什么 1 ICCV 2 ECCV 3 CVPR 二 三大会链接及论文下载链接 前言 作为刚入门CV的新人 有必要记住计算机视觉方面的三大顶级会议 ICCV CVPR ECCV 统称为ICE 与其
  • 【论文翻译】文本语义提取

    摘要 文本文档是存储信息的手段之一 这些文档可以在个人桌面计算机 内部网和Web上找到 因此 有价值的知识以非结构化的形式嵌入 拥有一个可以从文本中提取信息的自动化系统是非常可取的 然而 开发这样一个自动化系统的主要挑战是自然语言并不是没有
  • geth生成钱包地址

    配置Geth 博主是Ubuntu18 04 所以 sudo apt update sudo add apt repository ppa longsleep golang backports sudo apt update sudo apt
  • 宏定义与逻辑运算学习笔记

    宏定义 宏定义又称为宏代换 宏替换 简称 宏 格式 define标识符 字符串 其中的标识符就是所谓的符号常量 也称为 宏名 掌握 宏 概念的关键是 换 即在对相关命令或语句的含义和功能作具体分析之前就要换 例 define PI 3 14
  • Tracy 小笔记 Vue - Vue 数据的响应式原理

    变量如果是对象的话 那么需要给对象先定义好属性 才能响应式 因此需要提前定义好所需的属性 如 info name 11 value 22 添加属性 如果想要再之后添加属性的话还想要响应式的话 有如下两种方式 使用 Vue set 这个可以是
  • errcode = 40163; errmsg = "code been used"(提供一种解决思路)

    最近在做微信开发 就在开发完毕测试的时候 遇到一个大问题 每次新用户进入的时候就报错 错误基本上就是code been used 我去百度了好久 没有找到合适的方案 后来我仔细的看了一下微信开发文档 终于解决了 注 该方法不一定对所有人有效
  • C语言中关键字const、static、volatile的用法分析

    1 const 作为一个程序员 我们看到关键字const时 首先想到的应该是 只读 因为 它要求其所修饰的对象为常量 不可对其修改和二次赋值操作 不能作为左值出现 看几个例子 const int a 同上面的代码行是等价的 都表示一个常整形
  • TCP 、UDP、IP包的最大长度是多少?

    对于UDP协议来说 整个包的最大长度为65535 其中包头长度是65535 20 65515 对于TCP协议来说 整个包的最大长度是由最大传输大小 MSS Maxitum Segment Size 决定 MSS就是TCP数据包每次能够传 输
  • 数据回归算法

    文章目录 效果一览 文章概述 源码设计 参考资料 效果一览 文章概述 数据回归算法 Matlab实现逐步回归预测模型 逐步回归 Stepwise Regression 其基本思想是将变量逐个引入模型 每引入一个预测变量 解释变量 后都要进行
  • 作为一个Java程序员,深入java虚拟机第四版

    第一阶段 架构师筑基必备技能 我觉得 但凡是个成年人应该都清楚扎实的基本功对自己的工作帮助有多重要 从各大招聘网站的招聘要求来看 第一条都明确说明需要扎实的Java基础 因此 一般笔试以及面试的第一轮 对基础的考察是比较多的 其实我发现有很
  • 如何写一个随机洗牌函数

    看到了很多人写得随机洗牌函数 但是感觉写得都不是太好 自己写了一个试试 基本要求 给定一定范围的数比如最大值最小值 min max 在这个之间进行随机洗牌 首先生成一个按min到最大的max的数组a 对数组进行循环 每次随机生成一个要取的下
  • c++ 中ref 和引用的区别

    c 中 本身可以使用 来实现引用 那为什么还会出现ref 呢 ref int f2 int c c cout lt lt in function c lt lt c lt