在 C++ 中,“operator !=”是否应该始终通过“operator ==”来实现?

2023-12-24

我目前查看了一个旧的 C++ 代码库,发现很多代码都是这样的:

bool SomeClass::operator==( const SomeClass& other ) const
{
   return member1 == other.member1 && member2 == other.member2;
}

bool SomeClass::operator!=( const SomeClass& other ) const
{
   return member1 != other.member1 || member2 != other.member2;
}

显然,比较逻辑是重复的,并且上面的代码可能需要在两个地方而不是一个地方进行更改。

AFAIK 的典型实施方式operator!=是这样的:

bool SomeClass::operator!=( const SomeClass& other ) const
{
    return !( *this == other );
}

在后一种情况下,无论发生什么逻辑变化operator==它将自动反映在operator!=因为它只是调用operator==并执行否定。

有没有合理的案例operator!=除了重用之外,应该以任何其他方式实现operator==在C++代码中?


在大多数情况下,语义a!=b应该等于!(a==b).

对于所有其他运算符也是如此:a<b应该等于!(a=>b) and to !(a==b || a>b) and to a<=b && !(a==b)等等等等。

为了这个目的boost.运算符 http://www.boost.org/doc/libs/1_45_0/libs/utility/operators.htm提供了一些很棒的工具来根据其他工具自动生成运算符。


但是,当您为运算符提供一些特定的语义时(即:您不使用==检查两个项目是否相同,但要做一些像 STL 那样的花哨的事情>> and <<)你可能想给他们不同的实现。

一般来说,不建议这样做,尽管 STL 和许多 boost 库也这样做。


EDIT- 一点补充:

到目前为止我所说的仅涉及运算符的语义。如果您决定您的语义a!=b应该!(a==b)你有两种方法来实现它:

  • 通过调用另一个运算符,这就是使用 boost.operators 时会发生的情况:
    bool operator!=(a,b) { return !(a==b); }

  • 从头开始实施它们。

