StupidBeauty
Read times:3223Posted at:Tue Oct 3 06:40:48 2017 - no title specified

《C++面向对象软件设计及构建》文章翻译:3.1将对象用于通信,3.1 Using Objects for Communication

一个面向对象的系统,实际上是由互相交互的对象所组成的组织,这些对象之间形成 关联 聚合 在系统中,每个对象, 都扮演着一个特殊的角色, 它会根据需要与其它对象进行通信,以发挥它作为一个单独个体的作用,同时也发挥着在一个较大的组织中的合作者的作用。 发生交互作用的那些对象,可能属于不同的类,也可能属于相同的类。如果 发生交互作用的对象属于不同的类,那么, 一个类的定义就必须引用到另一个类的对象。如果 发生交互作用的对象属于同一个类,那么,那个类的定义中,必须以某种方式引用到自身。

互相交互的对象之间,通常会使用其它对象帮助自己达成传递信息的目的。用于传递信息的对象,是由 发送者 对象生成的,并被发送给 接收 对象。这种通信,可以是单向的(从发送者到接收者),也可以是双向的(由发送者提供的信息,被接收者修改,再返回给发送者)。这种通信,可以是结构化的,于是就比较短暂(仅在当时的方法调用中起作用),也可以是时效更长的(使用某个共享对象,使得交互的时长比当时的方法调用还要长)

可以用三种方式来将对象用于信息传递:

  • •. 通过名字 来使用:其中一个对象,位于某个作用域中,在那个作用域中,另一个对象能够看到它的名字。一个例子就是,某个对象位于全局作用域中,这样,任何其它对象都能够对它进行操作。

  • •. 通过参数传递 来使用:某个类中的某个方法,会使用某个对象作为它的一个或多个参数。在这种情况下,方法的调用者即扮演着发送者的角色,而包含着被调用的方法的那个对象,则扮演着接收者的角色。

  • •. 通过返回 值来使用:某个类中,某个方法的返回值,可以是一个对象。在这种情况下,其方法中返回了信息对象的那个对象,扮演着发送者的角色,而接受该返回值的对象,则扮演着接收者的角色。

主要使用的是后面两种技巧,即,参数传递和返回值传递。后面我们会详细说明这两种方法。

在一个接收某个对象作为其参数或者返回某个对象作为其结果的方法中,会指明,可以如何操作该参数对象,以及,所返回的对象可以如何被操作。在规范中,会对四个重要的问题给出答案,它们都是与参数对象或结果对象紧密相关的:

  • •. 该对象,在发送或返回之前,会被复制吗?

  • •.对象的接收者,可以修改该对象吗?

  • •.接收者对于该对象所做的修改,是否对于发送者可见?

  • •.应当使用哪种语法(.还是->)来访问该对象?

下表中,展示了几种不同的技巧,以及,各种技巧下对于四个问题的答案。

信息传递对象的特性

技巧

是否复制

是否可改变

是否可见

语法

复制

.

引用

.

指针

->

常量引用

.

常量指针

->

以复制的形式传递对象(或称作“传值”),被称作这个名字,是因为,会制造出该对象的一个复制品,并将复制品传递给接收者。在这种情况下,传递复制品是适当的:发送者希望确保接收者做的任何动作都不会影响到发送者自己所看到的对象。要传递那些会被接收者消费掉的信息,使用这种形式就是安全的。这样产生的效果是,通过复制语义,提供了一种单向的通信形式。

有三种情况,传递对象的复制品是不适当的。第一种,就是,所传递的对象,本身应当被发送者和接收者共享。在这种情况下,传递对象的复制品,会导致,发送者和接收者各自在该对象的不同复制品之上进行操作,而不是在单个共享的对象上进行操作。下面会给出一个共享对象的示例。第二种,就是,发送者希望接收者对所传递的对象进行修改。那么,就应当传递该对象本身,而不是传递它的复制品。第三种,就是,非常巨大的对象(例如,一张1兆大小的位图对象),一般都不会通过复制的方式来传递,以避免在内存占用和复制时间上的开销。然而,在这些情况下,也必须仔细处理,以避免被调用的代码对所传递的对象做出了未预期的修改。

通过传递引用或传递指针的方式来传递对象,其效果是,传递了该对象的 本体 ,而不是传递了它的复制品。以引用或指针的方式来传递某个对象,避免了复制该对象所需要的开销,并且,使得发送者和接收者能够共享同一个对象。在简单的形式中,以引用或指针的方式来传递对象,还使得,发送者能够观察到,接收者可能会对共享的对象做出的任何改变。在其它情况下,需要对该对象进行保护,以避免被接收者改变。

常量引用 常量指针 ,这两种传递对象的方式,提供了一个既能避免复制对象(这一点上,跟较简单的那种引用和指针用法是相同的)又能阻止接收者对传递的对象进行修改的手段。此处的“常量”("const")属性,是"constant"(“常量”)的缩写,它表示的意思是,接收者受到限制,仅能调用常量对象上那些由编译器已知的不会对该对象做出改变的方法。因此,接收者,可以使用取值函数来查询该对象的详细信息,但不能使用设值函数,因为它们会改变该对象的状态。那些声明为不会改变某个对象的状态的方法,被称作常量方法。

http://www.mlxiaoshuo.com/chapter/099589f273422c1be3441e4ea7659b67.html

孟茜

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands