C++ operator == 的一些思考

2023-10-31

最近写代码的时候,需要重载 == ,以前也没有进行过太多的思考,都是顺手就写了,在这里就总结一下:

下面的代码是 应该是重载 == 用的最多的写法了

class Demo {
public:
	Demo(int a_):a(a_) {
	}
	~Demo() {}
    bool operator == (const Demo & rhs) const {
      return this->a == rhs.a;
    }
    bool operator != (const Demo & rhs) const {
      return !(*this == rhs);
    }
private:
	int a;
};

还有一种方法是 使用友元函数,友元函数也能够访问类的私有成员

class Demo {
public:
	Demo(int a_):a(a_) {
	}
	~Demo() {}
	friend bool operator == (const Demo & lhs ,const Demo & rhs);
	friend bool operator != (const Demo & lhs ,const Demo & rhs);
private:
	int a;
};

bool operator == (const Demo & lhs ,const Demo & rhs) {
  return lhs.a == rhs.a;
}
bool operator != (const Demo & lhs, const Demo & rhs) {
  return !(lhs == rhs);
}

注意  友元函数不能加 函数后边不能加 const  限定符,如果加了,编译就会报  cannot have cv-qualifier 的错误,因为 const 和 volatile 都是 用来修饰 类成员函数的,不是类的成员函数  就不能用 const 修饰

那么对于 == 和 !=  ,能不能 一个重载成友元函数,一个重载成成员函数呢,是可以的

class Demo {
public:
	Demo(int a_):a(a_) {
	}
	~Demo() {}
	friend bool operator == (const Demo & lhs ,const Demo & rhs);
	bool operator != (const Demo & rhs) const {
	  return !(*this == rhs);
	}
private:
	int a;
};
bool operator == (const Demo & lhs ,const Demo & rhs) {
  return lhs.a == rhs.a;
}

还有一种情况,就是我不使用 友元函数,能不能重载 ==,是可以的,但是必须提供可以获得成员变量的 get函数,注意get函数一定是const的 因为,const 类型只能调用 const 成员函数,否则编译就会报 

passing ‘const Demo’ as ‘this’ argument discards qualifiers  的错误

class Demo {
public:
	Demo(int a_):a(a_) {
	}
	~Demo() {}

	int get() const {
		return this->a;
	}
private:
	int a;
};
bool operator == (const Demo & lhs, const Demo & rhs) {
  return lhs.get() == rhs.get();
}
bool operator != (const Demo & lhs, const Demo & rhs){
  return !(lhs == rhs);
}

那么在不使用友元函数重载的情况下,是否可以,在成员函数内部,重载 !=  的时候调用 == 呢,

经过其他朋友的指正,是可以的,因为涉及到互相调用,编译的时候,需要通过前置声明来解决。

class Demo;
bool operator == (const Demo & lhs ,const Demo & rhs);

