清华大学出版社 TSINGHUA UNIVERSITY PRESS 第15章C+的面向对象基础 151概述 152类和对象 153构造函数和析构函数 154继承与派生
15.1 概述 15.2 类和对象 15.3 构造函数和析构函数 15.4 继承与派生 第15章 C++的面向对象基础
清华大学出版社 TSINGHUA UNIVERSITY PRESS 15.1概述 C艹不仅扩充了C面向过程的功能,而且增加了面向 对象的功能,这就使C++成为能适应面向对象程序 设计的现代大型语言。C+不是简单地对C做了某 些改进,而是在C成功的基础上进行了一场革命。 赋予C以新的生命力。 客观世界中任何一个事物都可以看成一个对象。或 者说,客观世界是由千千万万个对象组成的,它 们之间通过一定的渠道相互联系,如图15.1示意。 在实际生活中,人们往往在一个对象中进行活动, 或者说对象是进行活动的基本单位。作为对象, 它应该至少有两个要素:一是从事活动的主体; 是活动的内容。要进行活动,或者是事先安排 好一个活动计划,或者由外界临时通知
15.1 概述 C++不仅扩充了C面向过程的功能,而且增加了面向 对象的功能,这就使C++成为能适应面向对象程序 设计的现代大型语言。C++不是简单地对C做了某 些改进,而是在C成功的基础上进行了一场革命。 赋予C以新的生命力。 客观世界中任何一个事物都可以看成一个对象。或 者说,客观世界是由千千万万个对象组成的,它 们之间通过一定的渠道相互联系,如图15.1示意。 在实际生活中,人们往往在一个对象中进行活动, 或者说对象是进行活动的基本单位。作为对象, 它应该至少有两个要素:一是从事活动的主体; 二是活动的内容。要进行活动,或者是事先安排 好一个活动计划,或者由外界临时通知
清华大学出版社 TSINGHUA UNIVERSITY PRESS 对象1 对象2 数据 对象 操作代码 对象3 对象4 图151 图152
图15.1 图15.2
清华大学出版社 TSINGHUA UNIVERSITY PRESS 从计算机的角度看,一个对象应该包括两个要素: 是数据;二是需要进行的操作。对象就是一个 包含数据以及与这些数据有关的操作的集合。图 152表示一个对象是由数据和操作代码组成的。 传统的面向过程程序设计是围绕功能进行的,用 个函数实现一个功能。所有的数据都是公用的, 个函数可以使用任意一组数据,而一组数据又 能被多个函数所使用(见图153)。程序设计者必 须考虑每一个细节,什么时候对什么数据进行操 作。当程序规模较大、数据很多、操作种类繁多 时,程序设计者往往感到难以应付
从计算机的角度看,一个对象应该包括两个要素: 一是数据;二是需要进行的操作。对象就是一个 包含数据以及与这些数据有关的操作的集合。图 15.2 表示一个对象是由数据和操作代码组成的。 传统的面向过程程序设计是围绕功能进行的,用一 个函数实现一个功能。所有的数据都是公用的, 一个函数可以使用任意一组数据,而一组数据又 能被多个函数所使用(见图15.3)。程序设计者必 须考虑每一个细节,什么时候对什么数据进行操 作。当程序规模较大、数据很多、操作种类繁多 时,程序设计者往往感到难以应付
清华大学出版社 TSINGHUA UNIVERSITY PRESS 主函数 函数1 函数2 函数3 函数11 函数12 函数31 函数32 (数据1 (数据2 数据3 图153
图15.3
清华大学出版社 ZERSITY PR 面向对象程序设计采用新的思路。它面对的是一个 个对象。所有的数据分别属于不同的对象。实际 上,每一组数据都是有特定的用途的,是某种操 作的对象。把相关的数据和操作放在一起,形成 个整体,与外界相对分隔。面向对象程序设计 方法的一个重要特点就是“封装性”,把数据和 操作代码封装在一个对象中。程序设计者的任务 包括两个方面:一是设计对象,即决定把哪些数 据和操作封装在一起;二是在此基础上怎样通知 有关对象完成所需的任务。这时他如同一个总调 度,不断地向各个对象发出命令,让这些对象活 动起来,完成自己范围内的操作。各个对象的操 作完成了,整体任务也就完成了。显然,对一个 大型任务来说,面向对象程序设计方法将是十分 有效的,它能大大降低程序设计人员的工作难度
面向对象程序设计采用新的思路。它面对的是一个 个对象。所有的数据分别属于不同的对象。实际 上,每一组数据都是有特定的用途的,是某种操 作的对象。把相关的数据和操作放在一起,形成 一个整体,与外界相对分隔。面向对象程序设计 方法的一个重要特点就是“封装性” ,把数据和 操作代码封装在一个对象中。程序设计者的任务 包括两个方面:一是设计对象,即决定把哪些数 据和操作封装在一起;二是在此基础上怎样通知 有关对象完成所需的任务。这时他如同一个总调 度,不断地向各个对象发出命令,让这些对象活 动起来,完成自己范围内的操作。各个对象的操 作完成了,整体任务也就完成了。显然,对一个 大型任务来说,面向对象程序设计方法将是十分 有效的,它能大大降低程序设计人员的工作难度, 减少出错机会
清华大学出版社 TSINGHUA UNIVERSITY PRESS 152类和对象 每一个实体都是对象。有一些对象是具有相同的结 构和特性的。在C++中对象的类型称为 “类”( (class)。类代表了某一批对象的共性和特征。 可以说:类是对象的抽象,而对象是类的具体实 例。正如同结构体类型和结构体变量的关系一样, 人们先声明一个结构体类型,然后用它去定义结 构体变量。同一个结构体类型可以定义出多个不 同的结构体变量。在C++中也是先声明一个“类” 类型,然后用它去定义若干个同类型的对象。对 象就是一个“类”类型的变量。类是用来定义对 象的一种抽象数据类型,或者说它是产生对象的 模板。它的性质和其他数据类型(如整型、实型、 枚举类型、结构体类型)相同。在一开始时弄清 角和米的¥
15.2 类 和 对 象 每一个实体都是对象。有一些对象是具有相同的结 构和特性的。在C++中对象的类型称为 “类”(class) 。类代表了某一批对象的共性和特征。 可以说:类是对象的抽象,而对象是类的具体实 例。正如同结构体类型和结构体变量的关系一样, 人们先声明一个结构体类型,然后用它去定义结 构体变量。同一个结构体类型可以定义出多个不 同的结构体变量。在C++中也是先声明一个“类” 类型,然后用它去定义若干个同类型的对象。对 象就是一个“类”类型的变量。类是用来定义对 象的一种抽象数据类型,或者说它是产生对象的 模板。它的性质和其他数据类型(如整型、实型、 枚举类型、结构体类型)相同。在一开始时弄清 对象和类的关系是十分重要的
清华大学出版社 TSINGHUA UNIVERSITY PRESS C++对C的改进,最重要的就是增加了“类”这样 种数据类型。所以C++开始时被称为“带类的 C”。所有面向对象的语言都提供了这种数据类型 在C+中怎样声明一个“类”类型呢?其方法和声 明一个结构体类型是相似的。下面是我们已熟悉 的声明一个结构体类型: struct student fint num; char name [10] char sex i struct student student, student2
C++对C的改进,最重要的就是增加了“类”这样 一种数据类型。所以C++开始时被称为“带类的 C”。所有面向对象的语言都提供了这种数据类型。 在C++中怎样声明一个“类”类型呢?其方法和声 明一个结构体类型是相似的。下面是我们已熟悉 的声明一个结构体类型: struct student {int num; char name[10]; char sex ; }; struct student student1,student2;
清华大学出版社 TSINGHUA UNIVERSITY PRESS 上面声明了一个名为 student的结构体类型并定义了 两个结构体变量 student1和 Student2。可以看到它 只包括数据(变量),没有包括操作。如果希望 对结构体变量中各成员赋值或输出它们的值,需 要另外编写有关的操作语句。结构体变量中各成 员在本作用域中都是“敞开”的,大家都可以用, 而且不受任何限制。这就造成程序的不安全。现 在我们声明一个类: class stud∥以clas9开头 {i nt num; char name [10] char sex i ∥以上3行是数据成员 void display ∥这是成员函数 scout<<num: <<num<<endl;
上面声明了一个名为student的结构体类型并定义了 两个结构体变量student1和student2。可以看到它 只包括数据(变量),没有包括操作。如果希望 对结构体变量中各成员赋值或输出它们的值,需 要另外编写有关的操作语句。结构体变量中各成 员在本作用域中都是“敞开”的,大家都可以用, 而且不受任何限制。这就造成程序的不安全。现 在我们声明一个类: class stud//以class开头 {int num; char name[10]; char sex ; //以上3行是数据成员 void display( ) //这是成员函数 {cout<<"num:"<<num<<endl;
清华大学出版社 TSINGHUA UNIVERSITY PRESS cout<<name: <<name<<end: cout<<"sex:!<<sex<<endl;}∥以上4行是操作代码 stud stud1, stud2: ∥定义了两个stud类的对象 这就声明了一个名为ud的类。可以看到声明“类” 的方法是由声明结构体类型的方法发展而来的。 它除了包含数据部分以外,还包括了对这些数据 的操作部分,也就是把数据和操作封装在一起。 display是一个函数,用来输出本对象中学生的学 号、姓名和性别。类除了具有封装性外,还采用 了信息隐蔽原则,使类中的成员与外界的联系减 少到最低限度。现在封装在stud中的成员都对外界 隐蔽,外界不能调用它们。只有本类中的函数 display可以调用同一类中的数据
cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; } //以上4行是操作代码 }; stud stud1,stud2; //定义了两个stud 类的对象 这就声明了一个名为stud的类。可以看到声明“类” 的方法是由声明结构体类型的方法发展而来的。 它除了包含数据部分以外,还包括了对这些数据 的操作部分,也就是把数据和操作封装在一起。 display是一个函数,用来输出本对象中学生的学 号、姓名和性别。类除了具有封装性外,还采用 了信息隐蔽原则,使类中的成员与外界的联系减 少到最低限度。现在封装在stud中的成员都对外界 隐蔽,外界不能调用它们。只有本类中的函数 display可以调用同一类中的数据