C++ 中通过引用传递对象

2024-02-04

通常的方法是通过引用传递变量在C++(也是C)中如下:

void _someFunction(dataType *name){ // dataType e.g int,char,float etc.
/****
definition
*/
}

int main(){
    dataType v;
    _somefunction(&v);  //address of variable v being passed
    return 0;
}

但令我惊讶的是,我注意到当通过引用传递对象对象本身的名称服务于目的(没有&需要符号)并且在函数的声明/定义期间没有*参数之前需要符号。 下面的例子应该可以清楚地说明:

// this
#include <iostream>
using namespace std;

class CDummy {
  public:
    int isitme (CDummy& param);     //why not (CDummy* param);
};

int CDummy::isitme (CDummy& param)
{
  if (&param == this) return true;
  else return false;
}

int main () {
  CDummy a;
  CDummy* b = &a;
  if ( b->isitme(a) )               //why not isitme(&a)
    cout << "yes, &a is b";
  return 0;
}

我无法理解为什么要在课堂上进行这种特殊处理。即使是几乎像类的结构也不会以这种方式使用。对象名称是否像数组一样被视为地址?


似乎让您感到困惑的是,声明为按引用传递的函数(使用&)不使用实际地址调用,即&a.

简单的答案是将函数声明为按引用传递:

void foo(int& x);

这就是我们所需要的。然后它会自动通过引用传递。

现在您可以像这样调用该函数:

int y = 5;
foo(y);

and y将通过引用传递。

你也可以这样做(但为什么要这么做?口头禅是:尽可能使用引用,需要时使用指针) :

#include <iostream>
using namespace std;

class CDummy {
public:
    int isitme (CDummy* param);
};


int CDummy::isitme (CDummy* param)
{
    if (param == this) return true;
    else return false;
}

int main () {
    CDummy a;
    CDummy* b = &a;             // assigning address of a to b
    if ( b->isitme(&a) )        // Called with &a (address of a) instead of a
        cout << "yes, &a is b";
    return 0;
}

Output:

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

C++ 中通过引用传递对象 的相关文章

  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • 将 echo 和 print 合并到一个语句中

    echo 1 print 2 3 返回 214 脚本如何以 14 结尾 当你这样做时 echo 1 print 2 3 PHP 会做 demo http codepad viper 7 com OfrNrs line op fetch ex
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K

