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