C++:按值传递对象的原因

2023-11-30

在Java中,所有包含适当对象的变量实际上都是引用(即指针)。因此,使用这些对象作为参数的方法调用始终是“通过引用”。调用修改对象状态的方法也会影响原始对象(在调用方)。

C++ 则不同:这里的参数可以按值传递,也可以按引用传递。对按值传递的对象调用 mutator 方法不会影响原始对象。 (我想按值调用会创建该对象的本地副本)。

因此,我对此的第一反应(从 Java 到 C++)是:在使用对象作为参数时始终使用指针。这给了我我所期望的 Java 行为。

然而,如果不需要修改方法体中的对象,也可以使用“按值调用”。人们想要这样做有什么理由吗?


使用对象作为参数时始终使用指针

不,在C++中总是经过参考,除非你的函数可以用nullptr作为一个有效的论点。如果函数不需要修改参数,则传递const参考。

按值传递参数有多种用途。

如果您的函数需要创建参数的副本,最好通过值传递来创建此副本,而不是在函数内创建副本。例如:

void foo( widget const& w )
{
  widget temp( w );
  // do something with temp
}

而是使用

void foo( widget w )  // copy is made here
{
  // operate on w itself
}

这样做的好处还在于允许编译器move widget如果可能的话,这通常比创建副本更有效。

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

C++:按值传递对象的原因 的相关文章

  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • WCF:无法为 SSL/TLS 安全通道建立信任关系,权限错误

    我有一个客户端站点 当单击按钮时它会调用 wcf Web 服务 客户端站点是 http 而 Web 服务的 url 是 https 并且需要证书 我正在使用有效的签名私钥证书 在我的本地主机上一切正常 但是 在部署到运行 iis 6 的 W
  • 如何存储引用而不必处理生命周期?

    正如建议的the dynamic reload板条箱的例子 我收集了Symbols 而不是每次都提取它们 但是Symbol需要一生 使用生命周期会更改方法签名并破坏与方法的兼容性DynamicReload update 这是一个有效的解决方
  • 在输入流中解码 \u0000 Unicode 的更优雅方法

    我正在解析来自 Facebook 的输入流 我正在使用类似的东西 BufferedReader in new BufferedReader new InputStreamReader url openStream UTF 8 进而in re
  • Angular2 分割字符串(管道?)

    是否可以使用类似的东西 mystr split last 不知何故 我希望已经有一根管子了 为此 您需要一个自定义管道 你可以这样实现 Pipe name split export class SplitPipe implements Pi
  • 如何使用 Spring Boot 应用程序中另一个属性文件中的值解析属性文件中的占位符

    我的 Spring Boot 应用程序具有以下属性文件 src main resources config DEV env properties mail server dev mail domain src main resources
  • 多维数组没有实现 IEnumerable,是吗?

    由于我仍然不明白的原因 看到这个问题 CLR 中的多维数组没有实现IEnumerable
  • Android,AsyncTask,检查状态?

    这是我的代码 在 onCreate 中 new LoadMusicInBackground execute 然后在我的主课快结束时我有这个代码 Helper class to load all the music in the backgr
  • Windows - 在startupinfo中使用wShowWindow打开不影响显示

    我正在尝试做一些简单的事情 例如让 calc exe 启动最小化 但它没有发生 import subprocess import win32gui import win32con info subprocess STARTUPINFO in
  • Sass 3.3.7 - 动态创建图标列表

    我有一个图标类名称列表 例如 auth single multi auth batch auth file auth imp file auth man fund tran 我想循环遍历此列表 总共 100 个图标 并为每个图标定义一个类
  • (如何)在 boost 几何体中创建自己的多边形类型并使用 multi_polygon 类型?

    我目前正在尝试用一些扩展 boost geometry 多边形 附加信息 然而编译器启动 include
  • beautiful print 嵌套 矢量图

    我有以下代码来漂亮地打印通用向量 print a vector template
  • 在 Unity3d 中使用 Android 上的音量按钮

    我正在尝试在 Android 上的 unity3d 游戏中使用音量按钮 不幸的是 我看不到任何与卷映射为 KeyCode 相关的内容 因此在我看来 Unity3d 中不存在此功能 有没有一种更隐蔽的方法 有没有办法解决这个问题 其应用是在按
  • PHP 的隐藏功能? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前
  • PHP中使用jqgrid上传文件

    我正在尝试使用 jqgrid 在 Zend Framework 项目中 实现文件上传 jqgrid 允许您创建 文件 类型的输入字段 但不启用 ENCTYPE multipart form data 创建者建议使用另一个插件来处理文件上传
  • 在 Spring Boot 3.2 中注册 Geolatte Jackson 模块

    希望能够反序列化几何几何在 Spring Boot 3 2 中通过注册来指向杰拉特 JSON模块成功并使用其反序列化器 我可以手动注册GeolatteGeomModule在控制器中 但没有让 Spring Boot 自动拾取它 Entity
  • Spring中实现授权

    我有一个用例 其中我只需执行授权部分 JWT 令牌由另一个服务生成 我的服务将仅使用该令牌 该令牌在其自定义声明中包含数据 在我的 Spring Boot 应用程序中 我只想在允许用户访问任何 API 之前验证该令牌是否有效 在所有答案中
  • Java:Linux 中的图形

    是否必须在 Linux 机器上安装 X Windows 才能使 Java 显示全屏图形 那么 全屏图形 有点模糊 不管怎样 显然正在努力从 Java 访问帧缓冲区 帧缓冲工具包 该项目的目标是生成一个代码体 该代码体是 AWT 和 Swin
  • 将mysql结果导出到excel

    我找到了一个小脚本 可以将信息导出到 xls 文件 但我似乎无法让它工作 原始代码可以在这里找到 这是我的代码 Query Database query SELECT FROM db clients WHERE published 1 AN
  • 您可以使用映射来创建没有包装器的实例吗?

    在Python中 你可以将类的名称作为参数给出map为了创建该类的实例 class Point object def init self x y self x x self y y coords 1 2 3 4 pts map Point
  • C++:按值传递对象的原因

    在Java中 所有包含适当对象的变量实际上都是引用 即指针 因此 使用这些对象作为参数的方法调用始终是 通过引用 调用修改对象状态的方法也会影响原始对象 在调用方 C 则不同 这里的参数可以按值传递 也可以按引用传递 对按值传递的对象调用