《C++面向对象高效编程(第2版)》——1.4 理解消息、方法和实例变量

    xiaoxiao2024-04-20  8

    本节书摘来自异步社区出版社《C++面向对象高效编程(第2版)》一书中的第1章,第1.4节,作者: 【美】Kayshav Dattatri,更多章节内容可以访问云栖社区“异步社区”公众号查看。

    1.4 理解消息、方法和实例变量

    C++面向对象高效编程(第2版)类的任何用户(通常是另一个程序,甚至是另一个类)都是类的客户。客户通过类的对象使用成员函数(消息)进行有用的操作。在后面的章节中我们将介绍,客户只能创建类的对象和使用这些已创建的对象,或者客户也可以根据现有类通过继承创建新的类。

    Smalltalk  在Smalltalk中,调用对象的接口函数(成员函数)被视为向对象发送消息。我们向BankAccount类对象发送MakeDeposit消息,要求它接收存款。向对象发送消息将引起该对象中的方法被执行(即当我们发送消息时,对象会执行特定的方法或函数)。也就是说,对象响应了消息。消息只是客户所见的一个名称,而且该名称可能在运行期被绑定在正确的实现(方法)上,该实现在接收消息的对象内。类的每个实例(即每个对象)都包含实例变量的单独副本,如图1-2所示。

    表1-1 不同语言中使用的术语

    注意:术语方法(消息)、操作和成员函数在本书中将互换使用,实质上它们的含义相同。1.4.1 对象中包含的内容每一个被创建(或者实例化)的对象都获得自身数据成员的副本,数据成员(静态数据成员除外)都是不共享的。稍后我们会介绍,在C++的运行程序中,只有静态数据成员可以在类的对象之间共享。Smalltalk也支持共享数据成员1。什么是成员函数?是否每个对象也能得到每个成员函数代码的副本?很显然不是这样。每个对象都能对声明在类中的所有成员函数作出响应,但是对象本身并不包含成员函数实现代码的副本。至少在运行程序(进程或者任务)中,只存在成员函数实现代码的一份副本。无论在进程中创建了多少个类对象,成员函数的代码均不会被复制,这些代码在类的所有对象之间共享。为了便于理解,可以想象类的实现代码驻留在一个库中。许多实现都可以进一步优化,它们只会为整个系统保留唯一一份实现代码的副本,这通常使用动态共享库完成。这些细节都由操作系统具体规定。例如,我们可以用Card类来表示纸牌游戏中的一张牌,如下所示:

    enum Suit { Clubs, Diamond, Heart, Spade, Unknown }; enum Rank { Two, Three, Four, Five, Six, Seven, Eight,       Nine, Ten, Jack, Queen, King, Ace, Invalid }; enum Color { Red, Black }; class Card {    public:     void FaceUp();  // 牌正面朝上     void FaceDown();  // 牌正面朝下          // 其他成员函数     Card(Rank r, Suit s); // 按此格式创建一张牌    private:     Rank cardRank     Suit cardSuit;     Color cardColor; };``` 如果我们需要52张纸牌,那么就应该创建Card类的52个对象,每一个对象都有自己的数据成员cardRank, cardSuit和cardColor的副本。 ` Card myDeck[52]; // 创建一副标准牌,52张` 纸牌中的每张牌都可以单独操作。我们也可以按如下方式实例化一些纸牌对象,见图1-3:

    Card  spade_Ace(Ace, Spade);  // 黑桃ACard  clubs_2(Two, Clubs);  // 梅花2Card  diamond_Jack(Jack, Diamond); // 方块J`

    图1-3

    1.4.2 实例化(或创建)对象

    一旦设计并实现了一个类,程序员在需要使用该类的对象时,即可通过代码实例化它们。各种语言实例化对象的方式不同。在C++中,对象的实例化看起来是一个简单的声明,如下所示:

    BankAccount myAccount;在Smalltalk中,为初始化类的新对象,程序员必须给该类发送预定义的消息new,如下所示:

    BankAccount new.在Eiffel中,必须用预定义的操作make来创建一个新对象。

    myAccount : BankAccount;  - 只是声明,未创建对象。 myAccount.!!make; - 创建对象```
    最新回复(0)