两个C++对象等不等,要程序员自己下定义,通常是覆盖==操作符

我曾经好多年对Java的==和equals的区别和联系搞不清楚,后来搞清楚了,笔记在这里:

http://www.cnblogs.com/findumars/p/3240761.html
http://www.cnblogs.com/findumars/p/3746878.html

刨去更细节的内容,其实只要明白一个原理即可:两个对象在内存中是两个不同的区域,就算其所有内容完全一模一样,也仍然是两个不同的对象。只是编程嘛,就是描述逻辑,有些情况下我们必须定义什么叫做两个对象相等。这个就随你啦,你可以定义两个对象的首地址相等才叫对象相等(其实是不可能实现的),可以定义它们的HashCode相等就对象相等,或者仅仅是对象名字相等就算对象相等。这个思想在OO中是通用的,不仅仅为Java所独有。比如今天在Qt的文档中发现这段描述:

bool QVector::contains ( const T & value ) const

Returns true if the vector contains an occurrence of value; otherwise returns false.

This function requires the value type to have an implementation of operator==().

就是QVector不懂你说的包含是指什么。所以你必须为T类型的数据单独定义==操作符。我觉得吧,比较两个对象相等够麻烦,除非逻辑确实需要直接保存和处理对象,否则一般情况下只要比较两个对象的指针(首地址)即可。那样多省事呀。就像Delphi里的TList,简直是RTL的核心管理类,许多RTL类都是靠它来实现的,但TList通常还不是仅仅用来保存指针而已(不过也刚巧,TObject.Create返回的全部都是堆上的指针,如果直接保存对象可能会麻烦一些)。

时间: 2024-11-05 17:38:38

两个C++对象等不等,要程序员自己下定义,通常是覆盖==操作符的相关文章

C# 中重载自增自减操作符的具体运算原理 ----从C++程序员的角度看C#自增操作符重载的实质

看了看C#的运算符重载,发现与C++打不相同.刚刚被C#的自增操作符坑了,现在来分享一下. 先定义一个类 class A { public int i; public A(int I) { i = I; }public static A operator ++(A a) { return new A(100); } } 主函数 class Program { static void Main(string[] args) { A v = new A(10); Console.WriteLine(

Java程序员的级别定义: 对号入座, 你在哪个阶段心里要有点数

初级 刚入职场的新人一般都在这个级别了.这一点倒是不区分本科还是硕士,比如我第一家公司硕士毕业进去算初级工程师,本科是助理工程师.而公司对于刚毕业的同学的级别定义也是类似,本科 T1-1,硕士 T1-2.大级别都是 T1,小级别上的细分区分可能也就是在薪酬起点上略有不同(别问我差多少,我也不知道,但估计差距不大). 中级 要说中级和初级最本质的区分是什么,我觉得体现在独立性方面.初级的同学刚进公司,一般还会给安排一对一的导师帮助其快速上手,所以很多初级的同学在工作上就对导师存在依赖性.而工作一段

论程序员为什么下班后只关显示器从不关电脑?

前言: Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了收藏已久的视频教程分享给大家!希望能带给大伙儿一些学习上的帮助 觉得好的话可以多多关注哟~ 每天持续分享更多优质内容! 你下班时是不是只将显示器一关,揣上手机就走了? 曾有安保人员晚上来办公室巡查时问,为什么这些人不关机就下班呢? 作为程序员,你会心一笑.对方不明白如果关机了,第二天程序员上班可能会崩溃: 打开IDEA,并定位到昨天的代码,十分钟 打开Navicat,两分钟 打开笔记软件,

记录:程序员,如何定义“优秀”

重要的是这个四个目标: 你创造有效算法的能力 你阅读别人写的代码以及发现其中存在任何问题的细心品质 你的学习和实现新技术趋势并且适应需求的好奇心 最后也是最重要的:你创造了什么,如何创造的? ——了解 计算机科学入门课程 ——作为 程序员英语必须得好 ——学习 其他编程语言:C#,Java,或者Python,Ruby, PHP ——测试 你的代码 注:学会如何跟踪bugs,创建测试,并且破坏你的软件 ——培养 逻辑思维和积累离散数学知识 ——培养 算法和数据结构的深刻理解能力 注:了解一些基本数

对象什么的,程序员可是有很多呢

/* * screen对象 */ console.log(screen.width);// 屏幕宽度 console.log(screen.height);// 屏幕高度 console.log(screen.availWidth); //可用宽度 console.log(screen.availHeight); //可用高度=屏幕高度-底部任务栏 /* * location对象 * * 完整的URL路径: * 协议://主机名(IP地址):端口号/文件路径?传递参数(name1=value1&

黑马程序员——多线程下的单例设计模式的安全问题

//多线程下的单例设计模式 class Sing { //饿汉式不存在安全问题,因为其不是线程同步的 private static Sing s = new Sing(); private Sing(){} public static Sing getInstance() { return s; } } class Single { private static Single s = null; private Single(){} public static Single getInstanc

作为程序员,不得不知道的App推广知识

初看这个题目,大家可能就疑问,作为程序员只管做自己的产品就好了,写代码就OK了,我干嘛要知道一些推广知识,跟我没关系,不需要知道. 好吧,,那么我问你. 你是否也像我一样以后做个产品经理,项目CTO,项目CEO这样的有抱负,还是默默无闻的做个简单的程序员,从码农到码圣的升级版程序员? 你是否也像我一样以后的职业规划不仅仅局限于程序员这个角色,而不想突破垂直职业的牢笼,从剑客到武林盟主的蜕变? 你是否也像我一样时常注意我自己做的产品的下载量,用户数,时常觉得那个项目的产品就是我自己的孩子一样,慢慢

《Java程序员面试笔试宝典》之字符串创建与存储的机制是什么

在Java语言中,字符串起着非常重要的作用,字符串的声明与初始化主要有如下两种情况:(1) 对于String s1=new String("abc")语句与String s2=new String("abc")语句,存在两个引用对象s1.s2,两个内容相同的字符串对象"abc",它们在内存中的地址是不同的.只要用到new总会生成新的对象. (2) 对于String s1 = "abc"语句与String s2 = "

黑马程序员——JAVA面向对象学习总结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- www.itheima.com 首先,面向对象是一种思想. 有一种面向过程的思想,面向对象就是基于面向过程的. 举个例子:把大象放进冰箱中. 面向过程: 用我们程序模拟 (java是纯面向对象语言) class Demo{ public static void main(String[] args){ /* 这几个动作相当于功能 既然是功能就用方法封装 */ //先打开冰箱门 open();