C++面向对象程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.4 对象

类描述了同类事物共有的属性和行为,类的对象是具有该类所定义的属性和行为的实体。类是抽象的、概念性的范畴,对象是实际存在的个体。类与对象的关系实质上就是数据类型与变量的关系,类是一种自定义数据类型,用它定义的变量就是对象。广义地讲,在面向对象程序设计中用任何数据类型定义的变量都可以称为对象。

1.对象的定义

定义对象的方法与定义一个普通变量没有区别,形式如下:

类名 对象1,对象2;

例如,用前面的时钟类定义两个对象:

Clock myClock, yourClock;

每个Clock类型的对象都有8个成员,其中有3个数据成员hour、minute、second,5个成员函数run()、dispTime()、setHour()、setMinute()、setSecond()。C++会为每个对象独立地分配存储空间,有多少个对象就要分配多少次存储空间。

C++只为每个对象的数据成员分配独立的存储空间,而同一类的成员函数在内存中则只有一份拷贝,供该类的所有对象公用。这样做的原因是,同一个类的所有对象的成员函数都相同,但所有对象的数据成员则可能是不相同的。图3-2是用Clock定义的两个对象myClock和yourClock的对象示意图。

图3-2 myClock和yourClock对象示意图

2.对象的引用

对象的引用方法与结构相似,必须用成员访问限定符“.”作为对象名和对象成员之间的间隔符,形式如下:

对象名.数据成员名
对象名.成员函数名(实参表)

例如,访问myClock的成员:

myClock.setHour(12);
myClock.dispTime();

说明:① 在类外只能访问对象的公有成员,不能访问对象的私有和受保护成员;② 如果定义了对象指针,在通过指针访问对象成员时,要用“->”作为指针对象和对象成员之间的间隔符,例如:

Clock *pClock;
pClock=new Clock;
pClock->setHour(10);
pClock->dispTime();

3.对象赋值

同一个类的不同对象之间,以及同一个类的对象指针之间可以相互赋值,方法如下:

对象名1=对象名2;

例如,对于前面的Clock类,下面的用法是正确的:

Clock *pa,*pb,aClock,bClock;
……
bClock=aClock;
pa=new Clock;
……
pb=pa;

说明:① 进行赋值的两个对象必须类型相同。② 对象赋值就是进行数据成员的值拷贝,赋值之后,两个对象互不相干。在上面的语句中,经过赋值后,bClock的数据成员与aClock的数据成员的值是相同的,但赋值完成后,它们就没有联系了。③ 若对象有指针数据成员,赋值操作可能会产生指针悬挂问题。这个问题留待介绍析构函数时再进行分析。

例3-3】 Clock类及其对象的完整例程。

//Eg3-3.cpp
#include<iostream>
#include<string>
using namespace std;
class Clock{
  public:
    void setHour(int h)  { hour=h;  }
    void setMinute(int m) { minute=m; }
    void setSecond(int s) { second=s; }
    void dispTime(){
      cout<<"Now is: "<<hour<<":"<<minute<<":"<<second<<endl;
  }
  private:
    int hour,minute,second;
};
void main(){
   Clock *pa,*pb,aClock,bClock;
   aClock.setMinute(12);
   aClock.setHour(16);
   aClock.setSecond(27);
   bClock=aClock;
   pa=new Clock;
   pa->setHour(10);
   pa->setMinute(23);
   pa->setSecond(34);
   pb=pa;
   pa->dispTime();
   pb->dispTime();
   aClock.dispTime();
   bClock.dispTime();
}

本程序将输出如下结果:

Now is: 10:23:34
Now is: 10:23:34
Now is: 16:12:27
Now is: 16:12:27