第一种方法通常更容易实现并且更安全。可以证明第二个选项合理的最常见的事情是优化,尽管它可能不值得:现代编译器在大多数情况下不会增加任何开销(如果您查看 boost.operators 源代码,您会看到许多关于它们如何依靠NRVO http://en.wikipedia.org/wiki/Return_value_optimization不增加任何开销,或者如果编译器不提供 NRVO,它们的代码将如何更改)。

无论如何,无论您选择什么选项,它都不应该对您的应用程序逻辑产生任何影响,因为重要的是语义(即:您的运算符如何行为,它们为任何可能的输入返回什么)。

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

在 C++ 中,“operator !=”是否应该始终通过“operator ==”来实现? 的相关文章

  • 从 C 中的 char* 获取单个字符

    有没有办法在 C 中逐字符遍历或从 char 中提取单个字符 考虑以下代码 现在获得单个角色的最佳方式是什么 建议我一种不使用任何字符串函数的方法 char a STRING 其他方式 char i for i a i i i points
  • “字符串”是什么意思?信息'

    我刚刚在查看定义时发现了这个PlatformNotSupportedException class 什么是string message意思是 据我所知是 是缩写Nullable lt gt but Nullable lt gt 只能应用于结
  • 如何重命名序列化对象列表后生成的 XML 属性

    我正在序列化对象列表List
  • 如何将不记名令牌发送到 ASP NET MVC 5 中的视图?

    我有一个 NET MVC and WEB API项目 我想打电话给WEB API controllers来自 javascript 但我没有找到将令牌发送到我的视图的方法 我想添加bearer token in Viewbag变量 使用以下
  • C# 测试活动的互联网连接。 Ping google.com

    C 2008 我正在使用此代码来测试互联网连接 因为我的应用程序必须登录到网络服务器 但是 如果用户互联网连接失败或电缆被拔出 我必须通知用户 Ping www google com to check if the user has a i
  • 可变数量的(常量)引用参数

    我试图从我的高级代码 使用 C 11 中消除原始指针 并且我找到了引用 尤其是const 在许多情况下 当没有所有权转移时 是一个很好的替代品 但如果有的话该怎么办variable我想通过 常量 引用传递的参数数量 你不能创建一个std v
  • 为什么这个 oracle 批量插入不起作用?

    我正在尝试将一些数据批量插入到 oracle 数据库中 我按照文档中的示例进行操作 this DataBaseAccess new OracleConnection connString var dataAdapter new Oracle
  • NHibernate IQueryable 集合作为 root 的属性

    我有一个根对象 它有一个集合属性 例如 I have a Shelf object that has Books Now public class Shelf public ICollection
  • 为什么将 char 传递给函数会改变它在 c 中的值?

    我目前正在关注本作业簿 http www cs bham ac uk exr lectures opsys 10 11 lectures os dev pdf关于构建操作系统 我的目的是写一个64位内核 我已经在文本模式下加载 内核 代码并
  • 修改正在运行的可执行文件的资源内容

    All 我将应用程序设置存储在资源中 当我的程序首次加载时 我使用 WinAPI 读取指定的资源 然后我解析检索到的字节数据 这对我来说完美无缺 现在假设用户更改了我的应用程序中的设置 他 她检查复选框控件 我想将更新的设置保存到我的资源中
  • 我可以在 C++ 中重写非虚函数吗

    我想知道我可以重写 C 中的非虚函数吗 因为我在使用 C 时发现了这个问题override关键字我的代码如下 class A public void say cout lt lt From A n class B public A publ
  • 将授权标头添加到 Web 参考

    我正在尝试向客户端的网络服务发出请求 我不知道客户端的底层平台 我使用 添加 Web 引用 在 Visual Studio 2010 中使用了客户端的 WSDL 并生成了我的代理类 称为 ContactService 我现在需要将如下所示的
  • 从视图模型调用方法的命令

    好吧 我倾向于避免使用命令 因为它们总是让我感到困惑 但我正在进行一个新项目 并且正在尝试正确构建它 并且在我看来没有任何代码隐藏 基本上我现在想做的就是连接一个按钮来触发一个命令 在我的视图模型上执行一些操作 但不知何故 如此简单的事情仍
  • Request.Form 和 Request.QueryString 之间的区别?

    有人可以告诉我两者之间的确切区别吗Request Form and Request QueryString 我知道一个区别 比如 如果HTTP请求方式为POST 则用户提交的数据在申请表 收藏 如果HTTP请求方法是GET 则用户提交的数据
  • 类型别名和不完整类型

    我可能已经超出了解决这个本应简单的问题的范围 我在这里开始这个问题 在编译时获取基类的类型 https stackoverflow com questions 17735852 getting type of a base class at
  • 使用非字符串作为字符串(而不是自动使用 ToString)时如何显示错误?

    建议的重复确实是一个类似的问题 然而 答案只涵盖一种选择 禁用 ToString 本身 还有其他可能的解决方案 例如让 Visual Studio 警告我 或者不调用 ToString 仔细阅读那里的答案 他认为is调用 只是解释说没有办法
  • C++ 联合数组和变量?

    在C 中没有办法做这样的事情吗 union Scalar x y Scalar v 2 Where x v 0 and y v 1 既然您使用的是 C 而不是 C 并且它们具有相同的类型 为什么不直接将 x 设为对 v 0 的引用 将 y
  • Gridview 错误:对 Bind 的调用格式不正确

    我有以下 gridview 代码
  • 用于 nmap 输出的 C++ xml 解析器

    我是 nmap 的新手 我在 nmap 教程中看到 https nmap org book man output html https nmap org book man output html oX 选项可用于获取 xml 格式的 nma
  • 如何使用 Ioc Unity 注入依赖属性

    我有以下课程 public interface IServiceA string MethodA1 public interface IServiceB string MethodB1 public class ServiceA IServ

随机推荐

  • iOS 7 中文本字段的弹出/模式选择器

    我在弄清楚如何实现标准弹出选择器时遇到了很多麻烦 就像许多应用程序的注册屏幕一样 当用户选择生日文本字段时 我希望出现一个弹出选择器 以便用户可以选择他们的生日 单击完成 格式化日期将添加到文本字段 这似乎并不那么困难 但在 iOS 7 中
  • 如何使用新的 Google Analytics 在 PHP 中获取当前访问者的引荐来源网址、付费/自然和关键字?

    我想了解访问者如何访问我的网站的信息 在 Google Analytics 的早期版本中 您可以使用他们的 cookie 参见例如使用 Google Analytics 获取当前访问者的引荐来源网址 付费 自然和关键字 https stac
  • 提交后的 mvc3 复选框值

    我有一个包含 2 个字段的表单 一个下拉列表和一个复选框 我一切正常 但由于某种原因 如果选中这是我的代码 我无法获取复选框的值 HttpPost public ActionResult view string pick switch pi
  • 切换 UITextView 中的 selectedRange 属性

    我创建了一个按钮 我想检查是否选择了文本 然后在点击时在 selectedRange 上切换粗体和非粗体 目前 我的代码只会将 selectedRange 更改为粗体 我无法撤消它或检查是否有选择 我怎样才能实现这个目标 func bold
  • Meteor.js - 在多个集合上进行用户搜索的方法

    关于如何在 Meteor 应用程序中设置集合 我遇到了一些困境 用户搜索栏是我的应用程序的核心部分 用户需要能够输入一个搜索并在多个不同的集合中获得结果 user query foo var query foo var actors res
  • 经典的asp存储过程参数

    我一直在研究如何从经典 asp 调用存储过程并将参数传递给它 下面是我的存储过程 它工作得很好 CREATE PROCEDURE Paging Movies alphaChar char 1 AS if alphaChar select f
  • 为什么从 python 调用 ffmpeg 会阻塞?

    我尝试了 3 种方法从 python 调用 ffmpeg 但它总是阻塞并且不返回任何结果 但是 如果我从 shell 执行它 它就会起作用 For eg usr bin ffmpeg y i tmp uploadedfiles movie8
  • 在 R 中对“年/月”列进行排序

    我试图在 R 中按 year month 列对数据框进行排序 但停留在 as Date 函数上 我尝试了其他几种方法但没有成功 我可以寻求帮助吗 这里是 我的代码是 temp2 sort lt temp2 with temp2 order
  • R:将查找表与数据框合并

    我正在使用 R 编程语言 我有以下有关患者医疗特征和疾病患病率的数据集 set seed 123 library dplyr Patient ID 1 5000 gender lt c Male Female gender lt sampl
  • WordPress 在不使用 get_posts() 的情况下获取帖子数量?

    需要一个专门设计用于获取匹配条件的帖子计数的函数调用 我认为 get posts 函数对于此操作来说太昂贵了 我只是想决定当有预定义数量的帖子要显示时是否显示 查看更多帖子 链接 例如 要显示的默认帖子链接数为 3 我只想在帖子总数超过 3
  • SPARK SQL - 使用 DataFrames 和 JDBC 更新 MySql 表

    我正在尝试使用 Spark SQL DataFrames 和 JDBC 连接在 MySql 上插入和更新一些数据 我已成功使用 SaveMode Append 插入新数据 有没有办法从 Spark SQL 更新 MySql 表中已有的数据
  • Javascript:将逗号替换为### - 仅用双引号[重复]

    这个问题在这里已经有答案了 在下面的字符串中 This is just for Test ignore it My name is FirstName LastName 我想将双引号 内的所有逗号 替换为 目前我只找到了 的匹配模式 但需要
  • jQuery + JSON 如何从变量定义键

    我有以下代码 post factory set key value function response json where key foo value bar 但服务器总是获取 key 和 bar 有没有办法将键设置为变量 而不是字符串
  • ASP.Net MVC 和 Comet (WebSync)

    我正在尝试在我的 ASP Net MVC 2 0 项目中实现 comet 我在用着WebSync http www frozenmountain com websync 来自冰冻山 我的网站是用 C 4 0 和 ASP Net 4 0 编码
  • 直接从 Eclipse 本地历史记录恢复已删除的文件

    发生了一些 git 错误 我丢失了一个文件的很多更改 我使用 Eclipse 作为 IDE 但 git 错误包括删除项目并重新克隆目录 所以我无法从 Eclipse 中进行恢复 我相信我已经找到了包含我想要恢复的代码的本地历史文件 但我不确
  • 我可以在 Windows Azure 中托管应用程序并将数据库存储在不同的服务器上吗

    我可以在 Windows Azure 中托管应用程序并将数据库存储在不同的服务器上吗 例如 我想将我的数据保存在服务器上 这样我就不必担心隐私问题 如果这是可能的 是否会消除在云中托管应用程序的价值 thanks 您的意思是在 Window
  • 您如何知道 Pytorch Save 是否包含模型和/或仅包含权重?

    我对 pytorch 相当陌生 这可能是版本问题 但我看到使用了 torch load 和 torch load state dict 但在这两种情况下 文件扩展名通常是 pth 我创建的模型 我可以通过 torch Save 和 torc
  • 使用 Python 抓取 PDF 文本 (pdfquery)

    我需要抓取一些 PDF 文件来提取以下文本信息 我尝试使用 pdfquery 来完成此操作 方法是解决我在 Reddit 上找到的示例 请参阅第一篇文章 https www reddit com r Python comments 4bnj
  • QTableWidgetItem 文本已更改

    我正在寻找一种干净的方式来对事件做出反应 如果QTableWidgetItem已更改其文本 我尝试过使用信号QTableWidget itemChanged QTableWidgetItem item 但这会导致错误 因为我更改了背景颜色Q
  • 在 C++ 中,“operator !=”是否应该始终通过“operator ==”来实现?

    我目前查看了一个旧的 C 代码库 发现很多代码都是这样的 bool SomeClass operator const SomeClass other const return member1 other member1 member2 ot