运算符重载中的成员二元运算符和非成员二元运算符

2024-05-02

在尝试学习运算符重载时,我阅读了 C++ Primer 中的以下陈述。坦白说,我不太明白这些言论想要传递什么信息。这些示例包括定义成员二元运算符和非成员二元运算符。使用时有什么区别吗?

通常我们将算术和关系运算符定义为非成员函数,并将赋值运算符定义为成员:

Sales_item& Sales_item:: operator (const Sales_item&)
Sales_item operator_(const Sales_item&, const Sales_item&);

加法和复合赋值都是二元运算符,但这些函数定义了不同数量的参数。差异的原因是 this 指针。


是的,实际使用中还是有区别的。特别是,当您将运算符重载为非成员函数时,可以将转换应用于either操作数(或两个操作数)。当您使用成员函数重载二元运算符时,转换只能应用于right操作数。

这可能会导致一些奇怪的情况。例如,考虑编写一个“bignum”包并且您想要重载operator+处理bignum。如果将其重载为成员函数,则会出现如下奇怪的情况:

int x = 2;
bignum y = 3;
bignum z;

z = y + x; // works fine.
z = x + y; // doesn't work: x isn't a bignum, and can/won't be converted to one

相反,如果你超载operator+使用非成员函数,这两个操作都可以工作(假设您有一个构造函数可以从 int 创建 bignum,这几乎肯定是您想要的)。

A few运算符(特别是赋值运算符,例如=, +=, -=等)是特殊的。转换创建一个临时对象,并且分配给临时对象 1) 是不允许的,并且 2) 无论如何都没有意义或完成太多任务。因此,当您重载赋值运算符时,您始终使用成员函数。

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

运算符重载中的成员二元运算符和非成员二元运算符 的相关文章

  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 将 viewbag 从操作控制器传递到部分视图

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

随机推荐

  • Spring JPA - 通过 EmbeddedId 部分查找

    以下代码仅用于演示目的 My Entity豆看起来像这样 Entity class Employee EmbeddedId private EmployeeKey employeeKey private String firstName p
  • 与 ng-include 一起使用时自动对焦不起作用

    我想将焦点设置到部分视图中的输入框之一 喜欢 并包括这一点 当页面第一次加载时 这工作正常 但是当我更改部分时 自动对焦不起作用 我相信这是因为页面加载时的自动对焦工作 它如何在这里工作 我不确定如何解决页面重新加载的问题 但我认为我们可以
  • 哪个信号被传递到信号处理程序中死锁的进程

    我有一个来自调用信号处理程序后死锁的进程的核心转储 如何确定传送了哪个信号以及是谁发送的 GDB 为接收信号的线程生成的回溯如下 信号处理程序在第 15 帧中被调用 gdb bt 0 0x00007fa9c204654b in sys fu
  • Django查询连接两个表的记录

    我正在使用 django mssql 1 6 2 包和 django 1 7 从 sql server 2008 获取一条或多条表记录 当我如下调用 get 或 filter 时 一切都很好 但我的服务器程序非常慢 考虑下表 class C
  • 使用 KnitR 在 R 中以编程方式创建 Markdown 表

    我刚刚开始了解 KnitR 以及使用 Markdown 生成 R 文档和报告 这对于我与工作有关的许多日常报告来说似乎是完美的 然而 我没有看到的一件事是使用 Markdown 格式打印数据框和表格的简单方法 有点像xtable 但使用 M
  • 如何在没有 root 访问权限的情况下在 Ubuntu 上安装 Google Test?

    我正在尝试根据以下方式安装 Google Test这个答案 https stackoverflow com a 21314020 6560773在没有 root 访问权限的 Ubuntu 上 因为我需要在工作中学习和使用它 设法在我自己的用
  • 列出所有会话信息

    我想在页面中显示我的asp net页面 aspx 的所有会话信息 我怎样才能做到这一点 编程语言是C 这两种方法对我有用 稍微改进和纠正了大卫的答案 第一种方法 for int i 0 i lt Session Count i var cr
  • 获取后台进程的退出代码

    我有一个从我的主 bourne shell 脚本中调用的命令 CMD 该命令需要很长时间 我想修改脚本如下 作为后台进程并行运行命令 CMD CMD 在主脚本中 有一个循环每隔几秒监视生成的命令 该循环还向标准输出回显一些消息 指示脚本的进
  • Java 中的无符号字节

    Java 中的字节默认是有符号的 我在其他帖子中看到 具有无符号字节的解决方法类似于 int num int bite 0xFF 有人可以向我解释一下为什么它会起作用并将有符号字节转换为无符号字节 然后将其转换为相应的整数吗 ANDing一
  • 无法将 event.target 转换为字符串

    为了识别用户单击的元素 我尝试使用事件对象target document click function e var str e target toString console log str if str indexOf some clas
  • 为什么表上主键的存在可以显着提高列存储索引的性能?

    我试图了解列存储索引可以在表上提供什么样的性能提升 该表大约有 370 万行 11 列 并存储为堆 即没有主键 我在表上创建列存储索引并运行以下查询 SELECT Area Family AVG Global Sales Value AS
  • Seaborn 中同一地块上的多个图表

    我正在尝试为某些数据绘制条形样式 factorplot 然后在其上绘制常规点样式 factorplot 以适合该数据 因此 对于数据图 我可以简单地执行以下操作 sns factorplot x x y yData data dataFra
  • 从另一个视图控制器调用一个视图控制器的方法

    我在 OneViewController h 中声明了一个方法 someMethod interface OneViewController UIView tempView void someMethod end 并在 OneViewCon
  • 如何获取 LinkedHashMap 的 keyIterator?

    通过查看Sun的LinkedHashMap的源代码 我发现有一个名为Key Iterator的私有类 我想使用它 我怎样才能获得访问权限 您可以通过致电获取 myMap keySet iterator 你甚至不需要知道它的存在 它只是实现的
  • GCM 推送通知延迟

    我们有一个应用程序 Ruby on Rails 向 Android 应用程序发送推送通知 我们面临着 GCM 的问题 其中一些通知要么被延迟 要么从未收到 考虑到这些通知是发送给员工而不是最终用户 我的问题是 在没有任何延迟或丢失的情况下发
  • “TransformAppSettings”任务意外失败

    我有一个 NET Core 3 Blazor 服务器端 应用程序 我最近从预览版 5 版本升级到了 NET Core 3 0 1 预览版 6 版本 当我在本地构建并运行它时 它工作正常 但是当尝试将其发布到文件系统文件夹 在框架相关模式下
  • 使用 vb.net 在 MS Access 中插入和更新值

    我已经检查了该网站上的大部分论坛 但没有得到我的解决方案 我的问题是将数据从 vb net 插入到 MS Access 但我无法做到 它没有显示任何错误 但也没有在我的表中插入值 我正在使用非常简单的代码 Imports System Da
  • 模板化无分支 int 最大/最小函数

    我正在尝试编写一个无分支函数来返回两个整数的 MAX 或 MIN 而不求助于 if 或 使用通常的技术 https stackoverflow com questions 227383 how do i programmatically r
  • 向 ModelForm 添加额外字段

    我正在向 Django ModelForm 添加一个额外的字段 如下所示 class form forms ModelForm extra field forms CharField label Name of Institution cl
  • 运算符重载中的成员二元运算符和非成员二元运算符

    在尝试学习运算符重载时 我阅读了 C Primer 中的以下陈述 坦白说 我不太明白这些言论想要传递什么信息 这些示例包括定义成员二元运算符和非成员二元运算符 使用时有什么区别吗 通常我们将算术和关系运算符定义为非成员函数 并将赋值运算符定