《面向对象的思考过程(原书第4版)》一3.6 对象操作

简介: 当处理复杂的数据结构和对象时,编程中的很多最基本的操作会变得越来越复杂。例如,当你想复制或比较原始数据类型时,过程非常简单。然而,复制和比较对象则并不简单。《Effective C++》第34页中,Scott Meyers专门花了整个小节来讲述复制和分配对象。

本节书摘来自华章出版社《面向对象的思考过程(原书第4版)》一书中的第3章,第3.6节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.6 对象操作

当处理复杂的数据结构和对象时,编程中的很多最基本的操作会变得越来越复杂。例如,当你想复制或比较原始数据类型时,过程非常简单。然而,复制和比较对象则并不简单。《Effective C++》第34页中,Scott Meyers专门花了整个小节来讲述复制和分配对象。
类和引用
复杂的数据结构和对象的问题在于它们可能会包含引用。简单对引用的复制不能复制它引用的数据结构或对象。同样,当比较对象时,简单地比较两个指针只是比较了引用,而并未比较指针所指的对象。
当对对象进行比较和复制时你就会意识到该问题。具体来说,问题归结于你是否使用了指针。不管怎样,总有一种方式能复制对象。不过这种方式看上去简单,但实际并不简单。因为对象可以包含引用,而必须对整个引用树做有效的复制(如果你要创建一份深拷贝)。
深拷贝与浅拷贝
追踪所有的引用,并对所有引用对象都创建拷贝,这种方式称为深拷贝。深拷贝会拥有很多层级。一个对象引用了很多对象,而这些被引用的对象也可能引用其他对象。拷贝本身开销巨大。浅拷贝只会简单地拷贝引用,而不会深入层级。在《Java面向对象设计》一书第265页的“只见树木不见森林”一节中,Gilbert和McCarty对深拷贝和浅拷贝进行了精彩的讨论。
如图3-8所示,如果只是简单地拷贝对象(称为逐位复制),只会拷贝引用,而不会拷贝实际的对象。因此,两个对象(原始对象和副本)会引用(指向)同一个对象。为了完全复制(即需要复制每个引用对象),你必须编写代码来创建所有的子对象。


1735df409504e7f1361c9db358254497947ff1f8



当比较对象时也有类似的问题。正如拷贝功能一样,比较功能并不像看起来那么简单。因为对象包含引用,必须根据引用树进行有效的对象比较。大多数情况下,语言提供了一种默认的机制来比较对象。当设计类时,你应当在类中提供一个比较功能,从而保证类的行为是预期的。
相关文章
|
5月前
|
数据安全/隐私保护 C++
|
6月前
|
存储 Java 程序员
JavaSE——面向对象基础(1/4)-面向对象编程、程序中的对象、对象的产生、对象的执行原理、类和对象的一些注意事项
JavaSE——面向对象基础(1/4)-面向对象编程、程序中的对象、对象的产生、对象的执行原理、类和对象的一些注意事项
55 7
|
5月前
|
存储 安全 编译器
|
7月前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
221 1
|
存储 负载均衡 Oracle
面向(过程、对象、组件、服务)编程
面向(过程、对象、组件、服务)编程
312 0
|
存储
《编程原本 》一1.3 对象
本节书摘来自华章出版社《编程原本 》一书中的第1章,第1.3节,作者(美)斯特潘诺夫(Stepanov, A.),(美)麦克琼斯(McJones, P.),更多章节内容可以访问云栖社区“华章计算机”公众号查看
953 0
《面向对象的思考过程(原书第4版)》一1.5 究竟什么是对象
对象是面向对象程序中的基础材料。使用面向对象技术的程序本质上是对象的集合。举例来说,一个公司系统包含了代表公司雇员的对象。接下来的小节描述了这些对象的数据和行为。
1051 0
|
JavaScript Java C#
《面向对象的思考过程(原书第4版)》一1.6 究竟什么是类
简单地说,类是对象的蓝图。当你实例化一个对象时,你基于类来构建这个对象。事实上,尝试解释类和对象实际上是一个先有鸡还是先有蛋的问题。描述类时不使用术语对象是非常困难的,反之亦然。例如,个人自行车是一个对象。
1169 0