class Demo {
public:
	Demo(int a_):a(a_) {
	}
	~Demo() {}
	bool operator != (const Demo & rhs) const {
	  return !(*this == rhs);
	}
	int get() const {
		return this->a;
	}
private:
	int a;
};
bool operator == (const Demo & lhs ,const Demo & rhs) {
  return lhs.get() == rhs.get();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ operator == 的一些思考 的相关文章

  • InvalidOperationException - 对象当前正在其他地方使用 - 红十字

    我有一个 C 桌面应用程序 其中我连续创建的一个线程从源 实际上是一台数码相机 获取图像并将其放在 GUI 中的面板 panel Image img 上 这必须是另一个线程 如它是控件的代码隐藏 该应用程序可以工作 但在某些机器上 我会在随
  • 用于代数简化和求解的 C# 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 网络上有很多代数求解器和简化器 例如 algebra com 上不错的代数求解器和简化器 然而 我正在
  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler

随机推荐

  • C#知识点

    语句 语句是构造所有C 程序的构造块 通常以分号结束语句 一个大括号括起来一系列语句构成的代码块 语句可以声明局部变量或常数 调用方法 创建对象或将值赋予变量 属性或字段 语句包含 选择语句 循环语句 跳转语句 异常处理语句 A 条件语句包
  • VMware12安装CentOS 7详细教程(图文详解)附资源下载

    所需软件 VMware workstation full 12 1 0 3272444 exe CentOS 7 x86 64 DVD 2009 iso 百度网盘下载链接 VMware12下载 https pan baidu com s 1
  • Conda:误解与迷思

    翻译自这里 我试着尽可能简洁 但如果你想要跳过这篇文章 并得到讨论的要点 你可以阅读每个标题以及下面的摘要 神话 1 Conda是一个发行版 不是一个软件包管理器 现实 Conda是一个包管理器 Anaconda是一个发行包 虽然Conda
  • 将控件转换成圆形

    有点儿鸡肋的感觉 System Runtime InteropServices DllImport gdi32 private static extern IntPtr BeginPath IntPtr hdc System Runtime
  • git提交远程代码时容易出现的错误

    git push 推送代码到远程分支时 出现以下错误 Merge branch dev of http xxx into dev Please enter a commit message to explain why this merge
  • ​Mirth调用存储过程报错ORA-01861: 文字与格式字符串不匹配​

    Mirth调用存储过程报错 ORA 01861 文字与格式字符串不匹配 这种绝对是日期的错误 要进行日期格式转换 具体呢需要自己一步步测试 上业务场景 function func CreateCardPatInfo request var
  • 【mmdetection系列】mmdetection之loss讲解

    目录 1 configs 2 具体实现 3 调用 3 1 注册 3 2 调用 配置部分在configs base models目录下 具体实现在mmdet models loss目录下 1 configs 有的时候写在head中作为参数 有
  • npm 报错ERR Host key verification failed.

    问题 npm install 时报错npm ERR Host key verification failed npm ERR Error while executing npm ERR C Program Files Git cmd git
  • UE4 (旧版4.15-4.24)安卓打包报错license not accepted

    UE4 25 UE5新版直接下载Android Studio的包 不适用NVPACK方式 NVPACK文件夹一定要放在默认磁盘根目录下C NVPACK 否则会出一系列报错 错误状态 解决方法 1 查看是否已经点击Accept SDK Lic
  • 准备全面进行了

    根据这两个月的试用期 带我的那哥们告诉我应该转正没问题 另外 转了UE4后 发现找的猎头和HR很多 看来 也要好好重视了 不能只把UE4当UI使用了 当然 由于刚转 猎头和HR提供的薪水基本上都是20k起步 极个别过30k的 不如现在25K
  • JVM--基础--26.3--工具--jinfo

    JVM 基础 26 3 工具 jinfo 1 介绍 查看运行中jvm的全部参数 还可以设置部分参数 2 语法 2 1 格式 jinfo option pid jinfo option executable core jinfo option
  • CountDownLatch 简单介绍

    CountDownLatch 是多线程控制的一种工具 它被称为 门阀 计数器或者 闭锁 这个工具经常用来用来协调多个线程之间的同步 或者说起到线程之间的通信 而不是用作互斥的作用 下面我们就来一起认识一下 CountDownLatch 认识
  • qt信号和槽避免多次连接

    qt同一个信号和槽多次连接 则槽函数会触发多次 默认 可能不是我们想要的结果 有3种方法可以解决这个问题 1 仅在初始化函数中进行连接 因为初始化函数在在整个程序中只运行一次 所以这里面连接信号和槽 就能避免重复连接问题了 2 连接函数写上
  • 投屏为什么显示无法连接服务器,乐播投屏为什么连不上? 乐播投屏无法连接如何解决?...

    随着乐播投屏吸引的新用户逐渐增多 有些朋友发现自己的手机与电视无法成功连接到一起 更别说进行投屏了 而下面小编就为大家介绍了乐播投屏无法连接电视的原因 希望对你有所帮助 乐播投屏无法连接的处理教程 面对无法连接电视的情况 我们需要先保证自己
  • shell编程100例

    1 编写hello world脚本 bin bash 编写hello world脚本 echo Hello World 2 通过位置变量创建 Linux 系统账户及密码 bin bash 通过位置变量创建 Linux 系统账户及密码 1 是
  • 一分钟学会对合并单元格填充数据(Excel)

    问题描述 大家有没有发现 我们在使用Excel时有很多情况下需要对某列几行的内容进行合并 但是其他列中需要填写的内容却又完全相同 本文用两种方法解决这一问题 重点是方法二哦 一分钟可搞定数百条数据 如下图 需要按照专业进行单元格合并 但是他
  • vue高德地图初体验地图初始化(一)

    vue高德地图初体验地图初始化 安装依赖 引用依赖 地图初始化 AMap Map参数说明 安装依赖 npm i amap amap jsapi loader save 引用依赖 import AMapLoader from amap ama
  • A level数学真题解析及运用

    在A level考试9709数学科目中pure mathematics 3考卷考察范围内有一章节名为complex number 即复数章节 这部分知识点虽然理解难度不大 但是在我国普通高中的数学学习中涉及的较少 考生在接受上有比较大的难度
  • java设计模式-单例模式

    Java中单例 Singleton 模式是一种广泛使用的设计模式 单例模式的主要作用是保证在Java程序中 某个类只有一个实例存在 一些管理器和控制器常被设计成单例模式 单例模式有很多好处 它能够避免实例对象的重复创建 不仅可以减少每次创建
  • C++ operator == 的一些思考

    最近写代码的时候 需要重载 以前也没有进行过太多的思考 都是顺手就写了 在这里就总结一下 下面的代码是 应该是重载 用的最多的写法了 class Demo public Demo int a a a Demo bool operator c