最近复习了一下C++的一些基础知识,发现之前理解得不够深刻,或者当时只是简单过了一遍,复习的时候,有了一些新的收获。闲言少叙,书归正文:

问题:
C++的重载相等运算符operator==可以写成类成员函数,也可以写成全局普通函数,请问这对于同一个类型的两种重载相等运算符可以同时存在么?如何可以,那么它们的调用优先顺序是怎么样的?

我们还是用一个例子来说明:

#include <iostream>class Person
{private:int m_age;
public:Person(int nAge){this->m_age = nAge;}int age() const{return m_age;}bool operator==(const Person& other){std::cout << "call member function operator==" << std::endl;if (this->m_age == other.m_age)  //m_age不是私有成员变量么,为什么这样里可以直接写other.m_age?{return true;}return false;}
};bool operator==(const Person& one, const Person& other)
{std::cout << "call normal function operator==" << std::endl;if (one.age() == other.age()){return true;}return false;
}int main()
{Person p1(10);Person p2(10);if (p1 == p2){std::cout << "p1 is equal with p2." << std::endl;}else{std::cout << "p1 is not equal with p2." << std::endl;}getchar();return 0;
}

运行结果:

如果注释掉

那么运行结果是什么?

C++重载相等运算符调用优先顺序:类成员函数 > 全局普通函数

如果某个类在逻辑上有相等性的含义,则该类应该定义operator==,这样做可以使得用户更容易使用标准库算法来处理这个类。

如果类定义了operator==,则这个类也应该定义一个operator!=,对于用户来说,当他们能使用==时,肯定也希望能使用!=,反之亦然。

现在又引出了另外一个问题:

在类成员函数

bool operator==(const Person& other)

if (this->m_age == other.m_age)
//m_age不是私有成员变量么,为什么这样里可以直接写other.m_age?

实践证明,类(class)私有成员可以被类成员函数访问,不区分成员在哪个实例(instance)里。

也就是说,在类内部的成员函数中,哪怕是传入的对象,也是可以直接访问该对象的私有成员。(前提是该对象必须是本类型的一个对象)

这样类对象可以直接访问私有成员就合情合理了,而且这么做也确实是方便的。

在重载运算符时,类的对象可以直接访问私有成员解惑

如果大家想对其中的原因了解得更加详细的话,可以查看这篇博客:

C++类成员函数可以访问同类不同对象的私有成员

引用C++标准原文

A member of a class can be — private; that is, its name can be used
only by members and friends of the class in which it is declared. —
protected; that is, its name can be used only by members and friends
of the class in which it is declared, and by members and friends of
classes derived from this class (see 11.5). — public; that is, its
name can be used anywhere without access restriction.

访问限制标号是针对类而不是针对一个类的不同对象,只要同属一个类就可以不用区分同一个类的不同对象。因为 是类的成员函数,所以有权限访问私有数据成员。如果是在main函数中直接,那肯定就会报错了,不能访问,因为这是在类外不能访问私有数据成员。一个类的成员函数可以访问这个类的私有数据成员,我们要理解这个对类的访问限制,而不是针对对象。

C++的访问控制是类层面的 class-level, 而不是对象级别的object-level,

同一个类可以访问所有自己类实例的私有成员, 数据成员是类私有而不是实例私有, 成员是否可访问是类的性质, 而不是对象的性质。

重载operator== 还有第三种方式,就是成员的friend函数,类似全局的operator==方式,只是加了friend关键字,放在类中。

C++重载相等运算符operator==的两种方式相关推荐

  1. C++类中成员变量的初始化有两种方式

    C++类中成员变量的初始化有两种方式: 构造函数初始化列表和构造函数体内赋值.下面看看两种方式有何不同. 成员变量初始化的顺序是按照在那种定义的顺序. 1.内部数据类型(char,int--指针等) ...

  2. SparkStreaming从Kafka读取数据两种方式

    参考文章:http://www.jianshu.com/p/60344796f8a5 在结合 Spark Streaming 及 Kafka 的实时应用中,我们通常使用以下两个 API 来获取最初的 ...

  3. Python字符串的两种方式——百分号方式,format的方式

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  4. Java中实现多线程的两种方式之间的区别

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

  5. Code First02---CodeFirst配置实体与数据库映射的两种方式

    Code First有两种配置数据库映射的方式,一种是使用数据属性DataAnnotation,另一种是Fluent API. 这两种方式分别是什么呢?下面进行一一解释: DataAnnotation ...

  6. java多线程区别_Java中实现多线程的两种方式之间的区别

    Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线 ...

  7. 基于JAVA实现GPG加密解密(Windows+java两种方式)

    最近业务上遇到一个很棘手的问题,客户要求在调用他们的时候要对报文进行加密解密,然后方式就是用pgp的方式进行加密解密,相信有很多小伙伴和我一样刚开始看到这个pgp(或者gpg)加密都是一脸懵,啥玩意儿 ...

  8. 运行python程序的两种方式交互式和文件式_Python基础知识2

    运行Python程序的两种方式 小白学习,如有错误欢迎指点 一.每位小白写的第一个Python程序 1.运行Python程序的两种方式 1.1 交互式模式(即时对话) 打开cmd,打开Python解释 ...

  9. 【❗划重点!C语言函数参数传递只有两种方式(值传递,地址传递),不支持“引用传递”!❗】

    引子 上篇文章<C语言函数传参の结构体数组篇>提到了C语言的函数参数传递方式,百度了一一一大圈,有说两种的,也有说三种的,简直把我搞晕了,"值传递和地址传递"是毫无疑问 ...

最新文章

  1. MyBatis 获取数据库中自增主键值
  2. 图片 存_早安图片 早上好问候语 早上好祝福语录大全 早上好表情
  3. [精品]CSAPP Bomb Lab 解题报告(七)——隐藏关卡
  4. Visual C# 打造 “浏览器”
  5. 因唯一缺点惨被吐槽!小米9升级版来了:8GB+256GB卖3299
  6. Struts2之checkboxlist 设置默认值和结果回显
  7. Compass.net
  8. ueditor常见用法
  9. 70个城市房价上涨,令人忐忑
  10. 关于@Result注解的说明
  11. 短视频系统源码,android 真正的全屏沉浸式体验
  12. curl指定代理_如何使用cURL指定用户代理
  13. 贝塞尔曲线与贝塞尔曲面
  14. 推荐一个开源快速开发erp管理系统的框架
  15. 每日一句_《定风波·暮春漫兴》
  16. C# 打印照片和文档
  17. 2016年12月六级农业翻译
  18. CH340驱动问题,由于 Windows 无法加载这个设备所需的驱动程序,导致这个设备工作异常。 (代码 31)
  19. CAD制图初学入门之CAD图纸集的使用技巧
  20. 【ChatGPT回答代码问题】1. smpl2bvh 2. smplx2bvh 3. bone retargeting

热门文章

  1. leetcode笔记 844比较含退格的字符串 python
  2. 用 Python 进行金融数据可视化
  3. Android Studio从gthub上导入新项目的时候,R文件丢失的问题
  4. android关于 text_to_speach的使用(tts)
  5. DOS窗口中使用的命令行
  6. 如何对一个复杂网络的图进行分析? 计算复杂网络相关的所有参数 批处理
  7. 幂等和非幂等的关系与区别
  8. 利用c++与opencv将文本、图像加密进另一张图片中
  9. 转;三宫九观二十四坊——摘自苏州热线
  10. 宏基d260linux系统,宏碁最新推出的Aspire C系列一体机提供Linux FreeDOS操作系统