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

简介:

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

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

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

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

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

注意:
术语方法(消息)、操作和成员函数在本书中将互换使用,实质上它们的含义相同。
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);  // 黑桃A
Card  clubs_2(Two, Clubs);  // 梅花2
Card  diamond_Jack(Jack, Diamond); // 方块J`
image

图1-3

1.4.2 实例化(或创建)对象

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

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

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

myAccount : BankAccount;  - 只是声明,未创建对象。
myAccount.!!make; - 创建对象```
相关文章
|
25天前
|
存储 C++ 容器
学会在 C++ 中使用变量:从定义到实践
C++中的变量是数据容器,包括`int`、`double`、`char`、`string`和`bool`等类型。声明变量时指定类型和名称,如`int myNum = 15;`。`cout`与`<<`用于显示变量值。常量用`const`声明,值不可变。变量名应唯一,遵循特定命名规则,常量声明时需立即赋值。
112 1
|
29天前
|
编译器 C++
C++ 双冒号::开头的语法,::变量名,获取全局作用域变量
C++ 双冒号::开头的语法,::变量名,获取全局作用域变量
16 0
|
30天前
|
设计模式 测试技术 编译器
C++项目中打破循环依赖的锁链:实用方法大全(一)
C++项目中打破循环依赖的锁链:实用方法大全
78 0
|
1天前
|
C++
面向对象的C++题目以及解法2
面向对象的C++题目以及解法2
9 1
|
11天前
|
存储 程序员 编译器
C++注释、变量、常量、关键字、标识符、输入输出
C++注释、变量、常量、关键字、标识符、输入输出
|
11天前
|
存储 人工智能 机器人
【C++面向对象】C++图书管理系统 (源码)【独一无二】
【C++面向对象】C++图书管理系统 (源码)【独一无二】
|
17天前
|
存储 人工智能 BI
【C++面向对象】C++银行卡管理系统(源码+论文)【独一无二】
【C++面向对象】C++银行卡管理系统(源码+论文)【独一无二】
|
23天前
|
存储 算法 数据管理
C++中利用随机策略优化二叉树操作效率的实现方法
C++中利用随机策略优化二叉树操作效率的实现方法
74 1
|
24天前
|
存储 算法 数据库
【C/C++ 数据结构 】树的 四种表示方法
【C/C++ 数据结构 】树的 四种表示方法
26 0
|
25天前
|
算法 IDE Java
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
【软件设计师备考 专题 】面向对象程序设计语言:C++、Java、Visual Basic和Visual C++
39 0