对象(object)相等和变量相等的区别——让两个对象相等,当改变第二个对象的时候,第一个对象的数值也会进行改变。

本文探讨了在编程中,当两个对象相等时共用同一地址导致修改其中一个对象时另一个也受影响的问题。通过创建空指针并使用变量相等的方式遍历赋值,有效避免了这一指针问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间敲代码时,遇到一个很尴尬的问题:
让两个对象相等,当改变第二个对象的时候,第一个对象的数值也会进行改变。

博主经过多方测试,成功解决了问题,
产生原因:因为对象相等的话,相当于共用一个地址(指针),所以当修改第一个对象的时候,另外一个对象也会进行改变。
解决方法:因为两个对象相等的时候是指针,但是两个变量相等的话,两个变量是互不干扰的。所以博主新建了一个空指针,通过变量相等的方法进行了遍历赋值,这样就完美避免了指针问题。

### 实现对象相等性的比较 在编程中,不同语言提供了多种方式来实现对象之间的相等性比较。以下是几种常见的方式: #### Python 中的对象相等性比较 Python 默认使用 `__eq__` `__ne__` 方法来进行对象间的相等相等性判断。当创建一个新的类时,默认情况下这两个方法会基于对象的身份(即内存地址)进行比较。 为了使两个实例被认为是相同的,可以通过重写这些特殊方法来自定义逻辑[^1]: ```python class MyClass: def __init__(self, value): self.value = value def __eq__(self, other): if isinstance(other, MyClass): return self.value == other.value return False def __ne__(self, other): return not (self == other) ``` #### Java 中的对象相等性比较 Java 提供了一个名为 `equals()` 的方法用于检测两个对象是否相等。此方法最初是在 Object 类中定义的,并且默认行为是比较引用身份——也就是说,只有当两个变量指向同一个实际对象时才会返回 true。然而,许多标准库类已经覆盖了这一方法以便更合理地反映语义上的平等关系[^4]。 要在一个自定义类里实现有意义的对象间对比,应该覆写 `equals()` 函数并提供具体的匹配条件。同时建议也一并覆写 `hashCode()` 来保持一致性: ```java public class MyCustomClass { private String name; @Override public boolean equals(Object obj) { if (this == obj) return true; // 如果是同一对象则直接返回true if (!(obj instanceof MyCustomClass)) return false; MyCustomClass that = (MyCustomClass) obj; return Objects.equals(name, that.name); } @Override public int hashCode() { return Objects.hash(name); } } ``` #### C++ 中的操作符重载 C++允许通过操作符重载机制改变特定运算符的行为模式。对于想要控制自己定义的数据结构之间如何被判定为“等于”或“不等于”的开发者来说,这是一项非常有用的功能。通常做法是对 `operator==` 进行重载以指定何时认为两个实体应当视为相同;而对于 `operator!=` 可以利用前者的结果取反得到结果,因此不必单独处理[^2]: ```cpp #include <iostream> using namespace std; struct Point { double x, y; bool operator==(const Point& rhs)const{ return this->x == rhs.x && this->y == rhs.y ; } bool operator!=(const Point &rhs)const{ return !(*this == rhs); } }; int main(){ Point p1{0.5 , 0.7},p2 {0.5,0.8}; cout << ((p1 != p2)? "Not Equal":"Equal")<< endl; } ``` #### 序列化字符串比较法 除了上述传统意义上的属性逐项对照外,还有一种较为间接但也颇为实用的技术叫做序列化后的JSON字符串比较。尽管这不是最高效的解决方案,但在某些场景下确实能够简化开发工作量特别是面对复杂的嵌套结构体时[^5]。 例如,在 JavaScript 或者支持 JSON 处理 API 的其他现代脚本语言里面,可以轻松完成如下转换与验证过程: ```javascript function areObjectsEqual(objA,objB){ const strA=JSON.stringify(objA),strB=JSON.stringify(objB); return strA===strB; } console.log(areObjectsEqual({name:"Alice"},{name:"Bob"})); // 输出:false console.log(areObjectsEqual({age:29},{age:29})); // 输出:true ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值