随机推荐

  • 获取 Mailgun 中打开或单击的电子邮件的主题

    我已设置 Mailgun 域来跟踪我发送的电子邮件的打开和点击情况Laravel https laravel com docs 5 7 mail introduction app 现在我想设置webhooks https documenta
  • 使 Pydantic BaseModel 字段可选,包括 PATCH 的子模型

    正如已经问过的similar有疑问 我要支持PATCHFastApi 应用程序的操作 调用者可以根据需要指定 Pydantic 的任意数量的字段BaseModel 有子模型 这样高效PATCH可以执行操作 而调用者不必仅仅为了更新两个或三个
  • 注销后销毁握手。套接字.io

    您好 我正在尝试将聊天构建到应用程序中 我想知道的是 当用户注销网站时 我如何销毁与该会话关联的 socket io 握手 以便用户在注销时无法从另一个选项卡发送消息 我正在使用expressjs 如果有帮助的话 好吧 万一有人发现这个并想
  • 查找父节点所选文本的范围

    我想找到所选文本相对于父元素的范围 所以在这个 p 元素 即anchorOffset focusOffset 狐狸 是 16 19 p p The quick brown fox jumps over the lazy dog p 但如果我
  • 在保护模式下重新启动

    在 x86 实模式下重启非常简单 您可以使用 BIOS 或 jmp 0xFFFF 0000 但是在保护模式下应该如何重新启动呢 有关端口 0xCF9 的信息 为了写入它 需要访问内核模式 即来自内核驱动程序 0xCF9端口可以获得三种复位类
  • 使用 about:config 覆盖 Firefox 不安全警告

    我正在尝试编写一个简单的批处理脚本来截取内部网页的一些屏幕截图 并发现 Firefox 具有将窗口渲染到画布的能力 var canvas document createElement canvas var ctx canvas getCon
  • 整数相乘并赋值给 Long 时溢出

    如果我在立即窗口中输入以下内容 则会收到运行时错误 6 溢出 MsgBox 24 60 60 为什么是这样 这也失败了 Dim giveTime As Long giveTime 24 60 60 为什么是这样 giveTime被声明为 L
  • 如何在 pyqt 中嵌入 matplotlib - 傻瓜指南

    我目前正在尝试将我想要绘制的图表嵌入到我设计的 pyqt4 用户界面中 由于我对编程几乎完全陌生 我不明白人们是如何在我发现的示例中嵌入的 and that one http eli thegreenplace net files prog
  • 尝试使用 Tailwind CSS 构建布局

    我试图用 tailwind css 构建这个布局 但我不明白 我想创建的布局 https i stack imgur com pOrZW jpg 我的布局 https i stack imgur com 4gCwv jpg
  • “python方式”解析并有条件地替换二维列表中的每个元素[重复]

    这个问题在这里已经有答案了 我有一个列表 其中包含进一步的字符串列表 这些字符串可能代表单词 在字母数字意义上 或整数 例如 myLists 5 cat 23 33 parakeet scalpel correct horse batter
  • OnCheckedChanged 事件根本没有在 GridView 中触发

    我有一个 GridView 在 TemplateField 中有一个 asp 复选框 TemplateField 定义如下
  • 如何在向 dom 元素添加类后强制 ie8 重新绘制

    在 ie8 中 如果更改类名时元素不使用关联的 css 进行 重新绘制 那么如何强制浏览器刷新而不影响 ie8 性能 这个帖子 如何强制 WebKit 重绘 重绘以传播样式更改 https stackoverflow com questio
  • 如何更改 DBpedia SPARQL 查询的执行时间上限? (Virtuoso 42000 错误)

    我正在通过 Python 使用 SPARQL 查询 DBpedia 我面临执行时间上限的问题 这是错误 Code sparql SPARQLWrapper http dbpedia org sparql newquery DEFINE in
  • Flex 4 滚轮

    在我的应用程序中 我正在使用Scroller http help adobe com en US FlashPlatform reference actionscript 3 spark components Scroller html成分
  • 列出我的计算机上安装的物理驱动器[重复]

    这个问题在这里已经有答案了 可能的重复 如何列出物理磁盘 https stackoverflow com questions 327718 how to list physical disks 列出我的计算机上安装的物理驱动器的 最佳方式
  • 参数索引超出范围(2 > 参数数量,即 1)[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions String query inser
  • addOnCompleteListener 未使用 cloud firestore 离线调用

    我一直在使用新的云 Firestore 数据库编写一个应用程序 它工作得很好 只是尽管启用了离线持久性 但离线时很多事情都不能顺利进行 例如我执行以下操作 ref delete addOnCompleteListener new OnCom
  • 反转数据框中给定日期的时间

    对于包含开始和结束时间的数据框 我想 反转 给定日期的时间 当然有一种 强力 方法可以通过循环数据帧并具有大量 if 条件来完成此操作 但我想知道是否有更优雅的方法 例如回填 前向填充 将其视为具有一个数据框 其中工作时间由具有开始时间和结
  • 如何将联系人从电话簿导入到我们的应用程序

    我正在开发Android应用程序 当用户单击按钮时 它应该在表格中显示电话簿中的所有联系人 我该如何实现它 任何人都可以帮助我 提前致谢 如果您查询联系人合同 联系人 http developer android com reference
  • C++ 中通过引用传递对象

    通常的方法是通过引用传递变量在C 也是C 中如下 void someFunction dataType name dataType e g int char float etc definition int main dataType v