1、1第一章:面向对象程序设计概述1_1什么是面向对象程序设计?面向对象程序设计是一种新型的程序设计范型。这种范型的主要特征是:程序=对象 +消息。面向对象程序的基本元素是对象,面向对象程序的主要结构特点是:第一:程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的规律。第二:程序中的一切操作都是通过向对象发送消息来实现的,对象接受到消息后,启动有关方法完成相应的操作。面向对象程序设计方法模拟人类习惯的解题方法,代表了计算机程序设计新颖的思维方式。这种方法的提出是软件开发方法的一场革命,是目前解决软件开发面临困难的最有希望、最有前途的方法之一。1_2什么是类?什么是
2、对象?对象与类的关系是什么?在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。对象可以认为是:数据+操作在面向对象程序设计中,类就是具有相同的数据和相同的操作的一组对象的集合,也就是说,类是对具有相同数据结构和相同操作的一类对象的描述。类和对象之间的关系是抽象和具体的关系。类是多个对象进行综合抽象的结果,一个对象是类的一个实例。在面向对象程序设计中,总是先声明类,再由类生成对象。类是建立对象的“摸板”,按照这个摸板所建立的一个个具体的对象,就是类的实际例子,通常称为实例。1_3现实世界中的对象有哪些特征?请举例说明。对象是现实世界中的一个实体,其具
3、有以下一些特征:(1)每一个对象必须有一个名字以区别于其他对象。2(2)需要用属性来描述它的某些特性。(3)有一组操作,每一个操作决定了对象的一种行为。(4)对象的操作可以分为两类:一类是自身所承受的操作,一类是施加于其他对象的操作。例如:雇员刘名是一个对象对象名:刘名对象的属性:年龄:36 生日:1966.10.1 工资:2000 部门:人事部对象的操作:吃饭 开车1_4什么是消息?消息具有什么性质?在面向对象程序设计中,一个对象向另一个对象发出的请求被称为“消息” 。当对象接收到发向它的消息时,就调用有关的方法,执行相应的操作。消息是一个对象要求另一个对象执行某个操作的规格的说明,通过消息
4、传递才能完成对象之间的相互请求或相互协作。消息具有以下 3 个性质:(1)同一个对象可以接收不同形式的多个消息,做出不同的响应。(2)相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的。(3)消息的发送可以不考虑具体的接收者,对象可以响应消息,也可以不响应。1_5什么是方法?消息和方法的关系是什么?在面向对象程序设计中,要求某一对象作某一操作时,就向该对象发送一个响应的消息,当对象接收到发向它的消息时,就调用有关的方法,执行响应的操作。方法就是对象所能执行的操作。方法包括界面和方法体两部分。方法的界面也就是消息的模式,它给出了方法的调用协议;方法体则是实现某种操作的一系列计算步骤,也
5、就是一段程序。在 C+语言中方法是通过函数来实现的,称为成员函数。消息和方法的关系是:对象根据接收到的消息,调用相应的方法;反过来,有了方法,对象才能响应相应的消息。31_6什么是封装和抽象?请举例说明。在现实世界中,所谓封装就是把某个事物包围起来,使外界不知道该事物的具体内容。在面向对象程序设计中,封装是指把数据和实现操作的代码集中起来放在对象内部,并尽可能隐蔽对象的内部细节。对象好象是一个不透明的黑盒子,表示对象属性的数据和实现各个操作的代码都被封装在黑盒子里,从外面是看不见的,更不能从外面直接访问或修改这些数据及代码。使用一个对象的时候,只需要知道它向外界提供的接口形式而无需知道它的数据
6、结构细节和实现操作的算法。封装机制可以将对象的使用者与设计者分开,使用者不必知道对象行为实现的细节,只需要使用设计者提供的接口让对象去做。抽象是人类认识问题的最基本的手段之一。它忽略了一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象是对复杂世界的简单表示,抽象强调感兴趣的信息,忽略了不重要的信息。例如,设计一个学籍管理程序的过程中,考察某个学生对象时,只关心他的姓名、学好、成绩等,而对他的身高、体重等信息就可以忽略。以一般观点而言,抽象是通过特定的实例(对象)抽象共同性质以后形成概念的过程。抽象是对系统的简化描述或规范说明,它强调了系统中的一部分细节和特性,而忽略
7、了其他部分。抽象包括两个方面:数据抽象和代码抽象(或称为行为抽象)。前者描述某类对象的属性或状况,也就是此类对象区别于彼类对象的特征物理量;后者描述了某类对象的共同行为特征或具有的共同操作。在面向对象程序设计方法中,对一个具体问题的抽象分析的结果,是通过类来描述和实现的。现在以学生管理程序为例,通过对学生进行归纳、分析,抽取出其中的共性,可以得到如下的抽象描述:共同的属性:姓名、学号、成绩等,他们组成了学生数据抽象部分。用 C+语言的数据成员来表示,可以是:char *name; int number; float score;4共同的行为:数据录入、数据修改和数据输出等,这构成了学生的行为抽
8、象部分,用 C+语言的成员函数表示,可以是:input();modify();print(); 如果我们开发一个学生健康档案程序,所关心的特征就有所不同了。可见,即使对同一个研究对象,由于所研究问题的侧重点不同,就可能产生不同的抽象结果。1_7什么是继承?请举例说明。继承所表达的是对象类之间的相关关系,这种关系使得某类对象可以继承另一类对象的特征和能力。现实生活中,继承是很普遍和容易理解的。例如我们继承了父母的一些特征,如种族、血型、眼睛的颜色等,父母是我们所具有的属性的基础。继承所表达的是对象之间相关的关系。这种关系使得某一类可以继承另一个类的特征和能力。1_8若类之间具有继承关系,则它们之
9、间具有什么特征?(1)类间具有共享特征(包括数据和操作代码的共享)(2)类间具有差别或新增部分(包括非共享的数据和代码操作)(3)类间具有层次结构假设有两个类 A 和 B,若类 B 继承类 A,则类 B 包含了类 A 的特征(包括数据和操作),同时也可以加入自己所特有的新特性。这时,我们称被继承类 A 为基类或父类或超类;而称继承类 B 为 A 类的派生类或子类。同时,我们还可以说,类 B 是从类 A 中派生出来的。1_9什么是单继承、多继承?请举例说明。从继承源上分,继承分为单继承和多继承。单继承是指每个派生类只直接继承了一个基类的特征。多继承是指多个基类派生出一个派生类的继承关系。多继承的
10、派生类直接继承了不止一个基类的特征。例如:小孩的玩具车继承了车的一些特性,还继承了玩具的一些特征。1_10什么是多态性?举例说明。5多态性也是面向对象程序设计的重要特性。它是指不同的对象收到相同的消息时产生不同的行为方式。例如我们同样双击 windows 系统桌面上的图标时,有的是打开多媒体播放器,有的是打开资源管理器。利用多态性,用户只需发送一般形式的消息,而将所有的实现留给接收消息的对象。对象根据所收到的消息做出相应的动作。1_11什么是函数重载和运算符重载?为什么要使用重载?重载一般包括函数重载和运算符重载。函数重载是指一个表示符可同时用于为多个函数命名,而运算符重载是指一个运算符可同时
11、用于多种运算。也就是说,相同名字的函数或运算符在不同的场合可以表现出不同的行为。使用重载的目的是为了更好地表达行为共享,这种行为共享就象将相似的操作划分在一起。使用重载可以使程序员在只知道操作的一般含义,而不知道操作的具体细节的情况下能正确地对某个对象使用一个操作。另外,使用重载的直接益处是减少了程序员记忆操作的名字的负担。6第二章::C+ 基础2_1简述 C+的主要特点(1)C+保持与 C 的兼容,用 C 编写的软件可以用到 C+中。(2)用 C+编写的程序可读性好,代码结构更合理,可直接地在程序中映射问题空间的结构。(3)生成代码的质量高。(4)软件的可重用性、可扩充性、可维护性和可靠性有
12、了明显的提高,从而节省了开发费用和时间。(5)支持面向对象的机制,可方便地构造出模拟现实问题的实体和操作。2_2下面是一个 C 程序,改写它,使它采用 C+风格的 i/o 语句改写如下:#include main() int a,b,d,min;couta;cinb;min=ab?b:a;for(d=2;d后加上语句 sum(int a,int b);就可以通过了。2_5(1)答:这两个函数原形是等价的,因为函数原型中的参数名可以缺省。(2)答:这两个函数的第一行是不等价的,函数的第一行中必须包含参数名。(3)答:这两个函数原型是等价的,因为在函数原型中未注明参数,C+认为该函数的参数表为空(
13、void)2_6答:输出结果为: 10 20 因为 f 函数的参数是引用,所以修改 k 的值有效。函数调用后,主函数中 k 的值变为 10。由于 m 是对函数的引用,当 m 被赋值为 20 时,k 的值也变为 20。2_7 举例说明可以使用 const 替代#define 以消除 #define 的不安全性答:例如:#include #define A 2+4#define B A*3void main() coutconst A=2+4;const B=A*3; void main() cout #include “stdio.h”void main() int I,*p=new int20
14、;/动态分配 20 个整型空间*p=1;*(p+1)=1;/前面两个空间赋值 1cout#include int sroot(int );long sroot(long);double sroot(double);double sqrt();/声明开方函数 sqrt()void main() int i,x;long l,y;double d,z;cini; cinl; cind;x=sroot(i); y=sroot(l); z=sroot(d);coutvoid main() int i,j,sum=0;for(i=0;i=0) sum+;cout#include inline float
15、 f(float x) return 2*x*x*x-4*x*x+3*x-6; void main()11 float left,right,middle,ym,yl,yr;coutleftright;yl=f(left);yr=f(right);do middle=(right+left)/2;ym=f(middle);if(yr*ym0) right=middle;Yr=ym;else left=middle;yl=ym;while(fabs(ym)=1e-6);coutclass counter public:counter(int number);/构造函数void increment
16、(); /给原值加 1void decrement(); /给原值减 1int getvalue(); /取得计数器值int print(); /显示计数private:int value;counter:counter(int number)/构造函数定义 value=number; 16void counter:increment()/给原值加 1 value+; void counter:decrement()/给原值减 1 value-; int counter:getvalue()/取得计数器值 return value; int counter:print()/显示计数 couti
17、;counter a(0);for(int j=0;jclass Date public:void printDate(); /显示日期void setDay(int d);/设置日期值void setMonth(int m);/设置月的值void setYear(int y);/设置年的值private:int day,month,year;void main() Date testDay;testDay.setDay(5);testDay.setMonth(10);testDay.setYear(2003);testDay.printDate();void Date:printDate()
18、 cout#include class date public:date(int d,int m,int y);date:date();void show();private:int day,month,year;void date:show() coutday;cinmonth;cinyear;/注意:敲数据时要如:8 回车 9 回车 2005 回车习题:3_14 建立类 cylinder,cylinder 的构造函数被传递了两个 double 值,分别表示圆柱体的半径和高度。用类 cylinder 计算圆柱体的体积,并存储在一个 double 变量中。在类 cylinder 中包含一个成员
19、函数 vol(),用来显示每个 cylinder对象的体积。#include class cylinder public:cylinder(double a,double b);void vol();private:20double r,h;double volume;cylinder:cylinder(double a,double b) r=a; h=b;volume=3.141592*r*r*h;void cylinder:vol() cout#include class Stock public:void set(char *c,float pr);void print();priva
20、te:char Stockcode7;21float price;void Stock:set(char *c,float pr) strcpy(Stockcode,c);price=pr;void Stock:print() coutset(“600001“,8.89);/为对象赋值p-print(); /显示对象delete p;return 0;习题:3_16 声明一个栈类,利用栈操作实现将输入字符串反向输出的功能#include /#include 22/#include #include const int SIZE=10;class stack public:stack() /构造
21、函数 tos=0; void push(char ch);/将数据 ch 压入栈char pop(); /将栈顶数据弹出栈char stckSIZE; /数组,用于存放栈中数据 SIZE 上面赋值为 10int tos; /栈顶位置(数组下标);/stack:stack() /构造函数,初始化栈/ tos=0; void stack:push(char ch)/压入栈if(tos=SIZE) coutstr;stack ss;for(i=0;i#include /#include main() int inverse(char str); /函数原型说明char str100;printf(“
22、Input string: “);scanf(“%s“,str);inverse(str);printf(“Inverse string: %sn“,str);int inverse(char str) /函数定义 char t;int i,j;for(i=0,j=strlen(str);iget_sno()#include class CTest public:const int y2;CTest(int i1,int i2):y1(i1),y2(i2) y1=10; /错误,y1 是调用 const 定义的,不能修改x=y1;int readme() const;/ private:int
23、 x;const int y1;int CTest:readme() const28 int i;i=x;x+; /错误,函数定义用了 const,表示该函数不能修改对象return x;void main() CTest c(2,8);int i=c.y2;c.y2=i; /错误,y2 是常量,不能修改i=c.y1; /错误,y1 是私有变量,不能直接存取4_10答:#include #include class CTest public: CTest () x=20; void use_friend();private:int x;friend void friend_f(CTest fr
24、i);void friend_f(CTest fri) fri.x=55; 29void CTest:use_friend() CTest fri;this-friend_f(fri); /错误。友元函数不是成员函数,所以不能用 this-调用友/元函数:friend_f(fri);void main() CTest fri,fri1;fri.friend_f(fri); /错误,友元函数不是成员函数,所以不能用对象 .函数名调/用友元函数 friend_f(fri1);4_11答:#include #include class CTest public:CTest() x=20; void
25、use_this();private:int x;void CTest:use_this() CTest y,*pointer;30this= /错误,不能对 this 直接赋值*this.x=10; /错误,按优先级原句的含义是*(this.x)=10,显然不对,正确的写/法是(*this).x=10;或 this-x=10;pointer=this;pointer=void main() CTest y;this-x=235; /错误,this 的引用不能在外部函数中,只能在内部函数中。4_12答:运行结果是:10,2030,4850,6870,8090,1611,1204_13答:运行结果是:Constructing10Destructing.100Destructing4_14答:运行结果是:3 objects in existence