研究生学习生涯之C++面向对象编程
2019.8.12
对象
对象概述
1.对象概述
对象是现实世界中的实体,其一般上具有以下特性:
(1)每一个对象都有一个用于其他对象相区别的名字。
(2)具有某些特性,我们称它为属性或状态。
(3)有一组操作,每一个操作决定对象的一种行为(即对象)能干什么。
(4)对象的状态只能被自身的行为所改变。
(5)对象之间以消息传递的方式相互通信。
在面向对象的概念中,将对象的内部状态称为属性,将其行为称为方法或事件。对象之间的联系通过消息来传递,消息机制是对象间相互联系和相互作用的方式。
要使用类,还必须用已经定义的类去说明它的实例变量(即对象)。在C++中,class类型一旦被定义,它的实例变量(对象)就能被创建,并初始化,且能定义指针变量指向它。实例化的类就是对象。
2.对象的声明
定义一个新类后,就可以通过类名来定义一具对象,声明的形式如下:
类名 对象名表
说明:类名是定义好的新类的标识符,对象名表是一个或多个对象的名称,如果声明的是多个对象就用逗号运算符分隔。
3.对象的引用
声明完对象就是对象的引用了,对象的引用有两种方式,一种是成员引用方式,一种是对象指针引用方式。
1).成员引用方式
成员变量引用的表示如下:
对象名.成员名
注意:这里的“ . ”是一个运算符,该运算符的功能是表示对象的成员。
2).对象指针方式
对象声明形式中的对象名表,除了是用逗号运算符分隔的多个对象名外,还可以是对象名数组、对象名指针和引用形式的对象名。
声明一个对象指针:
CPerson *p;
但是想使用对象的成员,需要“->”运算符,它是表示成员的运算符,与“.”运算符的意义相同。“->”用来表示对象指针所指的成员,对象指针就是指向对象的指针,例如:
CPerson *p;
p->m_iIndex;
下面的对象数据成员的表示形式是等价的:
**对象指针名->数据成员 与 (对象指针名).数据成员
对象指针名->成员名(参数表) 与 (对象指针名).成员名(参数表)
例如:
CPerson *p;
(*p).m_iIndex;
p->m_iIndex;
对象数组
1.对象数组
对象数组是指数组元素为对象的数组。该数组中若干个元素必须是同一个类的若干个对象。对象数组的定义、赋值和引用与普通数组一样,只是数组的元素与普通数组不同,它是同类的若干个对象,比如,张三、李四、王五都是人,那么其组成的数组即为对象数组。
一般来说,对象数组的定义格式如下:
<类名><数组名>[<大小>]…
其中参数说明如下:
<类名>:指出该数组元素是属于该类的对象。
<数组名>:定义该对象数组的名称,它必须是C++的标识符。
<大小>:广括号内的<大小>给出某一维的元素个数。一维对象数组只有一个方括号,二维对象数组要有两个方括号等。
2. 对象的存储和访问
C++建立和初始化对象的过程是由该类的构造函数来完成的。只要建立对象,构造函数马上就被调用,进行实例化和初始化工作。对象的实例化是指给对象的数据成员分配存储单元,对象的初始化是指给对象的数据成员赋初值的过程。
对象成员通常用“.”运算符进行访问。访问格式为:
对象名.数据成员名 或 对象名.成员函数名(〈实参表〉)
如:类Point的对象的成员的访问如下:
Point p1 ; // 定义Point类对象p1
p1 . x ; p1 . y ; // 访问p1对象的x成员和y成员
p1 . print( ) ; // 访问p1对象的成员函数
3.对象的生存期
正如普通变量有作用域与生存期,对象也有自己的作用域和生命期。而且对象作用域和生命期的规定基本上完全相同,区别在于对象在生命期开始时调用构造函数,在生命期结束时调用析构函数。
特别值得一提的是全局对象的定义。全局对象是在main()函数之外定义的对象,全局对象可以直接在类定义的同时定义,如:
class Clock{
…; //类定义体
}now;
也可单独定义,如:
Clock now;
然后才是 main()函数的定义。
全局对象的构造函数在main()函数执行之前被调用,析构函数在main()函数执行到最后的花括号(即程序退出)时被调用。