----------------------- Page 1-----------------------
第一章:面向对象程序设计概述
[1_1]什么是面向对象程序设计?
面向对象程序设计是一种新型的程序设计范型。这种范型的主要特征是:
程序=对象+消息。
面向对象程序的基本元素是对象,面向对象程序的主要结构特点是:第一:程序
一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间
传递消息的规律。第二:程序中的一切操作都是通过向对象发送消息来实现的,
对象接受到消息后,启动有关方法完成相应的操作。
面向对象程序设计方法模拟人类习惯的解题方法,代表了计算机程序设计新颖的
思维方式。这种方法的提出是软件开发方法的一场革命,是目前解决软件开发面
临困难的最有希望、最有前途的方法之一。
[1_2]什么是类?什么是对象?对象与类的关系是什么?
在面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操
作封装在一起构成的统一体。对象可以认为是:数据+操作
在面向对象程序设计中,类就是具有相同的数据和相同的操作的一组对象的集
合,也就是说,类是对具有相同数据结构和相同操作的一类对象的描述。
类和对象之间的关系是抽象和具体的关系。类是多个对象进行综合抽象的结果,
一个对象是类的一个实例。
在面向对象程序设计中,总是先声明类,再由类生成对象。类是建立对象的“摸
板”,按照这个摸板所建立的一个个具体的对象,就是类的实际例子,通常称为
实例。
[1_3]现实世界中的对象有哪些特征?请举例说明。
对象是现实世界中的一个实体,其具有以下一些特征:
----------------------- Page 2-----------------------
(1)每一个对象必须有一个名字以区别于其他对象。
(2)需要用属性来描述它的某些特性。
(3)有一组操作,每一个操作决定了对象的一种行为。
(4 )对象的操作可以分为两类:一类是自身所承受的操作,一类是施加于其他
对象的操作。例如:雇员刘名是一个对象
对象名:刘名
对象的属性:
年龄:36      生日:1966.10.1    工资:2000    部门:人事部
对象的操作:吃饭            开车
[1_4]什么是消息?消息具有什么性质?
在面向对象程序设计中,一个对象向另一个对象发出的请求被称为“消息”。当对
象接收到发向它的消息时,就调用有关的方法,执行相应的操作。消息是一个对
象要求另一个对象执行某个操作的规格的说明,通过消息传递才能完成对象之间
的相互请
求或相互协作。消息具有以下3 个性质:
(1)同一个对象可以接收不同形式的多个消息,做出不同的响应。
(2)相同形式的消息可以传递给不同的对象,所做出的响应可以是不同的。
(3)消息的发送可以不考虑具体的接收者,对象可以响应消息,也可以不响应。
[1_5]什么是方法?消息和方法的关系是什么?
在面向对象程序设计中,要求某一对象作某一操作时,就向该对象发送一个响应
的消息,当对象接收到发向它的消息时,就调用有关的方法,执行响应的操作。
方法就是对象所能执行的操作。方法包括界面和方法体两部分。方法的界面也就
是消息的模式,它给出了方法的调用协议;方法体则是实现某种操作的一系列计
算步骤,也就是一段程序。在C++语言中方法是通过函数来实现的,称为成员函
数。消息和方法的关系是:对象根据接收到的消息,调用相应的方法;反过来,
有了方法,对象才能响应相应的消息。
----------------------- Page 3-----------------------
[1_6]什么是封装和抽象?请举例说明。
在现实世界中,所谓封装就是把某个事物包围起来,使外界不知道该事物的具体
内容。在面向对象程序设计中,封装是指把数据和实现操作的代码集中起来放在
对象内部,并尽可能隐蔽对象的内部细节。对象好象是一个不透明的黑盒子,表
示对象属性的数据和实现各个操作的代码都被封装在黑盒子里,从外面是看不见
的,更不能从外面直接访问或修改这些数据及代码。使用一个对象的时候,只需
要知道它向外界提供的接口形式而无需知道它的数据结构细节和实现操作的算
法。封装机制可以将对象的使用者与设计者分开,使用者不必知道对象行为实现
的细节,只需要使用设计者提供的接口让对象去做。
抽象是人类认识问题的最基本的手段之一。它忽略了一个主题中与当前目标无关
的那些方面,以便更充分地注意与当前目标有关的方面。抽象是对复杂世界的简
单表示,抽象强调感兴趣的信息,忽略了不重要的信息。例如,设计一个学籍管
理程序的过程中,考察某个学生对象时,只关心他的姓名、学好、成绩等,而对
他的身高、体重等信息就可以忽略。以一般观点而言,抽象是通过特定的实例(对
象)抽象共同性质以后形成概念的过程。抽象是对系统的简化描述或规范说明,
它强调了系统中的一部分细节和特性,而忽略了其他部分。抽象包括两个方面:
数据抽象和代码抽象(或称为行为抽象)。前者描述某类对象的属性或状况,也
就是此类对象
区别于彼类对象的特征物理量;后者描述了某类对象的共同行为特
征或具有的共同操作。
在面向对象程序设计方法中,对一个具体问题的抽象分析的结果,是通过类来描
述和实现的。现在以学生管理程序为例,通过对学生进行归纳、分析,抽取出其
中的共性,可以得到如下的抽象描述:
共同的属性:姓名、学号、成绩等,他们组成了抽象部分。用C++语言
的数据成员来表示,可以是:
char  *name;  int  number;  float  score;
----------------------- Page 4-----------------------
共同的行为:数据录入、数据修改和数据输出等,这构成了学生的行为抽象部分,
用C++语言的成员函数表示,可以是:input();modify();print();                如果我们开发一
个学生健康档案程序,所关心的特征就有所不同了。可见,即使对同一个研究对
象,由于所研究问题的侧重点不同,就可能产生不同的抽象结果。
[1_7]什么是继承?请举例说明。
继承所表达的是对象类之间的相关关系,这种关系使得某类对象可以继承另一类
对象的特征和能力。现实生活中,继承是很普遍和容易理解的。例如我们继承了
父母的一些特征,如种族、血型、眼睛的颜等,父母是我们所具有的属性的基
础。继承所表达的是对象之间相关的关系。这种关系使得某一类可以继承另一个
类的特征和能力。
[1_8]若类之间具有继承关系,则它们之间具有什么特征?
(1)类间具有共享特征(包括数据和操作代码的共享)
(2)类间具有差别或新增部分(包括非共享的数据和代码操作)
(3)类间具有层次结构
假设有两个类A 和B,若类B 继承类A,则类B 包含了类A 的特征(包括
数据和操作),同时也可以加入自己所特有的新特性。这时,我们称被继承类A
为基类或父类或超类;而称继承类B 为A 类的派生类或子类。同时,我们还可
以说,类B 是从类A 中派生出来的。
[1_9]什么是单继承、多继承?请举例说明。
从继承源上分,继承分为单继承和多继承。单继承是指每个派生类只直接继
承了一个基类的特征。多继承是指多个基类派生出一个派生类的继承关系。多继
承的派生类直接继承了不止一个基类的特征。例如:小孩的玩具车继承了车的一
些特性,还继承了玩具的一些特征。
[1_10]什么是多态性?举例说明。
----------------------- Page 5-----------------------
多态性也是面向对象程序设计的重要特性。它是指不同的对象收到相同的消
息时产生不同的行为方式。例如我们同样双击windows 系统桌面上的图标时
有的是打开多媒体播放器,有的是打开资源管理器。利用多态性,用户只需发送
一般形式的消息,而将所有的实现留给接收消息的对象。对象根据所收到的消息
做出相应的动作。
[1_11]什么是函数重载和运算符重载?为什么要使用重载?
重载一般包括函数重载和运算符重载。函数重载是指一个表示符可同时用于
为多个函数命名,而运算符重载是指一个运算符可同时用于多种运算。也就是说,
相同名字的函数或运算符在不同的场合可以表现出不同的行为。
使用重载的目的是为了更好地表达行为共享,这种行为共享就象将相似的
操作划分在一起。使用重载可以使程序员在只知道操作的一般含义,而不知道操
作的具体细节的情况下能正确地对某个对象使用一个操作。另外,使用重载的直
接益处是减少了程序员记忆操作的名字的负担。
----------------------- Page 6-----------------------
第二章::C++基础
[2_1]简述C++的主要特点
(1)C++保持与C 的兼容,用C 编写的软件可以用到C++中。
(2)用C++编写的程序可读性好,代码结构更合理,可直接地在程序中映射问
题空间的结构。
(3)生成代码的质量高。
(4 )软件的可重用性、可扩充性、可维护性和可靠性有了明显的提高,从而节
省了开发费用和时间。
(5)支持面向对象的机制,可方便地构造出模拟现实问题的实体和操作。
[2_2]下面是一个C 程序,改写它,使它采用 C++风格的i/o 语句
改写如下:
#include  <iostream.h>
main()
{  int  a,b,d,min;
cout<<”enter  two  numbers:  “;
cin>>a;
cin>>b;
min=a>b?b:a;
for(d=2;d<min;d++)
if((a%b)==0)&&((b%d)==0))    break;
if(d==min)
{  cout<<”no  common  denominators\n”;
return  0;
}
-
---------------------- Page 7-----------------------
cout<<”the  lowest  common  denominator  is  “<<endl<<d;
return  0;
}
[2_3]测试下面的注释是否有效?
此注释有效,单行注释中可以嵌套/*……….*/方式的注释。
[2_4]以下简单的C++程序不可能编译通过,为什么?
原因是:在程序中,当一个函数的定义在后,而对它的调用在前时,必须将该函
数的原型写在调用语句之前,而在本程序中缺少函数原型语句。在语句:#inclu
de  <iostream.h>后加上语句 sum(int      a,int  b);就可以通过了。
[2_5]  (1)答:这两个函数原形是等价的,因为函数原型中的参数名可以缺省。
(2)答:这两个函数的第一行是不等价的,函数的第一行中必须包含参数名。
(3)答:这两个函数原型是等价的,因为在函数
原型中未注明参数,C++认为
该函数的参数表为空(void )
[2_6]答:输出结果为:10          20  因为f 函数的参数是引用,所以修改k 的值有效。
函数调用后,主函数中k 的值变为10。由于m 是对函数的引用,当m 被赋
值为20 时,k 的值也变为20。
[2_7]  举例说明可以使用const 替代#define  以消除#define 的不安全性
答:例如:#include  <iostream.h>
#define  A  2+4
#define  B  A*3
void  main()
{  cout<<B<<endl;  }
上面程序的运行结果是 14 而不是 18,但很容易被认为是 18。用const 替代#defi
ne 就能得到正确结果,从而消除了#define 的不安全性。
#include  <iostream.h>
----------------------- Page 8-----------------------
const  A=2+4;
const  B=A*3;
void  main()
{  cout<<B<<endl;  }
运行结果为 18。
[2_8]答:使用内联函数的优点主要有两个:一是能加快代码的执行,减少调用
开销;二是能消除宏定义的不安全性。
[2_9]  用动态分配空间的方法计算Fibonacci 数列的前20 项并存储到动态分配的
空间中。
答:#include    <iostream.h>
#include  “stdio.h”
void  main()
{  int  I,*p=new  int[20];//动态分配20 个整型空间
*p=1;
*(p+1)=1;//前面两个空间赋值 1
cout<<*p<<”\t”<<*(p+1)<<”\t”;
p=p+2;//p 指向第三个空间
for(i=3;i<=20;i++)
{  *p=*(p-1)+*(p-2);
cout<<*p<<”\t”;
if(i%5==0)  cout<<endl;
p++;//指向下一个空间
}
}
结果:1        1      2    3    5
----------------------- Page 9-----------------------
8            13      21      34      55
89      144      233      377      610
987      1597      2584      4181    6765
[2_10]  建立一个被称为sroot()的函数,返回其参数的二次方根。重载 sroot()三次,
让它返回整数、长整数与双精度数的二次方根(计算二次方根时,可以使用标准
库函数 sqrt())
#include  <iostream.h>
#include  <math.h>
int  sroot(int  );long  sroot(long);double    sroot(double);
double    sqrt();//声明开方函数sqrt()
void  main()
什么是编程举个例子{  int  i,x;long  l,y;double  d,z;
cin>>i;  cin>>l;  cin>>d;
x=sroot(i);  y=sroot(l);  z=sroot(d);
cout<<x<<"\t"<<y<<"\t"<<z<<endl;
}
int  sroot(int  i)
{  return  sqrt(i);  }  //i 是整数
long  sroot(long  l)
{  return  sqrt(l);  }  //l 是长整型
double    sroot(double    d)
{  return  sqrt(d);  }  //d 是双精度
//敲进 9  16  25
/
/输出 3    4  5
----------------------- Page 10-----------------------
习题[2_11]  编写C++风格的程序,解决百钱问题,将一元人民币兑换成 1、2、5
分的硬币,有多少种换法?
#include  <iostream.h>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。