面向对象程序设计教程 (马石安版)

时间:2019-05-12 19:18:57下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《面向对象程序设计教程 (马石安版)》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《面向对象程序设计教程 (马石安版)》。

第一篇:面向对象程序设计教程 (马石安版)

第1章习题答案 名词解释

抽象:抽象(Abstract)就是忽略事物中与当前目标无关的非本质特征,而强调与当前目标有关的本质特征,从而找出事物的共性,并把具有共性的事物划为一类。面向对象方法中的抽象,是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。

封装:面向对象方法中的封装就是把将抽象出来的对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。消息:消息是面向对象程序设计用来描述对象之间通信的机制。一个消息就是一个对象要求另一个对象实施某种操作的一个请求。填空题

(1)面向过程的结构化程序设计方法

面向对象程序设计方法(2)顺序

选择

循环

(3)程序=数据结构+算法

程序=对象+消息(4)过程

(5)抽象性

封装性

继承性

多态性 选择题

(1)B

(2)C

(3)D

(4)C

(5)D

(6)A

(7)A

(8)B C(9)A D 判断题

(1)t

(2)f

(3)f

(4)f

(5)t

(6)f

(7)f

(8)t 简答题(1)结构化程序设计方法着眼于系统要实现的功能,从系统的输入和输出出发,分析系统要做哪些事情,进而考虑如何做这些事情,自顶向下地对系统的功能进行分解,来建立系统的功能结构和相应的程序模块结构,有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。

随着程序规模与复杂性的增长,这种面向过程的结构化程序设计方法存在明显的不足之处。首先是数据安全性问题,由于数据被每个模块所共用,因此是不安全的,一旦出错,很难查明原因。其次是可维护性及可重用性差,它把数据结构和算法分离为相互独立的实体,一旦数据结构需要改变时,常常要涉及整个程序,修改工作量极大并容易产生新的错误。每一种相对于老问题的新方法都要带来额外的开销。另外,图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。(2)

面向对象的程序设计方法中,将程序设计为一组相互协作的对象(Object)而不是一组相互协作的函数。在程序中,属性用数据表示,用来描述对象静态特征;行为用程序代码实现,用来描述对象动态特征。可见,在面向对象的程序设计方法中,对象是数据结构和算法的封装体。对象之间存在各种联系,它们之间通过消息进行通信。程序可表示为: 程序=对象+消息

在面向对象程序设计中,它着重于类的设计。类正是面向对象语言的基本程序模块,通过类的设计,来完成实体的建模任务。类通过一个简单的外部接口,与外界发生关系。一个类中的操作不会处理到另一个类中的数据,这样程序模块的独立性、数据的安全性就有了良好的保障。程序的执行取决于事件发生的顺序,由顺序产生的消息来驱动程序的执行。不必预先确定消息产生的顺序,更符合客观世界的实际。并且面向对象程序设计方法提供了软件重用、解决大问题和复杂问题的有效途径,具有抽象性、封装性、继承性和多态性等特点。(3)

结构化程序设计方法中,把数据结构和算法分离为相互独立的实体。在面向对象程序设计中,数据结构和算法是封装在一起,结合成一个独立的单位,即对象,并尽可能隐蔽对象的内部细节。对象的私有属性只能由这个对象的行为来读取和修改,与外部的联系通过公有行为充当外部接口。

第2章习题答案 名词解释

引用:所谓引用,就是给对象起一个别名,使用该别名可以存取该对象。换句话说,是使新对象和原对象共用一个地址。

内联函数:内联函数是使用inline关键字声明一个函数。

重载函数:重载函数通常用来对具有相似行为而数据类型不同的操作提供—个通用的名称。填空题

(1)函数

(2)//

/*„„*/(3)iostream(4)cin

>>(5)cout

<<(6)地址值

类型

值(7)&

对象(8)声明

(9)值传递

引用传递(10)inline

(11)new

delete(12)x= 10,y=10

x= 100 , y=100 选择题

(1)A

(2)C

(3)C

(4)A

(5)D

(6)D

(7)D

(8)B C(9)A

(10)D 判断题

(1)t

(2)f

(3)f

(4)t

(5)t

(6)t

(7)t

(8)t 简答题

(1)名字空间用来防止命名的冲突。

(2)除了独立引用外,在C++程序中,引用的主要用途是用作函数参数和函数的返回值。(3)在值传递机制中,作为实参的表达式的值被复制到由对应的形参名所标识的一个对象中,作为形参的初始值。函数体对形参的访问、修改都是在这个标识对象上操作,与实参无关,即数据的传递是单向的。

使用引用作函数的形参时,调用函数的实参要用变量名。实参传递给形参,相当于在被调用函数中使用了实参的别名。于是,在被调用函数中对形参的操作,实质是对实参的直接操作,即数据的传递是双向的。

(4)内联函数是使用inline关键字声明一个函数。在程序编译时,编译系统将程序中出现内联函数调用的地方用函数体进行替换,进而减少了时间开销。使用内联函数应注意:

递归函数不能定义为内联函数。

内联函数一般适合于不含有switch和while等复杂的结构且只有1~5条语句的小函数,否则编译系统将该函数视为普通函数。

内联函数只能先定义后使用,否则编译系统也将该函数视为普通函数。对内联函数也不能进行异常接口声明。

(5)不必一致。所有的参数是根据位置和类型而不是名字来区分的。(6)编译系统将根据函数参数的类型和个数来判断使用哪一个函数。程序分析题(写出程序的输出结果,并分析结果)程序的输出结果: num=60 ref=100 程序设计题 //xiti2_1.cpp #include #include

using namespace std;int main(){

float x,y;cout<<“please input 2 floats to x,y:”<>x>>y;float z=pow(x,y);cout<<“pow(”<

(1)公有

保护

私有

private

pubic(2)作用域

MyC1ass(3)样板

实例(4)11(5)1(6)delete(7)数据区

代码区

栈区

堆区(8)封装性

静态成员(9)任意访问权限许可的(10)友元函数

友元类(11)效率

(12)friend A; 选择题

(1)B

(2)BC

(3)C

(4)C

(5)B

D

B

(6)C

(7)B(8)B

(9)AC

(10)D

(11)C

(12)C

(13)B

(14)B(15)B

(16)D

(17)C

(18)CD

(19)D

(20)A

(21)A(22)D

(23)C 简答题(1)类实际上由一个类定义的类型称为类类型,程序员可以使用这个新类型在程序中声明新的变量,具有类类型的变量称为对象。创建对象时,类被用作样板,对象称为类的实例。(2)

定义类一般形式为:

class类名{ public:

<公有数据和函数> protected:

<保护数据和函数> private:

<私有数据和函数> };访问权限共有三种:分别是公有(public)、保护(protected)和私有(private)的。(3)

指创建类的对象。(4)

this指针是C++为成员函数提供的一个隐含对象指针,它不能被显式声明。this指针是一个局部量,局部于某个对象。不同的对象调用同一个成员函数时,编译器根据this指针来确定应该引用哪一个对象的数据成员。(5)

拷贝构造函数是一种特殊的构造函数,它的作用是用一个已经存在的对象去初始化另一个对象时。为了保证所引用的对象不被修改,通常把引用参数声明为const参数。在以下3种情况下,拷贝构造函数都会被自动调用: ① 当用类的一个对象去初始化该类的另一个对象时。② 当函数的形参是类的对象,进行形参和实参结合时。

③ 当函数的返回值是类的对象,函数执行完成返回调用者时。程序分析题(1)Init defa Init defa Init 15(2)Exit main dst 5(3)

Default constructor of Part Constructor of Part,3 Default constructor of Part Constructor of Whole Destructor of Whole Destructor of Part,0 Destructor of Part,3 Destructor of Part,0(4)30 程序设计题(1)

//xiti3_1.cpp #include < iostream > using namespace std;class Circle { public:

Circle(float r){ radius = r;}

~ Circle(){}

float area(){ return 3.14 * radius * radius;} private:

float radius;};int main(){ float r;cout<< “请输入圆的半径:”;cin >> r;Circle p(r);cout << “半径为”<< r << “的圆的面积为:”<< p.area()<< endl;return 0;

}(2)

//xiti3_2.cpp #include

using namespace std;class Book { public:

Book(int w);

static int sumnum;

static int getsum(){return sumnum;}

private:

int num;};Book::Book(int w){ num=w;sumnum-=w;} int Book::sumnum=120;int main(){ Book b1(20);Book b2(70);cout<

(1)基

派生

(2)单继承

多继承(3)私有继承方式(4)公有

保护(5)多继承(6)支配规则(7)解决二义性

(8)使用作用域运算符

引进虚基类 选择题

(1)B

(2)C D

(3)A B C

(4)C

(5)A

(6)C

(7)B

(8)D

(9)A D

(10)A 判断题

(1)f

(2)t

(3)f

(4)t

(5)f

(6)f

简答题(1)

面向对象技术中,类是数据和操作的集合,它们之间有3种主要关系:Has-A,Uses-A和Is-A。Has-A表示类的包含关系,用以描述一个类由多个“部件类”构成。在面向对象技术中,实现has-A关系用类成员表示。

Uses-A表示一个类部分地使用另一个类。在面向对象技术中,这种关系通过类之间成员函数的相互联系或对象参数传递实现。另外,通过定义友员也能实现这种关系。Is-A表示一种分类方式,描述类的抽象和层次关系。继承可以表达is-A关系。(2)

所谓赋值兼容规则是指在公有继承情况下,一个派生类的对象可以作为基类的对象来使用的地方。具体来说,就是下面3种情况: 1)派生类的对象可以赋给基类的对象。2)派生类的对象可以初始化基类的引用。

3)派生类的对象的地址可以赋给指向基类的指针。(3)

当类的继承方式为公有继承时,在派生类中,基类的公有成员和保护成员被继承后分别作为派生类的公有成员和保护成员,这样使得派生类的成员函数可以直接访问它们,而派生类成员函数无法直接访问基类的私有成员。在类外部,派生类的对象可以访问继承下来的基类公有成员。

当类的继承方式为私有继承时,在派生类中,基类的公有成员和保护成员作为派生类的私有成员,派生类的成员函数可以直接访问它们,而派生类的成员函数无法直接访问基类的私有成员。在类外部,派生类的对象无法访问基类的所有成员。当类的继承方式为保护继承时,在派生类中,基类的公有成员和保护成员作为派生类的保护成员,派生类的成员函数可以直接访问它们,而派生类的成员函数无法直接访问基类的私有成员。在类外部,派生类的对象无法访问基类的所有成员。(4)

首先基类构造函数被调用,子对象所在类构造函数次之,最后执行派生类构造函数。(5)

若派生类有构造函数而基类没有,当创建派生类的对象时,派生类的相应构造函数被自动调用。

若派生类没有构造函数而基类有,则基类必须拥有缺省构造函数。只有这样,当创建派生类的对象时,才能自动执行基类的默认构造函数。

若派生类有构造函数,且基类有缺省构造函数,则创建派生类的对象时,基类的缺省构造函数会自动执行,除非当前被调用的派生类构造函数在其初始化段中显式地调用了基类的有参构造函数。

若派生类和基类都有构造函数,但基类没有缺省构造函数,则派生类的每一个构造函数必须在其初始化列表中显式地调用基类的某个构造函数。只有这样,当创建派生类的对象时,基类的构造函数才能获得执行机会。程序分析题(11,12)(26,29)15,16(26,29)程序设计题 //xiti4_1.cpp #include class Point

//定义基类 {

protected:

int x,y;

public:

Point(int myx,int myy){x=myx;y=myy;}

void displayxy()

{

cout<<“The postion of point:”;

cout<<“(”<

} };class Rectangle:public Point

//定义派生类,公有继承方式 {

private:

int l,w;

public:

Rectangle(int myx,int myy,int myl,int myw):Point(myx,myy)

{l=myl;w=myw;}

void displaylw()

{

cout<<“The length and width of rectangle:”;

cout<

} };class Cube:public Rectangle

//定义派生类,公有继承方式 {

private:

int h;

public:

Cube(int myx,int myy,int myl,int myw,int myh):Rectangle(myx,myy,myl,myw)

{h=myh;}

void displayh(){cout<<“The height of cube:”<

Cube v(20,40,3,5,6);

// 派生类对象

cout<<“The data of cube:”<

v.displayxy();

v.displaylw();

v.displayh();} // 第四章 例题:4.16 #include using namespace std;class point { public: point(int myx,int myy){x=myx;y=myy;} void displayxy(){

cout<<“the position of center:”;

cout<<“(”<

第5章习题答案 填空题

(1)静态

动态

(2)编译时的多态性,运行时的多态性。(3)静态

动态(4)覆盖

(5)使用了不恰当的虚函数(6)静态(7)0(8)抽象类 选择题

(1)A

(1)D

(2)B D

(3)B

(4)A B(5)B

(6)C

(7)C D

(8)B D 判断题

(1)f

(2)f

(3)t

(4)f

(5)f

(6)t 简答题(1)

多态性就是同一符号或名字在不同情况下具有不同解释的现象,即是指同一个函数的多种形态。C++支持两种多态性,编译时的多态性和运行时的多态性。

多态性有两种表现形式:一种是不同的对象在收到相同的消息时,产生不同的动作,这主要通过虚函数来实现;另一种是同一对象收到相同的消息却产生不同的函数调用,这主要通过函数重载来实现。(2)

重载函数只要求函数有相同的函数名,并且重载函数是在相同作用域中定义的名字相同的不同函数。而虚函数不仅要求函数名相同,而且要求函数的签名、返回类型也相同。也就是说函数原型必须完全相同,而且虚函数特性必定是体现在基类和派生类的类层次结构中。重载函数可以是成员函数或友员函数,而虚函数只能是非静态成员函数。

构造函数可以重载,析构函数不能重载。正好相反,构造函数不能定义为虚函数,析构函数能定义为虚函数。

重载函数的调用是以所传递参数序列的差别作为调用不同函数的依据而虚函数是根据对象的不同去调用不同类的虚函数。重载函数在编译时表现出多态性,是静态联编;而虚函数则在运行时表现出多态性是动态联编,动态联编是C++的精髓。(3)

包含有纯虚函数的类称为抽象类。抽象类用来描述一组子类的共同的操作接口,它用作基类,而接口的完成实现由派生类提供。抽象类的派生类不一定要给出纯虚函数的实现。如果没有在派生类中给出纯虚函数的实现中,则需仍将它说明为纯虚函数,否则编译器将给出错误信息。说明了纯虚函数的派生类仍是抽象类。(4)

能声明虚析构函数。如果一个类的析构函数是虚函数,那么,由它派生而来的所有子类的析构函数也是虚函数。delete运算符和析构函数一起工作,当使用delete删除一个对象时,delete隐含着对析构函数的一次调用,如果析构函数为虚函数,则这个调用采用动态联编。这样保证了基类类型的指针能够调用适当的析构函数针对不同的对象进行清理工作。程序设计题

(2)//xt5_2.cpp //应用实例

#include #include using namespace std;class Shape { public:

Shape();

void show();

virtual ~Shape(){}

virtual float area()=0;

virtual string shapename()=0;protected:

string name;

static int count;};Shape::Shape(){ cout<<“请输入”;count=count+1;} void Shape::show(){ cout<<“第”<

cout<<“,面积为”<

sum+=s[i]->area();

delete s[i];

} return sum;} class Triangle:public Shape { public:

Triangle();

~Triangle(){cout<<“Triangle destructor is called”<

float area(){return h*w*0.5;}

string shapename(){name=“三角形”;return name;}

protected:

float h, w;};Triangle::Triangle(){

float myw,float myh;cout<<“三角形的底和高:”;cin >>myw>>myh;w=myw;h=myh;} class Rectangle:public Shape { public:

Rectangle();

~Rectangle(){cout<<“Rectangle destructor is called”<

float area(){return l*w;}

string shapename(){name=“矩形”;return name;}

protected:

float l, w;};Rectangle::Rectangle(){ float myl,float myw;cout<<“矩形的长和宽:”;cin >>myl>>myw;l=myl;w=myw;} class Circle:public Shape { protected:

float radius;

public:

Circle();

~Circle(){cout<<“Circle destructor is called”<

float area(){return radius*radius*3.14;}

string shapename(){name=“圆”;return name;} };Circle::Circle(){ float r;cout<<“圆的半径:”;cin >>r;radius=r;} int Shape::count=0;int main(){ Shape *s[4];

s[0]=new Triangle();s[0]->show();

s[1]=new Rectangle();

s[1]->show();

s[2]=new Circle();

s[2]->show();s[3]=new Circle();s[3]->show();

float sum=total(s,4);cout<<“上述图形的面积和为:”;

cout<

第6章习题答案 填空题(1)函数

(2)非静态成员函数

友员函数(3)少

(4)对象的引用(5)整型(6)多 选择题

(1)B

(2)C

(3)A

(4)C 判断题

(1)t

(2)f

(3)t

(4)f 操作题(2)提示:

需要声明如下形式带默认值的构造函数: fraction(int x=0,int y=1);

需要定义一个成员函数去优化分数,如化简、不让负号在分母处等。参考代码如下: void fraction::optimization(){

int gcd,min,max;

if(fenzi==0)

{//如分子为0,则分母为1后,返回

fenmu=1;

return;} gcd=(abs(fenzi)>abs(fenmu)?abs(fenmu):abs(fenzi));if(gcd==0)return;//以下用辗转相除法求最大公约数 if(abs(fenzi)>abs(fenmu))

{

max=fenzi;

min=fenmu;

} else

{

min=fenzi;

max=fenmu;

} do

{

gcd=max%min;

max=min;

min=gcd;

}while(gcd!=0);fenzi/=max;fenmu/=max;if(fenzi<0&&fenmu<0)

{

fenzi=-fenzi;

fenmu=-fenmu;

} else

if(fenzi<0&&fenmu>0){

fenzi=fenzi;

fenmu=fenmu;

}

else

if(fenzi>0&&fenmu>0)

{

fenzi=fenzi;

fenmu=fenmu;

}

if(fenzi>0&&fenmu<0)

{

fenzi=-fenzi;

fenmu=-fenmu;

} }

(3)提示:分数化简后再比较。//第六章 例题:6.3 #include using namespace std;class complex { public: complex(double r=0.0,double i=0.0);complex operator +(complex c);complex operator-(complex c);void display();private: double real,imag;};complex complex::(double)

第7章习题答案 名词解释题

函数模板:一个带类属参数的函数。类模板:一个带类属参数的类

模板函数:通过参数实例化可以再构造出具体的函数。模板类:通过参数实例化可以再构造出具体的类。填空题

(1)函数模板

类模板(2)template(3)class

typename(4)类属参数

类似(5)没有(6)类模板

(7)顺序容器

关联容器

(8)输入迭代器

输出迭代器

前向迭代器

双向迭代器选择题

(1)A

(2)A

(3)AB

(4)C

(5)ABD 判断题

(1)t

(2)f

(3)t

(4)f

(5)f

程序设计题

(1)(xt7_1.cpp)(2)(xt7_2.cpp)第8章习题答案 填空题

(1)流

流类(2)标准输入

(3)cin

cout

cerr

clog

随机访问迭代器(4)fstream.h(5)ios类的成员函数

使用控制符(6)顺序文件

随机读写文件

(7)输入文件流

输出文件流

输入/输出文件流(8)一个指定的文件(9)0(10)read

write 选择题

(1)B

(2)A

(3)BCD

(4)C

(5)A

(6)C

(7)AB

(8)AD

BC(9)D

(10)B

(11)A

(12)BC

(13)C

(14)C

(15)BCD

(16)C 判断题

(1)f

(2)t

(3)t

(4)f

(5)t

(6)f

简答题(1)

从流类库的基本结构可以看到,ios类是istream类和ostream类的基类,从ios类公有派生istream和ostream两个类,而iostream类通过多重继承istream类和ostream类而产生的。如果不将ios类作为其派生类的虚基类,可能会产生二义性。(2)

在文本文件中,每个字节存放一个ASCII代码表示一个字符,文本文件的优点是可直接按字符形式输出,供人们阅读。二进制文件则是把数据的内部存储形式原样存放到文件中,这种文件的优点是与数据在内存中的存储形式保持一致,因此存储效率高,无须进行存储形式的转换,但不能直接按字符形式输出。对于那些保存中间运算结果的临时工作文件,使用二进制形式较为合理。程序分析题 输出结果: Hello,students!Welcome you to oop!程序设计题

(1)参考程序: #include class Fraction {

public:

Fraction(int x=0,int y=1);

friend ostream& operator<<(ostream&,Fraction);private:

int den;

//分子

int num;

//分母 };Fraction::Fraction(int x,int y){ den=x;num=y;} ostream& operator<<(ostream& os,Fraction fr){

os<

return os;} int main(){ Fraction fenshu(2,3);

cout<<“fenshu= ”<

第9章习题答案 填空题

(1)预料

避免

系统运行环境

(2)将程序立即中断运行,从而无条件释放所有资源(3)不必

(4)try语句块(5)异常类型(6)任何(7)抛出列表(8)不抛出

(9)

(10)catch 选择题(至少选一个,可以多选)(1)AC

(2)B

(3)D

(4)CD 判断题

(1)t

(2)f

(3)f

(4)f

(5)f

(6)f

(7)t

(8)t 简答题(1)

异常处理是一种程序定义的错误,它对程序的逻辑错误进行设防,对运行异常加以控制。C++中,异常处理是对所能预料的运行错误进行处理的一套实现机制。(2)

C++的异常处理机制使得异常的引发和处理不必在同一函数中。C++异常处理的目的,是在异常发生时,尽可能地减小破坏,周密地善后,而不去影响其它部分程序的运行。这样底层的函数可以着重解决具体问题,而不必过多地考虑对异常的处理。上层调用者可以在适当的位置设计对不同类型异常的处理。这在大型程序中是非常必要的。程序分析题(分析程序,写出程序的输出结果)运行结果:

Enter number of money:4 Enter number of glasses of milk:2 4 yuan 2 glasses of milk.You have 2 yuan for each glass of milk.

第二篇:面向对象程序设计教程 答案

面向对象程序设计教程(C++语言描述)题解与课程设计指导

第1章

面向对象程序设计概论

一、名词解释 抽象封装消息 【问题解答】

面向对象方法中的抽象是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。

面向对象方法中的封装就是把抽象出来的对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。

消息是面向对象程序设计用来描述对象之间通信的机制。一个消息就是一个对象要求另一个对象实施某种操作的一个请求。

二、填空题(1)目前有面向过程的结构化程序设计方法和面向对象的程序设计方法两种重要的程序设计方法。

(2)结构化程序设计方法中的模块由顺序、选择和循环3种基本结构组成。(3)在结构化程序设计方法中,程序可表示为程序=数据结构+算法; 而面向对象的程序设计方法,程序可表示为程序=对象+消息。(4)结构化程序设计方法中的基本模块是过程; 而面向对象程序设计方法中的基本模块是类。

(5)面向对象程序设计方法具有抽象性、封装性、继承性和多态性等特点。

三、选择题(至少选一个,可以多选)

(1)面向对象程序设计着重于(B)的设计。A.对象B.类C.算法D.数据(2)面向对象程序设计中,把对象的属性和行为组织在同一个模块内的机制叫做(C)。

A.抽象 B.继承 C.封装 D.多态

(3)在面向对象程序设计中,类通过(D)与外界发生关系。A.对象 B.类 C.消息 D.接口

(4)面向对象程序设计中,对象与对象之间的通信机制是(C)。A.对象 B.类 C.消息 D.接口

(5)关于C++与C语言的关系的描述中,(D)是错误的。A.C语言是C++的一个子集 B.C语言与C++是兼容的

C.C++对C语言进行了一些改进 D.C++和C语言都是面向对象的

【结果分析】

C语言是面向过程的。C++语言是一种经过改进的更为优化的C语言,是一种混合型语言,既面向过程也面向对象。

(6)面向对象的程序设计将数据结构与(A)放在一起,作为一个相互依存、不可分割的整体来处理。A.算法 B.信息 C.数据隐藏 D.数据抽象(7)下面(A)不是面向对象系统所包含的要素。

A.重载 B.对象 C.类 D.继承 【结果分析】

面向对象=对象+类+继承+消息+多态(8)下面说法正确的是(BC)。

A.将数据结构和算法置于同一个函数内,即为数据封装 B.一个类通过继承可以获得另一个类的特性

C.面向对象要求程序员集中于事物的本质特征,用抽象的观点看待程序 D.同一消息为不同的对象接受时,产生的行为是一样的,这称为一致性 【结果分析】

面向对象程序设计方法具有抽象性、封装性、继承性和多态性等特点。将数据结构和算法置于同一个类内,即为数据封装。同一消息为不同的对象接受时,产生的行为可能是不一样的,这称为多态性。(9)下面说法正确的是(AD)。

A.对象是计算机内存中的一块区域,它可以存放代码和数据 B.对象实际是功能相对独立的一段程序

C.各个对象间的数据可以共享是对象的一大优点

D.在面向对象的程序中,对象之间只能通过消息相互通信 【结果分析】

对象是计算机内存中的一块区域。在对象中,不但存有数据,而且存有代码,使得每个对象在功能上相互之间保持相对独立。对象之间存在各种联系,但它们之间只能通过消息进行通信。

四、判断题

(1)在高级程序设计语言中,一般用类来实现对象,类是具有相同属性和行为的一组对象的集合,它是创建对象的模板。(√)

(2)C++语言只支持面向对象技术的抽象性、封装性、继承性等特性,而不支持多态性。(×)【结果分析】

C++语言不仅支持面向对象技术的抽象性、封装性、继承性等特性,而且支持多态性。

(3)面向对象程序设计中的消息应该包含“如何做”的信息。(×)【结果分析】

消息是面向对象程序设计用来描述对象之间通信的机制。向对象“发送消息”只需告诉对象做什么,对象根据这个消息决定如何做。(4)一个消息只能产生特定的响应效果。(×)【结果分析】

当一个对象发出消息时,由于接收对象的类型可能不同,所以,它们可能做出不同的反应。这样,一个消息可以产生不同的响应效果,这种现象叫做多态。(5)类的设计和类的继承机制实现了软件模块的可重用性。(√)(6)C++语言和Java语言均不是一个纯正的面向对象的程序设计的语言。(×)【结果分析】

Java语言是一个纯正的面向对象的程序设计语言。(7)学习C++语言是学习面向对象的程序设计方法的唯一途径。(×)【结果分析】

程序设计方法是独立于具体程序设计语言的一种技术,学习C++语言是学习面向对象程序设计方法的重要途径之一。

(8)在C++语言中,类是支持数据封装的工具。(√)

五、简答题

(1)什么是结构化程序设计方法?它有哪些优点和缺点? 【问题解答】

结构化程序设计方法着眼于系统要实现的功能,从系统的输入输出出发,分析系统要做哪些事情,进而考虑如何做这些事情,自顶向下地对系统的功能进行分解,来建立系统的功能结构和相应的程序模块结构,有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。随着程序规模与复杂性的增长,这种面向过程的结构化程序设计方法存在明显的不足之处。首先是数据安全性问题。由于数据被每个模块所共用,因此是不安全的,一旦出错,很难查明原因。其次是可维护性及可重用性差。它把数据结构和算法分离为相互独立的实体,一旦数据结构需要改变时,常常要涉及整个程序,修改工作量极大并容易产生新的错误。每一种相对于老问题的新方法都要带来额外的开销。另外,图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。

(2)什么是面向对象程序设计方法?它有哪些优点? 【问题解答】

面向对象的程序设计方法中,将程序设计为一组相互协作的对象而不是一组相互协作的函数。在程序中,属性用数据表示,用来描述对象静态特征; 行为用程序代码实现,用来描述对象动态特征。可见,在面向对象的程序设计方法中,对象是数据结构和算法的封装体。对象之间存在各种联系,它们之间通过消息进行通信。程序可表示为:

程序=对象+消息

在面向对象程序设计中应着重于类的设计。类正是面向对象语言的基本程序模块,通过类的设计来完成实体的建模任务。类通过一个简单的外部接口与外界发生关系。一个类中的操作不会处理到另一个类中的数据,这样程序模块的独立性、数据的安全性就有了良好的保障。程序的执行取决于事件发生的顺序,由顺序产生的消息来驱动程序的执行。不必预先确定消息产生的顺序,更符合客观世界的实际。并且面向对象程序设计方法提供了软件重用、解决大问题和复杂问题的有效途径,具有抽象性、封装性、继承性和多态性等特点。

(3)结构化程序设计方法与面向对象程序设计方法在对待数据结构和算法关系上有 什么不同? 【问题解答】

结构化程序设计方法中,把数据结构和算法分离为相互独立的实体; 而在面向对象程序设计中,数据结构和算法封装在一起,结合成一个独立的单位,即对象,并尽可能隐蔽对象的内部细节。对象的私有属性只能由这个对象的行为来读取和修改,与外部的联系通过公有行为充当外部接口。第 2 章

从C到C++

面向对象程序设计教程(C++语言描述)题解与课程设计指导

第2章 从C到 C++

一、名词解释

引用内联函数重载函数 【问题解答】

所谓引用就是给对象取一个别名,使用该别名可以存取该对象。换句话说是使新对象和原对象共用一个地址。

内联函数是使用inline关键字声明的函数。

重载函数指在同一个作用域内名字相同而参数不同的函数。重载函数通常用来对具有相似行为而数据类型或数据个数不同的操作提供—个通用的名称。

二、填空题

(1)一般情况下,用C++语言编写的程序是由函数加上类组成的。(2)C++有两种注释符号,一种是//,另一种是 /*„„*/。

(3)使用C++风格的输入输出,在程序中必须包含头文件“iostream”。(4)cin是预定义的标准输入流对象,>>是输入操作符,也称提取运算符。(5)cout是预定义的标准输出流对象,<<是输出操作符,也称插入运算符。(6)指针的值是它所指向那个对象的地址值。指针的类型是它所指向对象的类型。指针的内容便是它所指向对象的值。

(7)C++使用运算符&来定义一个引用,对引用的存取都是对它所引用的对象的存取。(8)当一个函数调用出现在函数定义之前时,必须先用函数原型对函数进行声明。

(9)C++有值传递和引用传递两种参数传递机制。(10)使用关键字inline声明的函数称为内联函数。(11)运算符new用于进行动态内存分配,运算符delete用于释放动态分配的内存。

(12)下面程序的输出结果为x=10,y=10;

x=100,y=100。

#include

using namespace std;

int main()

{

int x=10,&y=x;

cout<<“x=”<

int *p=&y;

*p=100;

cout<<“x=”<

return 0;

}

三、选择题(至少选一个,可以多选)

(1)在整型指针变量p2、p3的定义中,错误的是(A)。A.int p1,*p2,p3;B.int*p2,p1,*p3;C.int p1,*p2=&p1,*p3;D.int*p2,p1,*p3=&p1;【结果分析】

指针定义的具体格式如下所示:

<类型> *<指针名1>,*<指针名2>,„;

(2)若有定义“double xx=3.14,*pp=&xx; ”,则*pp等价于(A.&xxB.*xxC.3.14D.xx 【结果分析】

pp指向xx所在的内存单元,这样*pp和xx等价。(3)下面对引用的描述中(C)是错误的。A.引用是某个变量或对象的别名 B.建立引用时,要对它初始化)。C C.对引用初始化可以使用任意类型的变量 D.引用与其代表的对象具有相同的地址 【结果分析】

所谓引用就是给对象取一个别名,使用该别名可以存取该对象,所以对引用初始化必须使用同类型的变量。

(4)函数没有返回值的时候,应该选择(A)的函数类型。A.void B.int C.不确定 D.float(5)在函数的定义格式中,下面各组成部分中,(D)是可以省略的。A.函数名 B.函数体 C.返回值类型 D.函数参数 【结果分析】

函数的定义可以缺省形式参数,此时称为无参函数。

(6)对重载的函数来说,下面叙述不正确的是(D)。A.参数的类型不同 B.参数的顺序不同 C.参数的个数不同

D.参数的个数、类型、顺序都相同,但函数的返回值类型不同 【结果分析】

对重载的函数来说,编译系统将根据函数参数的类型和个数来判断使用哪一个函数,所以重载函数参数的个数、类型、顺序不能都相同。

(7)下列有关设置函数参数默认值的描述中,(D)是正确的。A.对设置函数参数默认值的顺序没有任何规定 B.函数具有一个参数时不能设置默认值

C.默认参数要设置在函数的原型中,而不能设置在函数的定义语句中 D.设置默认参数可使用表达式,但表达式中不可用局部变量 【结果分析】

在C++中,在函数原型中可以为一个或多个参数指定默认值。对函数参数设置默认值要注意以下几点。◆若没有声明函数原型,参数的默认值可在函数定义的头部进行设置,否则必须在函数原型中进行设置。

◆在一个指定了默认值的参数右边不能出现没有指定默认值的参数。◆设置默认参数可使用表达式,但表达式中不可用局部变量。(8)下面说法正确的是(BC)。A.所有的函数都可以说明为内联函数

B.具有循环语句、switch语句的函数不能说明为内联函数

C.使用内联函数,可以加快程序执行的速度,但会增加程序代码的大小 D.使用内联函数,可以减小程序代码大小,但使程序执行的速度减慢 【结果分析】

内联函数主要是解决程序的运行效率问题。在程序编译时,编译系统将程序中出现内联函数调用的地方用函数体进行替换,进而减少了程序运行的时间,但会增加程序代码的大小。它是以空间换取时间,因此内联函数适用于功能不太复杂,但要求被频繁调用的函数。

(9)一个函数功能不太复杂,但要求被频繁调用,应选用(A)。A.内联函数 B.重载函数 C.递归函数 D.嵌套函数(10)C++对C语言做了很多改进,下列描述中使得C语言发生了质变,即从面向过程变成面向对象的是(D)。A.增加了一些新的运算符

B.允许函数重载,并允许设置默认参数 C.规定函数说明必须用原型 D.引进了类和对象的概念 【结果分析】

面向对象=对象+类+继承+消息+多态

四、判断题

(1)C++程序中,不得使用没有定义或说明的变量。(√)(2)使用const说明常量时,可以不必指出类型。(×)【结果分析】

如果用const 定义的是一个整型常量,则类型说明符int可以省略。(3)引用被创建时可以用任意变量进行初始化。(×)【结果分析】

对引用初始化必须使用同类型的变量。

(4)一个返回引用的调用函数可以作为左值。(√)(5)函数可以没有参数,也可以没有返回值。(√)(6)没有参数的两个函数是不能重载的。(√)(7)函数可设置默认参数,但不允许将一个函数的所有参数都设置为默认参数。(×)

【结果分析】

函数可设置默认参数,且允许将一个函数的所有参数都设置为默认参数。(8)运算符new分配的空间由运算符delete释放。(√)

五、简答题

(1)名字空间的用途是什么? 【问题解答】

名字空间用来防止命名的冲突。(2)引用有何用处? 【问题解答】

除了独立引用外,在C++程序中,引用的主要用途是用作函数参数和函数的返回值。

(3)比较值调用和引用调用的相同点与不同点。【问题解答】 在值调用机制中,作为实参的表达式的值被复制到由对应的形参名所标识的一个对象中,作为形参的初始值。函数体对形参的访问、修改都是在这个标识对象上操作的,与实参无关,即数据的传递是单向的。

使用引用作函数的形参时,调用函数的实参要用变量名。实参传递给形参,相当于在被调用函数中使用了实参的别名。于是,在被调用函数中对形参的操作实质是对实参的直接操作,即数据的传递是双向的。(4)内联函数有什么作用?它有哪些特点? 【问题解答】

内联函数是使用inline关键字声明的函数。在程序编译时,编译系统将程序中出现内联函数调用的地方用函数体进行替换,进而减少了程序运行的时间。使用内联函数应注意以下几点。◆递归函数不能定义为内联函数。

◆内联函数一般适合于不含有switch和while等复杂的结构且只有1~5条语句的小函数,否则编译系统将该函数视为普通函数。

◆内联函数只能先定义后使用,否则编译系统也将该函数视为普通函数。◆对内联函数也不能进行异常接口声明。(5)函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗?

【问题解答】

不必一致。所有的参数是根据位置和类型而不是名字来区分的。(6)重载函数时通过什么来区分? 【问题解答】

编译系统将根据函数参数的类型和个数来判断使用哪一个函数。

六、程序分析题(写出程序的输出结果,并分析结果)

#include

using namespace std;

int main()

{

int num=50;

int& ref=num;

ref=ref+10;

cout<<“num=”<

num=num+40;

cout<<“ref=”<

return 0;}

【输出结果】

num=60

ref=100

【问题分析】

本题主要考查引用的含义。【结果分析】

程序首先定义一个int类型的对象num,并给它赋初始值50。然后又定义了一个int类型的引用ref,并将它和num相联系。这样,无论是对num还是对ref进行操作,实际上都是对那个一开始放着50的物理单元的内容进行操作。

七、程序设计题

写出一个完整的C++程序,使用系统函数pow(x,y)计算xy的值,注意包含头文件cmath。【问题分析】

本题主要考查简单的输入输出和标准库函数的调用方法。【解题思路】

① 由于要用到系统函数pow(x,y),所以要包含头文件cmath。

② 要计算xy的值,首先必须知道x和y的值。为了程序的通用性,最好通过交互的方式输入x和y的值。【参考程序】

// xt2_1.cpp

#include

#include

using namespace std;

int main()

{

float x,y;

cout<<“please input 2 floats to x,y:”;

cin>>x>>y;

float z=pow(x,y);

cout<<“pow(”<

return 0;} 【输出结果】

please input 2 floats to x,y:3.1 2

pow(3.1,2)=9.61

第 3 章

类与对象

面向对象程序设计教程(C++语言描述)题解与课程设计指导

第3章

类 与 对 象

一、填空题(1)类定义中关键字private、public和protected以后的成员的访问权限分别是私有、公有和保护。如果没有使用关键字,则所有成员默认定义为private权限。具有public访问权限的数据成员才能被不属于该类的函数所直接访问。(2)定义成员函数时,运算符“∷”是作用域运算符,“MyClass∷”用于表明其后的成员函数是在“MyClass类”中说明的。

(3)在程序运行时,通过为对象分配内存来创建对象。在创建对象时,使用类作为样板,故称对象为类的实例。

(4)假定Dc是一个类,则执行“Dc a[10],b(2)”语句时,系统自动调用该类构造函数的次数为11。【结果分析】

创建10个数组元素需调用构造函数10次,创建对象b需调用构造函数1次,所以系统自动调用该类构造函数的总次数为11。

(5)对于任意一个类,析构函数的个数最多为1个。

(6)delete运算符通常用于实现释放该类对象中指针成员所指向的动态存储空间的任务。(7)C++程序的内存格局通常分为4个区: 数据区、代码区、栈区和堆区。(8)数据定义为全局变量,破坏了数据的 封装性; 较好的解决办法是将所要共享的数据定义为类的 静态成员。

(9)静态数据成员和静态成员函数可由 任意访问权限许可的函数访问。(10)友元函数和 友元类统称为友元。(11)友元的正确使用能提高程序的效率,但破坏了类的封装性和数据的隐蔽性。(12)若需要把一个类A定义为一个类B的友元类,则应在类B的定义中加入一条语句: friend class A。

二、选择题(至少选一个,可以多选)(1)以下不属于类访问权限的是(B)。A.public B.staticC.protectedD.private 【结果分析】

类的访问权限有public、protected 和private。(2)有关类的说法不正确的是(BC)。A.类是一种用户自定义的数据类型

B.只有类的成员函数才能访问类的私有数据成员

C.在类中,如不做权限说明,所有的数据成员都是公有的 D.在类中,如不做权限说明,所有的数据成员都是私有的 【结果分析】

类是一种用户自定义的数据类型,类中成员均具有一种访问权限。关键字public、protected 和private以后的成员的访问权限分别是公有、保护和私有的,所有成员默认定义为private的。

私有成员是被隐藏的数据,只有该类的成员函数或友元函数才可以访问它。(3)在类定义的外部,可以被任意函数访问的成员有(C)。A.所有类成员 B.private或protected的类成员 C.public的类成员 D.public或private的类成员 【结果分析】

类是一种用户自定义的数据类型,类中成员均具有一种访问权限。公有成员定义了类的外部接口。私有成员是被隐藏的数据,只有该类的成员函数或友元函数才可以引用它。保护成员具有公有成员和私有成员的双重性质,可以被该类或派生类的成员函数或友元函数引用。可见在类定义的外部,可以被任意函数访问的成员是public的类成员。

(4)关于类和对象的说法(C)是错误的。A.对象是类的一个实例

B.任何一个对象只能属于一个具体的类 C.一个类只能有一个对象

D.类与对象的关系和数据类型与变量的关系相似 【结果分析】

C++语言的类就是一种用户自己定义的数据类型,类和对象的关系就相当于基本数据类型与它的变量的关系,所以任何一个对象只能属于一个具体的类,但一个类可以有多个对象。(5)设MClass是一个类,dd是它的一个对象,pp是指向dd的指针,cc是dd的引用,则对成员的访问,对象dd可以通过(B)进行,指针pp可以通过(D)进行,引用cc可以通过(B)进行。

A.∷ B..C.& D.->(6)关于成员函数的说法中不正确的是(C)。A.成员函数可以无返回值 B.成员函数可以重载 C.成员函数一定是内联函数

D.成员函数可以设定参数的默认值 【结果分析】

与普通函数不同的是,成员函数是属于某个类的。成员函数的实现,可以放在类体内,也可以放在类体外。在类体外实现的成员函数不再是内联函数。(7)下面对构造函数的不正确描述是(B)。A.系统可以提供默认的构造函数

B.构造函数可以有参数,所以也可以有返回值 C.构造函数可以重载

D.构造函数可以设置默认参数 【结果分析】

构造函数不能指定返回类型,即使是void类型也不可以,当然不可能有返回值。(8)假定A是一个类,那么执行语句“A a,b(3),*p; ”调用了(B)次构造函数。

A.1 B.2 C.3 D.4 【结果分析】

声明指针是不会调用构造函数的。

(9)下面对析构函数的正确描述是(AC)。A.系统可以提供默认的析构函数 B.析构函数必须由用户定义 C.析构函数没有参数

D.析构函数可以设置默认参数 【结果分析】

析构函数的作用是在对象消失时执行一项清理任务。如果一个类中没有定义析构函数,系统将自动生成一个默认析构函数。析构函数没有参数,当然不可能设置默认参数。

(10)类的析构函数是(D)时被调用的。

A.类创建 B.创建对象 C.引用对象 D.释放对象

(11)创建一个类的对象时,系统自动调用(B); 撤销对象时,系统自动调用(C)。

A.成员函数 B.构造函数 C.析构函数 D.复制构造函数(12)通常拷贝构造函数的参数是(C)。

A.某个对象名 B.某个对象的成员名 C.某个对象的引用名 D.某个对象的指针名(13)关于this指针的说法正确的是(B)。

A.this指针必须显式说明B.当创建一个对象后,this指针就指向该对象 C.成员函数拥有this指针D.静态成员函数拥有this指针。【结果分析】

this指针是由C++编译器自动产生且较常用的一个隐含对象指针,它不能被显式声明。当创建一个对象时,this指针就初始化指向该对象。但只有非静态成员函数才拥有this指针,并通过该指针来处理对象。(14)下列关于子对象的描述中,(B)是错误的。A.子对象是类的一种数据成员,它是另一个类的对象 B.子对象可以是自身类的对象

C.对子对象的初始化要包含在该类的构造函数中 D.一个类中能含有多个子对象作其成员 【结果分析】

子对象不可以是自身类的对象。

(15)对new运算符的下列描述中,(B)是错误的。A.它可以动态创建对象和对象数组 B.用它创建对象数组时必须指定初始值 C.用它创建对象时要调用构造函数

D.用它创建的对象数组可以使用运算符delete来一次释放 【结果分析】

使用运算符new创建对象数组的格式如下:

new <类型说明符> [<算术表达式>]

其中,<算术表达式>给出数组的大小,后面不能再跟构造函数参数,所以用它创建对象数组时不能指定初始值。

(16)对delete运算符的下列描述中,(D)是错误的。A.用它可以释放用new运算符创建的对象和对象数组

B.用它释放一个对象时,它作用于一个new所返回的指针

C.用它释放一个对象数组时,它作用的指针名前须加下标运算符[ ] D.用它可一次释放用new运算符创建的多个对象 【结果分析】

用delete一次只能释放用new创建的1个对象,但可释放一个对象数组。(17)关于静态数据成员,下面叙述不正确的是(C)。A.使用静态数据成员,实际上是为了消除全局变量

B.可以使用“对象名.静态成员”或者“类名∷静态成员”来访问静态数据成员

C.静态数据成员只能在静态成员函数中引用 D.所有对象的静态数据成员占用同一内存单元 【结果分析】

静态数据成员可以在静态成员函数中引用,也可以在非静态成员函数中引用。(18)对静态数据成员的不正确描述是(CD)。A.静态成员不属于对象,是类的共享成员 B.静态数据成员要在类外定义和初始化

C.调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this指针 D.只有静态成员函数可以操作静态数据成员 【结果分析】 this指针是一个局部量,局部于某个对象,而静态成员函数是属于整个类而不是某个对象,它没有this指针。静态成员函数和非静态成员函数均可操作静态数据成员。

(19)下面的选项中,静态成员函数不能直接访问的是(D)。A.静态数据成员 B.静态成员函数 C.类以外的函数和数据 D.非静态数据成员 【结果分析】

由于静态成员函数没有this指针,它只能直接访问该类的静态数据成员、静态成员函数和类以外的函数和数据,访问类中的非静态数据成员必须通过参数传递方式得到对象名,然后通过对象名来访问。

(20)在类的定义中,引入友元的原因是(A)。

A.提高效率 B.深化使用类的封装性 C.提高程序的可读性 D.提高数据的隐蔽性 【结果分析】

友元的作用主要是为了提高效率和方便编程,但友元破坏了类的封装性和隐蔽性,使用时要权衡利弊。

(21)友元类的声明方法是(A)。

A.friend class<类名>; B.youyuan class<类名>; C.class friend<类名>; D.friends class<类名>;(22)下面对友元的错误描述是(D)。A.关键字friend用于声明友元

B.一个类中的成员函数可以是另一个类的友元 C.友元函数访问对象的成员不受访问特性影响 D.友元函数通过this指针访问对象成员 【结果分析】

友元函数是一个放在类中的普通函数,它没有this指针。(23)下面选项中,(C)不是类的成员函数。

A.构造函数 B.析构函数 C.友元函数 D.拷贝构造函数

三、简答题

(1)类与对象有什么关系? 【问题解答】

类是一种用户自己定义的数据类型,和其他数据类型不同的是,组成这种类型的不仅可以有数据,而且可以有对数据进行操作的函数。程序员可以使用这个新类型在程序中声明新的变量,具有类类型的变量称为对象。创建对象时,类被用做样板,对象称为类的实例。

(2)类定义的一般形式是什么?其成员有哪几种访问权限? 【问题解答】

定义类一般形式为:

class类名{

public:

<公有数据和函数>

protected:

<保护数据和函数>

private:

<私有数据和函数> };

访问权限共有3种: 分别是公有(public)、保护(protected)和私有(private)。(3)类的实例化是指创建类的对象还是定义类? 【问题解答】

指创建类的对象。

(4)什么是this指针?它的主要作用是什么? 【问题解答】

this指针是C++语言为成员函数提供的一个隐含对象指针,它不能被显式声明。this指针是一个局部量,局部于某个对象。不同的对象调用同一个成员函数时,编译器根据this指针来确定应该引用哪一个对象的数据成员。(5)什么叫做拷贝构造函数?拷贝构造函数何时被调用? 【问题解答】

拷贝构造函数是一种特殊的构造函数,它的作用是用一个已经存在的对象去初始化另一个对象。为了保证所引用的对象不被修改,通常把引用参数声明为const参数。

在以下3种情况下,拷贝构造函数都会被自动调用: ◆当用类的一个对象去初始化该类的另一个对象时; ◆当函数的形参是类的对象,进行形参和实参结合时;

◆当函数的返回值是类的对象,函数执行完成返回调用者时。

四、程序分析题(写出程序的输出结果,并分析结果)(1)

#include

using namespace std;

class Test {

private:

int num;public:

Test();// 默认构造函数

Test(int n);// 带一个参数构造函数

};

Test∷Test()

{

cout<<“Init defa”<

num=0;}

Test∷Test(int n)

{

cout<<“Init”<<“ ”<

num=n;}

int main()

{

Test x[2];// 语句1

Test y(15);// 语句2

return 0;}

【输出结果】

Init defa Init defa

Init 15

【问题分析】

本题主要考查构造函数的调用时机和构造函数的匹配问题。【要点提示】

构造函数在创建对象时被自动调用,具体调用哪个构造函数将由编译系统根据重载函数的匹配原则来确定。【结果分析】

① 程序声明了2个对象x和y,类中有2个构造函数。

② 程序首先执行语句1,创建对象x,调用默认构造函数。由于对象x是对象数组,每个数组元素被创建时都要调用构造函数,所以默认构造函数被调用了2次,输出第1、2行结果。程序接着执行语句2,创建对象y,调用带一个参数的构造函数,输出第3行结果。(2)

#include

using namespace std;

class Xx {

private:

int num;

public:

Xx(int x){num=x;} // 构造函数

~Xx(){cout<<“dst ”<

};

int main()

{

Xx w(5);// 语句1

cout<<“Exit main”<

return 0;}

【输出结果】

Exit main

dst 5

【问题分析】

本题主要考查析构函数的调用时机。【要点提示】

析构函数在释放对象时被自动调用。【结果分析】

① 程序声明了一个对象w。

② 程序首先执行语句1,创建对象w,调用构造函数,num得到初值5。程序接着执行语句2,输出第1行结果。当程序结束时,释放对象w,析构函数被调用,输出第2行结果。

(3)将例3.10中的Whole类如下修改,其他部分不变,写出输出结果。

class Whole {

public:

Whole(int i);// Whole的有参构造函数

Whole(){};// Whole的无参构造函数

~Whole();// Whole的析构函数

private:

Part p1;// 子对象1

Part p2;// 子对象2

Part p3;// 子对象3 };Whole∷Whole(int i):p2(i),p1()

{

cout<<“Constructor of Whole”<

Whole∷~Whole()

{

cout<<“Destructor of Whole”<

【输出结果】

Default constructor of Part

Constructor of Part,3

Default constructor of Part

Constructor of Whole

Destructor of Whole

Destructor of Part,0

Destructor of Part,3

Destructor of Part,0

【问题分析】

本题主要考查子对象初始化的方法和含有子对象时构造函数和析构函数的调用顺序。

【要点提示】

◆当建立X类的对象时,先调用子对象的构造函数,初始化子对象,然后才执行X类的构造函数,初始化X类中的其他成员。

◆对子对象构造函数的调用顺序取决于这些子对象在类中的说明顺序,与它们在成员初始化列表中给出的顺序无关。

◆如果X类的构造函数没有给出成员初始化列表,表明子对象将使用默认构造函数进行初始化。◆析构函数的调用顺序与构造函数的调用顺序正好相反。【结果分析】

程序的Whole类中出现了类Part的3个对象p1、p2和p3,作为该类的数据成员,则p1、p2和p3被称为子对象。当建立Whole类的对象w时,子对象p1、p2和p3被建立,相应的构造函数被执行。由于p1在Whole类中先说明,所以先执行它所使用的构造函数,即类Part的默认构造函数,接着p2执行它所使用的有参构造函数,紧接着初始化p3,由于Whole类构造函数的成员初始化列表中没有子对象p3进行初始化的选项,所以执行类Part的默认构造函数,当所有子对象被构造完之后,对象w的构造函数才被执行,从而得到前4行输出结果,而后4行是执行相应析构函数的输出结果。(4)

#include

using namespace std;

class Book {

public:

Book(int w);

static int sumnum;

private:

int num;};

Book∷Book(int w)

{

num=w;

sumnum-=w;}

int Book∷sumnum=120;// 语句1 int main()

{

Book b1(20);// 语句2

Book b2(70);// 语句3

cout<

return 0;}

【输出结果】

【问题分析】

本题主要考查“在类的范围内所有对象共享静态成员的数据”的含义。【结果分析】

程序中语句1对静态成员sumnum进行初始化,sumnum得到初值120。执行语句2时,调用构造函数,sumnum变为100。接着语句3,再调用构造函数,sumnum变为30。

五、程序设计题

(1)声明一个Circle类,有数据成员radius(半径)、成员函数area(),计算圆的面积,构造一个Circle的对象进行测试。【问题分析】

本题主要考查类定义的形式、对象成员访问和对象初始化的方法。要求理解类和构造函数的真正含义,特别注意如何将客观事物的属性和行为抽象为类的成员。【解题思路】

① 题目中已给出了类的基本部分,需要增加一个构造函数来初始化数据成员radius。

② 为了程序的通用性,圆的半径由键盘输入。【参考程序】

// xt3_1.cpp

#include

第三篇:面向对象程序设计教程(C++语言描述)题解

面向对象程序设计教程(C++语言描述)题解 第1章 面向对象程序设计概论

一、名词解释 抽象 封装 消息 【问题解答】

面向对象方法中的抽象是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。

面向对象方法中的封装就是把抽象出来的对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。

消息是面向对象程序设计用来描述对象之间通信的机制。一个消息就是一个对象要求另一个对象实施某种操作的一个请求。

二、填空题

(1)目前有面向过程的结构化程序设计方法和面向对象的程序设计方法两种重要的程序设计方法。(2)结构化程序设计方法中的模块由顺序、选择和循环3种基本结构组成。

(3)在结构化程序设计方法中,程序可表示为程序=数据结构+算法; 而面向对象的程序设计方法,程序可表示为程序=对象+消息。

(4)结构化程序设计方法中的基本模块是过程; 而面向对象程序设计方法中的基本模块是类。(5)面向对象程序设计方法具有抽象性、封装性、继承性和多态性等特点。

三、选择题(至少选一个,可以多选)

(1)面向对象程序设计着重于(B)的设计。

A.对象B.类C.算法D.数据

(2)面向对象程序设计中,把对象的属性和行为组织在同一个模块内的机制叫做(C)。

A.抽象 B.继承 C.封装 D.多态(3)在面向对象程序设计中,类通过(D)与外界发生关系。

A.对象 B.类 C.消息 D.接口(4)面向对象程序设计中,对象与对象之间的通信机制是(C)。

A.对象 B.类 C.消息 D.接口(5)关于C++与C语言的关系的描述中,(D)是错误的。

A.C语言是C++的一个子集 B.C语言与C++是兼容的 C.C++对C语言进行了一些改进 D.C++和C语言都是面向对象的

【结果分析】

C语言是面向过程的。C++语言是一种经过改进的更为优化的C语言,是一种混合型语言,既面向过程也面向对象。

(6)面向对象的程序设计将数据结构与(A)放在一起,作为一个相互依存、不可分割的整体来处理。

A.算法 B.信息 C.数据隐藏 D.数据抽象(7)下面(A)不是面向对象系统所包含的要素。

A.重载 B.对象 C.类 D.继承 【结果分析】

面向对象=对象+类+继承+消息+多态(8)下面说法正确的是(BC)。

A.将数据结构和算法臵于同一个函数内,即为数据封装

B.一个类通过继承可以获得另一个类的特性 C.面向对象要求程序员集中于事物的本质特征,用抽象的观点看待程序

D.同一消息为不同的对象接受时,产生的行为是一样的,这称为一致性 【结果分析】

面向对象程序设计方法具有抽象性、封装性、继承性和多态性等特点。将数据结构和算法臵于同一个类内,即为数据封装。同一消息为不同的对象接受时,产生的行为可能是不一样的,这称为多态性。(9)下面说法正确的是(AD)。

A.对象是计算机内存中的一块区域,它可以存放代码和数据

B.对象实际是功能相对独立的一段程序

C.各个对象间的数据可以共享是对象的一大优点 D.在面向对象的程序中,对象之间只能通过消息相互通信 【结果分析】

对象是计算机内存中的一块区域。在对象中,不但存有数据,而且存有代码,使得每个对象在功能上相互之间保持相对独立。对象之间存在各种联系,但它们之间只能通过消息进行通信。

四、判断题

(1)在高级程序设计语言中,一般用类来实现对象,类是具有相同属性和行为的一组对象的集合,它是创建对象的模板。(√)(2)C++语言只支持面向对象技术的抽象性、封装性、继承性等特性,而不支持多态性。(×)【结果分析】

C++语言不仅支持面向对象技术的抽象性、封装性、继承性等特性,而且支持多态性。

(3)面向对象程序设计中的消息应该包含“如何做”的信息。(×)【结果分析】

消息是面向对象程序设计用来描述对象之间通信的机制。向对象“发送消息”只需告诉对象做什么,对象根据这个消息决定如何做。

(4)一个消息只能产生特定的响应效果。(×)【结果分析】

当一个对象发出消息时,由于接收对象的类型可能不同,所以,它们可能做出不同的反应。这样,一个消息可以产生不同的响应效果,这种现象叫做多态。

(5)类的设计和类的继承机制实现了软件模块的可重用性。(√)

(6)C++语言和Java语言均不是一个纯正的面向对象的程序设计的语言。(×)【结果分析】

Java语言是一个纯正的面向对象的程序设计语言。(7)学习C++语言是学习面向对象的程序设计方法的唯一途径。(×)【结果分析】

程序设计方法是独立于具体程序设计语言的一种技术,学习C++语言是学习面向对象程序设计方法的重要途径之一。

(8)在C++语言中,类是支持数据封装的工具。(√)

五、简答题

(1)什么是结构化程序设计方法?它有哪些优点和缺点? 【问题解答】

结构化程序设计方法着眼于系统要实现的功能,从系统的输入输出出发,分析系统要做哪些事情,进而考虑如何做这些事情,自顶向下地对系统的功能进行分解,来建立系统的功能结构和相应的程序模块结构,有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。

随着程序规模与复杂性的增长,这种面向过程的结构化程序设计方法存在明显的不足之处。首先是数据安全性问题。由于数据被每个模块所共用,因此是不安全的,一旦出错,很难查明原因。其次是可

维护性及可重用性差。它把数据结构和算法分离为相互独立的实体,一旦数据结构需要改变时,常常要涉及整个程序,修改工作量极大并容易产生新的错误。每一种相对于老问题的新方法都要带来额外的开销。另外,图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。(2)什么是面向对象程序设计方法?它有哪些优点? 【问题解答】

面向对象的程序设计方法中,将程序设计为一组相互协作的对象而不是一组相互协作的函数。在程序中,属性用数据表示,用来描述对象静态特征; 行为用程序代码实现,用来描述对象动态特征。可见,在面向对象的程序设计方法中,对象是数据结构和算法的封装体。对象之间存在各种联系,它们之间通过消息进行通信。程序可表示为: 程序=对象+消息

在面向对象程序设计中应着重于类的设计。类正是面向对象语言的基本程序模块,通过类的设计来完成实体的建模任务。类通过一个简单的外部接口与外界发生关系。一个类中的操作不会处理到另一个类中的数据,这样程序模块的独立性、数据的安全性就有了良好的保障。程序的执行取决于事件发生的顺序,由顺序产生的消息来驱动程序的执行。不必预先确定消息产生的顺序,更符合客观世界的实际。并且面向对象程序设计方法提供了软件重用、解决大问题和复杂问题的有效途径,具有抽象性、封装性、继承性和多态性等特点。

(3)结构化程序设计方法与面向对象程序设计方法在对待数据结构和算法关系上有 什么不同? 【问题解答】

结构化程序设计方法中,把数据结构和算法分离为相互独立的实体; 而在面向对象程序设计中,数据结构和算法封装在一起,结合成一个独立的单位,即对象,并尽可能隐蔽对象的内部细节。对象的私有属性只能由这个对象的行为来读取和修改,与外部的联系通过公有行为充当外部接口。

第2章 从C到C++

一、名词解释

引用内联函数重载函数 【问题解答】

所谓引用就是给对象取一个别名,使用该别名可以存取该对象。换句话说是使新对象和原对象共用一个地址。

内联函数是使用inline关键字声明的函数。重载函数指在同一个作用域内名字相同而参数不同的函数。重载函数通常用来对具有相似行为而数据类型或数据个数不同的操作提供—个通用的名称。

二、填空题

(1)一般情况下,用C++语言编写的程序是由函数加上类组成的。

(2)C++有两种注释符号,一种是//,另一种是 /*……*/。

(3)使用C++风格的输入输出,在程序中必须包含头文件“iostream”。

(4)cin是预定义的标准输入流对象,>>是输入操作符,也称提取运算符。

(5)cout是预定义的标准输出流对象,<<是输出操作符,也称插入运算符。

(6)指针的值是它所指向那个对象的地址值。指针的类型是它所指向对象的类型。指针的内容便是它所指向对象的值。

(7)C++使用运算符 & 来定义一个引用,对引用的存取都是对它所引用的对象的存取。(8)当一个函数调用出现在函数定义之前时,必须先用函数原型对函数进行声明。

(9)C++有值传递和引用传递两种参数传递机制。

(10)使用关键字inline声明的函数称为内联函数。

(11)运算符new用于进行动态内存分配,运算符delete用于释放动态分配的内存。(12)下面程序的输出结果为x=10,y=10; x=100,y=100。#include using namespace std;int main(){int x=10,&y=x;cout<<“x=”<

int *p=&y;*p=100;

cout<<“x=”<

三、选择题(至少选一个,可以多选)(1)在整型指针变量p2、p3的定义中,错误的是(A)。

A.int p1,*p2,p3;B.int*p2,p1,*p3;C.int p1,*p2=&p1,*p3;D.int*p2,p1,*p3=&p1;【结果分析】

指针定义的具体格式如下所示: <类型> *<指针名1>,*<指针名2>,…;(2)若有定义“double xx=3.14,*pp=&xx; ”,则*pp等价于(C)。A.&xxB.*xxC.3.14D.xx 【结果分析】

pp指向xx所在的内存单元,这样*pp和xx等价。(3)下面对引用的描述中(C)是错误的。A.引用是某个变量或对象的别名 B.建立引用时,要对它初始化

C.对引用初始化可以使用任意类型的变量 D.引用与其代表的对象具有相同的地址 【结果分析】

所谓引用就是给对象取一个别名,使用该别名可以存取该对象,所以对引用初始化必须使用同类型的变量。

(4)函数没有返回值的时候,应该选择(A)的函数类型。

A.void B.int C.不确定 D.float(5)在函数的定义格式中,下面各组成部分中,(D)是可以省略的。

A.函数名 B.函数体 C.返回值类型 D.函数参数 【结果分析】

函数的定义可以缺省形式参数,此时称为无参函数。

(6)对重载的函数来说,下面叙述不正确的是(D)。

A.参数的类型不同 B.参数的顺序不同 C.参数的个数不同

D.参数的个数、类型、顺序都相同,但函数的返回值类型不同 【结果分析】

对重载的函数来说,编译系统将根据函数参数的类型和个数来判断使用哪一个函数,所以重载函数参数的个数、类型、顺序不能都相同。

(7)下列有关设臵函数参数默认值的描述中,(D)是正确的。

A.对设臵函数参数默认值的顺序没有任何规定 B.函数具有一个参数时不能设臵默认值 C.默认参数要设臵在函数的原型中,而不能设臵在函数的定义语句中

D.设臵默认参数可使用表达式,但表达式中不可用局部变量 【结果分析】

在C++中,在函数原型中可以为一个或多个参数指定默认值。对函数参数设臵默认值要注意以下几点。

◆若没有声明函数原型,参数的默认值可在函数定义的头部进行设臵,否则必须在函数原型中进行设臵。

◆在一个指定了默认值的参数右边不能出现没有指定默认值的参数。

◆设臵默认参数可使用表达式,但表达式中不可用局部变量。

(8)下面说法正确的是(BC)。A.所有的函数都可以说明为内联函数

B.具有循环语句、switch语句的函数不能说明为内联函数

C.使用内联函数,可以加快程序执行的速度,但会增加程序代码的大小

D.使用内联函数,可以减小程序代码大小,但使程序执行的速度减慢 【结果分析】

内联函数主要是解决程序的运行效率问题。在程序编译时,编译系统将程序中出现内联函数调用的地方用函数体进行替换,进而减少了程序运行的时间,但会增加程序代码的大小。它是以空间换取时间,因此内联函数适用于功能不太复杂,但要求被频繁调用的函数。

(9)一个函数功能不太复杂,但要求被频繁调用,应选用(A)。

A.内联函数 B.重载函数 C.递归函数 D.嵌套函数

(10)C++对C语言做了很多改进,下列描述中

使得C语言发生了质变,即从面向过程变成面向对象的是(D)。A.增加了一些新的运算符

B.允许函数重载,并允许设臵默认参数 C.规定函数说明必须用原型 D.引进了类和对象的概念 【结果分析】

面向对象=对象+类+继承+消息+多态

四、判断题

(1)C++程序中,不得使用没有定义或说明的变量。(√)

(2)使用const说明常量时,可以不必指出类型。(×)【结果分析】

如果用const 定义的是一个整型常量,则类型说明符int可以省略。

(3)引用被创建时可以用任意变量进行初始化。(×)【结果分析】

对引用初始化必须使用同类型的变量。

(4)一个返回引用的调用函数可以作为左值。(√)

(5)函数可以没有参数,也可以没有返回值。(√)

(6)没有参数的两个函数是不能重载的。(√)(7)函数可设臵默认参数,但不允许将一个函数的所有参数都设臵为默认参数。(×)【结果分析】

函数可设臵默认参数,且允许将一个函数的所有参数都设臵为默认参数。

(8)运算符new分配的空间由运算符delete释放。(√)

五、简答题

(1)名字空间的用途是什么? 【问题解答】

名字空间用来防止命名的冲突。(2)引用有何用处? 【问题解答】

除了独立引用外,在C++程序中,引用的主要用途是用作函数参数和函数的返回值。

(3)比较值调用和引用调用的相同点与不同点。【问题解答】

在值调用机制中,作为实参的表达式的值被复制到由对应的形参名所标识的一个对象中,作为形参的初始值。函数体对形参的访问、修改都是在这个标识对象上操作的,与实参无关,即数据的传递是单向的。

使用引用作函数的形参时,调用函数的实参要用变量名。实参传递给形参,相当于在被调用函数中使用了实参的别名。于是,在被调用函数中对形参的操作实质是对实参的直接操作,即数据的传递是双向的。

(4)内联函数有什么作用?它有哪些特点? 【问题解答】

内联函数是使用inline关键字声明的函数。在程序编译时,编译系统将程序中出现内联函数调用的地方用函数体进行替换,进而减少了程序运行的时间。

使用内联函数应注意以下几点。◆递归函数不能定义为内联函数。

◆内联函数一般适合于不含有switch和while等复杂的结构且只有1~5条语句的小函数,否则编译系统将该函数视为普通函数。

◆内联函数只能先定义后使用,否则编译系统也将该函数视为普通函数。

◆对内联函数也不能进行异常接口声明。(5)函数原型中的参数名与函数定义中的参数名以及函数调用中的参数名必须一致吗? 【问题解答】

不必一致。所有的参数是根据位臵和类型而不是名字来区分的。

(6)重载函数时通过什么来区分? 【问题解答】

编译系统将根据函数参数的类型和个数来判断使用哪一个函数。

六、程序分析题(写出程序的输出结果,并分析结果)

#include using namespace std;int main(){int num=50;int& ref=num;ref=ref+10;cout<<“num=”<

【输出结果】 num=60 ref=100 【问题分析】

本题主要考查引用的含义。【结果分析】

程序首先定义一个int类型的对象num,并给它赋初始值50。然后又定义了一个int类型的引用ref,并将它和num相联系。这样,无论是对num还是对ref进行操作,实际上都是对那个一开始放着50的物理单元的内容进行操作。

七、程序设计题

写出一个完整的C++程序,使用系统函数pow(x,y)计算xy的值,注意包含头文件cmath。【问题分析】

本题主要考查简单的输入输出和标准库函数的调用方法。【解题思路】

① 由于要用到系统函数pow(x,y),所以要包含头文件cmath。

② 要计算xy的值,首先必须知道x和y的值。为了程序的通用性,最好通过交互的方式输入x和y的值。【参考程序】 // xt2_1.cpp #include #include using namespace std;int main(){float x,y;

cout<<“please input 2 floats to x,y:”;cin>>x>>y;

float z=pow(x,y);

cout<<“pow(”<

please input 2 floats to x,y:3.1 2 pow(3.1,2)=9.61 第3章 类 与 对 象

一、填空题

(1)类定义中关键字private、public和protected以后的成员的访问权限分别是私有、公有和保护。如果没有使用关键字,则所有成员默认定义为private权限。具有public访问权限的数据成员才能被不属于该类的函数所直接访问。(2)定义成员函数时,运算符“∷”是作用域运算符,“MyClass∷”用于表明其后的成员函数是在“MyClass类”中说明的。

(3)在程序运行时,通过为对象分配内存来创建对象。在创建对象时,使用类作为样板,故称对象为类的实例。

(4)假定Dc是一个类,则执行“Dc a[10],b(2)”语句时,系统自动调用该类构造函数的次数为11。【结果分析】

创建10个数组元素需调用构造函数10次,创建对象b需调用构造函数1次,所以系统自动调用该类构造函数的总次数为11。

(5)对于任意一个类,析构函数的个数最多为1个。

(6)delete运算符通常用于实现释放该类对象中指针成员所指向的动态存储空间的任务。(7)C++程序的内存格局通常分为4个区: 数据区、代码区、栈区和堆区。

(8)数据定义为全局变量,破坏了数据的 封装性; 较好的解决办法是将所要共享的数据定义为类的 静态成员。

(9)静态数据成员和静态成员函数可由 任意访问权限许可的函数访问。

(10)友元函数和 友元类统称为友元。(11)友元的正确使用能提高程序的效率,但破坏了类的封装性和数据的隐蔽性。

(12)若需要把一个类A定义为一个类B的友元类,则应在类B的定义中加入一条语句: friend class A。

二、选择题(至少选一个,可以多选)(1)以下不属于类访问权限的是(B)。A.public B.staticC.protectedD.private 【结果分析】

类的访问权限有public、protected 和private。(2)有关类的说法不正确的是(BC)。A.类是一种用户自定义的数据类型

B.只有类的成员函数才能访问类的私有数据成员 C.在类中,如不做权限说明,所有的数据成员都是公有的

D.在类中,如不做权限说明,所有的数据成员都是私有的 【结果分析】

类是一种用户自定义的数据类型,类中成员均具有一种访问权限。关键字public、protected 和private以后的成员的访问权限分别是公有、保护和私有的,所有成员默认定义为private的。私有成员是被隐藏的数据,只有该类的成员函数或友元函数才可以访问它。

(3)在类定义的外部,可以被任意函数访问的成员有(C)。

A.所有类成员 B.private或protected的类成员

C.public的类成员 D.public或private的类成员 【结果分析】

类是一种用户自定义的数据类型,类中成员均具有一种访问权限。公有成员定义了类的外部接口。私有成员是被隐藏的数据,只有该类的成员函数或友元函数才可以引用它。保护成员具有公有成员和私有成员的双重性质,可以被该类或派生类的成员函数或友元函数引用。可见在类定义的外部,可以被任意函数访问的成员是public的类成员。(4)关于类和对象的说法(C)是错误的。A.对象是类的一个实例

B.任何一个对象只能属于一个具体的类 C.一个类只能有一个对象

D.类与对象的关系和数据类型与变量的关系相似 【结果分析】

C++语言的类就是一种用户自己定义的数据类型,类和对象的关系就相当于基本数据类型与它的变量的关系,所以任何一个对象只能属于一个具体的类,但一个类可以有多个对象。

(5)设MClass是一个类,dd是它的一个对象,pp是指向dd的指针,cc是dd的引用,则对成员的访问,对象dd可以通过(B)进行,指针pp可以通过(D)进行,引用cc可以通过(B)进行。

A.∷ B..C.& D.->

(6)关于成员函数的说法中不正确的是(C)。A.成员函数可以无返回值 B.成员函数可以重载 C.成员函数一定是内联函数 D.成员函数可以设定参数的默认值 【结果分析】

与普通函数不同的是,成员函数是属于某个类的。成员函数的实现,可以放在类体内,也可以放在类体外。在类体外实现的成员函数不再是内联函数。(7)下面对构造函数的不正确描述是(B)。A.系统可以提供默认的构造函数

B.构造函数可以有参数,所以也可以有返回值 C.构造函数可以重载 D.构造函数可以设臵默认参数 【结果分析】

构造函数不能指定返回类型,即使是void类型也不可以,当然不可能有返回值。

(8)假定A是一个类,那么执行语句“A a,b(3),*p; ”调用了(B)次构造函数。A.1

B.2

C.3 D.4 【结果分析】

声明指针是不会调用构造函数的。

(9)下面对析构函数的正确描述是(AC)。A.系统可以提供默认的析构函数 B.析构函数必须由用户定义 C.析构函数没有参数 D.析构函数可以设臵默认参数 【结果分析】

析构函数的作用是在对象消失时执行一项清理任务。如果一个类中没有定义析构函数,系统将自动生成一个默认析构函数。析构函数没有参数,当然不可能设臵默认参数。

(10)类的析构函数是(D)时被调用的。A.类创建 B.创建对象 C.引用对象 D.释放对象

(11)创建一个类的对象时,系统自动调用(B); 撤销对象时,系统自动调用(C)。

A.成员函数 B.构造函数 C.析构函数 D.复制构造函数

(12)通常拷贝构造函数的参数是(C)。A.某个对象名 B.某个对象的成员名

C.某个对象的引用名 D.某个对象的指针名

(13)关于this指针的说法正确的是(B)。

A.this指针必须显式说明B.当创建一个对象后,this指针就指向该对象

C.成员函数拥有this指针D.静态成员函数拥有this指针。【结果分析】

this指针是由C++编译器自动产生且较常用的一个隐含对象指针,它不能被显式声明。当创建一个对象时,this指针就初始化指向该对象。但只有非静态成员函数才拥有this指针,并通过该指针来处理对象。

(14)下列关于子对象的描述中,(B)是错误的。

A.子对象是类的一种数据成员,它是另一个类的对象

B.子对象可以是自身类的对象

C.对子对象的初始化要包含在该类的构造函数中 D.一个类中能含有多个子对象作其成员 【结果分析】

子对象不可以是自身类的对象。

(15)对new运算符的下列描述中,(B)是错误的。

A.它可以动态创建对象和对象数组 B.用它创建对象数组时必须指定初始值 C.用它创建对象时要调用构造函数

D.用它创建的对象数组可以使用运算符delete来一次释放 【结果分析】

使用运算符new创建对象数组的格式如下:

new <类型说明符> [<算术表达式>]

其中,<算术表达式>给出数组的大小,后面不能再跟构造函数参数,所以用它创建对象数组时不能指

定初始值。

(16)对delete运算符的下列描述中,(D)是错误的。

A.用它可以释放用new运算符创建的对象和对象数组

B.用它释放一个对象时,它作用于一个new所返回的指针

C.用它释放一个对象数组时,它作用的指针名前须加下标运算符[ ]

D.用它可一次释放用new运算符创建的多个对象 【结果分析】 用delete一次只能释放用new创建的1个对象,但可释放一个对象数组。

(17)关于静态数据成员,下面叙述不正确的是(C)。

A.使用静态数据成员,实际上是为了消除全局变量

B.可以使用“对象名.静态成员”或者“类名∷静态成员”来访问静态数据成员

C.静态数据成员只能在静态成员函数中引用 D.所有对象的静态数据成员占用同一内存单元 【结果分析】

静态数据成员可以在静态成员函数中引用,也可以在非静态成员函数中引用。

(18)对静态数据成员的不正确描述是(CD)。A.静态成员不属于对象,是类的共享成员 B.静态数据成员要在类外定义和初始化 C.调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this指针

D.只有静态成员函数可以操作静态数据成员 【结果分析】

this指针是一个局部量,局部于某个对象,而静态成员函数是属于整个类而不是某个对象,它没有this指针。静态成员函数和非静态成员函数均可操作静态数据成员。

(19)下面的选项中,静态成员函数不能直接访问的是(D)。

A.静态数据成员 B.静态成员函数

C.类以外的函数和数据 D.非静态数据成员 【结果分析】

由于静态成员函数没有this指针,它只能直接访问该类的静态数据成员、静态成员函数和类以外的函数和数据,访问类中的非静态数据成员必须通过参数传递方式得到对象名,然后通过对象名来访问。

(20)在类的定义中,引入友元的原因是(A)。A.提高效率 B.深化使用类的封装性

C.提高程序的可读性 D.提高数据的隐蔽性 【结果分析】

友元的作用主要是为了提高效率和方便编程,但友元破坏了类的封装性和隐蔽性,使用时要权衡利

弊。

(21)友元类的声明方法是(A)。

A.friend class<类名>; B.youyuan class<类名>;

C.class friend<类名>; D.friends class<类名>;

(22)下面对友元的错误描述是(D)。A.关键字friend用于声明友元

B.一个类中的成员函数可以是另一个类的友元 C.友元函数访问对象的成员不受访问特性影响 D.友元函数通过this指针访问对象成员 【结果分析】

友元函数是一个放在类中的普通函数,它没有this指针。

(23)下面选项中,(C)不是类的成员函数。A.构造函数 B.析构函数 C.友元函数 D.拷贝构造函数

三、简答题

(1)类与对象有什么关系? 【问题解答】

类是一种用户自己定义的数据类型,和其他数据类型不同的是,组成这种类型的不仅可以有数据,而且可以有对数据进行操作的函数。程序员可以使用这个新类型在程序中声明新的变量,具有类类型的变量称为对象。创建对象时,类被用做样板,对象称为类的实例。

(2)类定义的一般形式是什么?其成员有哪几种访问权限? 【问题解答】 定义类一般形式为:

class类名{ public:

<公有数据和函数>

protected:

<保护数据和函数>

private:

<私有数据和函数> };

访问权限共有3种: 分别是公有(public)、保护(protected)和私有(private)。

(3)类的实例化是指创建类的对象还是定义类? 【问题解答】 指创建类的对象。

(4)什么是this指针?它的主要作用是什么? 【问题解答】

this指针是C++语言为成员函数提供的一个隐含对象指针,它不能被显式声明。this指针是一个局部量,局部于某个对象。不同的对象调用同一个成员函数时,编译器根据this指针来确定应该引用哪一个对象的数据成员。

(5)什么叫做拷贝构造函数?拷贝构造函数何时被调用? 【问题解答】

拷贝构造函数是一种特殊的构造函数,它的作用是用一个已经存在的对象去初始化另一个对象。为了保证所引用的对象不被修改,通常把引用参数声明为const参数。

在以下3种情况下,拷贝构造函数都会被自动调用: ◆当用类的一个对象去初始化该类的另一个对象时;

◆当函数的形参是类的对象,进行形参和实参结合时;

◆当函数的返回值是类的对象,函数执行完成返回调用者时。

四、程序分析题(写出程序的输出结果,并分析结果)(1)

#include

using namespace std;

class Test { private: int num;

public:

Test();// 默认构造函数

Test(int n);// 带一个参数构造函数

};

Test∷Test()

{

cout<<“Init defa”<

Test∷Test(int n)

{

cout<<“Init”<<“ ”<

int main()

{

Test x[2];// 语句1

Test y(15);// 语句2

return 0;}

【输出结果】

Init defa

Init defa Init 15

【问题分析】

本题主要考查构造函数的调用时机和构造函数的匹配问题。【要点提示】

构造函数在创建对象时被自动调用,具体调用哪个构造函数将由编译系统根据重载函数的匹配原则来确定。【结果分析】

① 程序声明了2个对象x和y,类中有2个构造函数。

② 程序首先执行语句1,创建对象x,调用默认构造函数。由于对象x是对象数组,每个数组元素被创建时都要调用构造函数,所以默认构造函数被调用了2次,输出第1、2行结果。程序接着执行语句2,创建对象y,调用带一个参数的构造函数,输出第3行结果。(2)

#include

using namespace std;class Xx { private: int num;public:

Xx(int x){num=x;} // 构造函数

~Xx(){cout<<“dst ”<

};

int main()

{

Xx w(5);// 语句1

cout<<“Exit main”<

return 0;}

【输出结果】

Exit main dst 5

【问题分析】

本题主要考查析构函数的调用时机。【要点提示】

析构函数在释放对象时被自动调用。【结果分析】

① 程序声明了一个对象w。

② 程序首先执行语句1,创建对象w,调用构造函数,num得到初值5。程序接着执行语句2,输出第1行结果。当程序结束时,释放对象w,析构函数被调用,输出第2行结果。

(3)将例3.10中的Whole类如下修改,其他部分不变,写出输出结果。

class Whole { public:

Whole(int i);// Whole的有参构造函数

Whole(){};// Whole的无参构造函数

~Whole();// Whole的析构函数

private:

Part p1;// 子对象1

Part p2;// 子对象2

Part p3;// 子对象3 };

Whole∷Whole(int i):p2(i),p1(){

cout<<“Constructor of Whole”<

Whole∷~Whole()

{

cout<<“Destructor of Whole”<

【输出结果】

Default constructor of Part

Constructor of Part,3

Default constructor of Part

Constructor of Whole

Destructor of Whole

Destructor of Part,0

Destructor of Part,3

Destructor of Part,0

【问题分析】

本题主要考查子对象初始化的方法和含有子对象时构造函数和析构函数的调用顺序。【要点提示】

◆当建立X类的对象时,先调用子对象的构造函数,初始化子对象,然后才执行X类的构造函数,初始化X类中的其他成员。

◆对子对象构造函数的调用顺序取决于这些子对象在类中的说明顺序,与它们在成员初始化列表中给出的顺序无关。

◆如果X类的构造函数没有给出成员初始化列表,表明子对象将使用默认构造函数进行初始化。◆析构函数的调用顺序与构造函数的调用顺序正好相反。【结果分析】

程序的Whole类中出现了类Part的3个对象p1、p2和p3,作为该类的数据成员,则p1、p2和p3被称为子对象。当建立Whole类的对象w时,子对象p1、p2和p3被建立,相应的构造函数被执行。由于p1在Whole类中先说明,所以先执行它所使用的构造函数,即类Part的默认构造函数,接着p2执行它所使用的有参构造函数,紧接着初始化p3,由于Whole类构造函数的成员初始化列表中没有子对象p3进行初始化的选项,所以执行类Part的默认构造函数,当所有子对象被构造完之后,对象w的构造函数才被执行,从而得到前4行输出结果,而后4行是执行相应析构函数的输出结果。(4)

#include

using namespace std;

class Book { public:

Book(int w);

static int sumnum;

private:

int num;};

Book∷Book(int w)

{ num=w;

sumnum-=w;}

int Book∷sumnum=120;// 语句1

int main()

{

Book b1(20);// 语句2

Book b2(70);// 语句3

cout<

return 0;}

【输出结果】

【问题分析】

本题主要考查“在类的范围内所有对象共享静态成员的数据”的含义。【结果分析】

程序中语句1对静态成员sumnum进行初始化,sumnum得到初值120。执行语句2时,调用构造函数,sumnum变为100。接着语句3,再调用构造函数,sumnum变为30。

五、程序设计题

(1)声明一个Circle类,有数据成员radius(半

径)、成员函数area(),计算圆的面积,构造一个Circle的对象进行测试。【问题分析】

本题主要考查类定义的形式、对象成员访问和对象初始化的方法。要求理解类和构造函数的真正含义,特别注意如何将客观事物的属性和行为抽象为类的成员。【解题思路】

① 题目中已给出了类的基本部分,需要增加一个构造函数来初始化数据成员radius。

② 为了程序的通用性,圆的半径由键盘输入。【参考程序】

// xt3_1.cpp

#include

第四篇:《面向对象程序设计》教学大纲

《面向对象程序设计》教学大纲

课程名称:信息内容安全 课程代码:042504 总 学 时:64 学

分:2

课程类型:专业必修课 适用专业: 信息安全专业 制 订 人:徐雪飞 审 定 人:肖

文 制订日期:2015年3月

《面向对象程序设计》教学大纲

一、课程性质、目的和任务

C#语言是.NET平台上的核心开发语言,具有简单易学、类型安全、完全面向对象等特性,是一门面向现代软件工程的主流程序设计语言。本课程系统地介绍C#语言的结构化设计、面向对象、泛型、商业开发等功能要素,使学生在掌握程序设计的基本方法和技巧,培养利用计算机解决实际问题的能力,以满足专业课应用和继续学习的需要。

二、教学基本要求

通过学习本课程,要求学生能够熟悉C#语言的语法和类型系统,掌握面向对象程序设计和泛型程序设计的基本方法,并具有商业应用开发的基本能力,能灵活地使用C#语言及Visual Studio.NET开发环境解决一般性编程问题。

三、教学内容

1、绪论(教学2学时,上机2学时)

教学内容:

(1).NET技术和框架结构简介(2)C#语言概貌

(3)面向对象的基本概念

教学目的:使学生对.NET平台和C#有一个综合性的了解。

2、C#语法基础(教学6学时,上机4学时)

教学内容:(1)数据类型(2)值和方法(3)表达式(4)控制语句

教学目的:使学生基本掌握C#语言的类型系统和基本语法结构。

3、类和继承(教学4学时,上机4学时)

教学内容:

(1)类的数据成员和各种函数成员(2)继承和多态(3).NET常用类型(4)接口与实现

教学目的:使学生进一步掌握类型的定义和使用方法,掌握.NET类库中一些典型类的用法;深入理解继承和多态性的概念,从而掌握面向对象软件可重用性的关键技术。

4、Windows窗体界面(教学2学时,上机2学时)

教学内容:

(1)Windows Form编程技术(2)WPF编程技术

(3)绘图、动画和媒体 教学目的:使学生掌握Windows程序界面设计的基本要素,能够使用Windows Form和WPF编程技术开发交互式图形界面应用程序。

5、泛型(教学4学时,上机2学时)

教学内容:

(1)泛型的定义与使用(2)元组和可空类型的用法(3)泛型集合与循环遍历

(4)匿名方法和Lambda表达式

教学目的:使学生掌握泛型程序设计的基本概念,能够利用类型抽象和操作抽象开发出高可适的软件程序。

6、异常处理(教学1学时)

教学内容:

(1)C#异常处理结构

(2)主动引发异常和自定义异常

教学目的:使学生能够通过异常处理来提高程序可靠性。

7、文件操作(教学1学时,上机1学时)

教学内容:

(1)驱动器、目录和文件(2)文件流和数据流

教学目的:使学生掌握在C#程序中进行磁盘文件存取的基本技术。

8、数据库访问(教学2学时,上机1学时)

教学内容:

(1)ADO.NET联机数据访问(2)ADO.NET脱机数据访问

教学目的:使学生掌握C#程序中进行数据库存取的基本技术。

9、综合练习(教学2学时,上机8学时)教学内容:

(1)进程和线程

(2)ASP.NET网络程序设计

(3)采用案例驱动的方式,综合运用C#编程技术开发较为完整的软件程序。教学目的:提高学生软件设计的综合能力。

五、教学方法与手段

讲授法、讨论法、多媒体教学、实验教学。

六、考核方式

考试成绩占70%,平时成绩占30%。闭卷考试。

七、推荐教材和教学参考书

材:《C#程序设计基础》第3版,郑宇军,石海鹤,王卫红,清华大学出版社,2014年。参考书:

1、《C#应用开发与实践》,曾宪权、李梅莲 等,清华大学出版社,2015年

2、《C#编程实战宝典》,付强、丁宁 等,清华大学出版社,2014年。

第五篇:面向对象程序设计教学大纲

面向对象程序设计(专业限选课)Object-Oriented Programming 【课程编号】XZ26175 【学分数】3 【学时数】60=38+22

【课程类别】专业限选 【编写日期】2010.3.30 【先修课程】C语言程序设计、计算机应用基础

【适用专业】通信工程

一、教学目的、任务

通过学习,使学生深刻理解和领会面向对象的基本思想和基本特征,掌握面向对象程序设计语言C++语言的基本概念、基本语法以及面向对象程序设计的基本方法;使学生养成面向对象的编程思维习惯。

二、课程教学的基本要求

1.理解面向对象的基本概念和使用面向对象技术进行程序设计的基本思想 2.能比较熟练地用C++语言进行一般面向对象的程序设计

3.初步掌握面向对象编程环境Visual C++的使用

三、教学内容和学时分配(2 + 5 + 14 + 9 + 12 + 7 + 6 + 5 = 60)第一章 面向对象程序设计概述 2 学时(课堂讲授学时2)主要内容:

1.什么是面向对象程序设计 2.对象与类 3.封装 4.继承性 5.多态性

6.面向对象程序设计的语言 教学要求:

了解什么是面向对象程序设计;掌握对象和类的基本概念;理解面向对象程序设计的基本特征。其它教学环节:

安排课外了解面向对象程序设计方面的基本概念。第二章 C++概述 5学时(课堂讲授学时2+课程实验学时3)主要内容:

1.C++的起源和特点 2.C++源程序的构成

3.C++在非面向对象方面的一些特性 教学要求:

cin和cout的使用;new和delete的运算符的使用;函数的重载;带缺省参数的函数;引用; VC++的使用。其它教学环节:

实验1: C++程序设计基础练习。实验目的和要求:

1.掌握C++程序的基本格式和规范,学会编写简单的C++程序。2.掌握C++程序结构的特点。

3.熟悉C++程序基本的输入输出操作。

4.掌握C++数据类型常量和变量以及修饰符的使用方法。5.熟悉作用域运算符的功能和基本使用方法。6.掌握C++内存的动态分配和释放方法。7.理解引用的概念,掌握引用的使用方法。

第三章 类和对象 14学时(课堂讲授学时8+课程实验学时6)主要内容:

1.类与对象的基本概念 2.构造函数与析构函数 3.对象数组与对象指针 4.向函数传递对象 5.静态成员 6.友元

7.类对象作为成员 8.常类型 教学要求:

类的声明;对象定义;对象的成员的访问。访问属性的理解和运用;构造函数和析构函数的定义;对象数组的定义和使用;this的指针的理解和使用;类的成员类型为其他类时如何理解和使用;静态成员的理解和运用。提供友元机制的目的;友元声明方法;提供常类型机制的目的;各种不同的常类型运作方式。其它教学环节:

实验2:类和对象。实验目的和要求:

1.掌握类、类的数据成员、类的成员函数的定义方式。2.理解类成员的访问控制方式。

3.掌握对象的定义和操作对象的方法。

4.理解构造函数和析构函数的定义与执行过程。5.掌握重载构造函数的方法。6.了解拷贝构造函数的方法。实验3:对象数组和对象指针。实验目的和要求:

1.掌握对象数组的定义和使用方法。

2.理解对象指针的概念,学会用指针引用对象。3.了解this指针的工作方式。

4.掌握静态数据成员和静态成员函数的基本使用方法。5.理解友元与友元函数的作用,掌握其使用方法。

第四章 派生类和继承 9学时(课堂讲授学时6+课程实验学时3)主要内容:

1.派生类的概念

2.派生类的构造函数和析构函数 3.基类成员的访问 4.多重继承 5.赋值兼容规则 教学要求:

基类和派生类的基本概念;继承成员的访问规则;派生类构造函数和析构函数的运行规则;多重继承的基本概念;多重继承中同名二义性如何消除;引入虚基类的目的;继承类和派生类之间相互赋值规则用。

其它教学环节:

实验4:派生类与继承。实验目的和要求:

1.理解类的继承的概念,能够定义和使用类的继承关系。2.掌握派生类的声明和定义方法。

3.掌握公有派生和私有派生的访问特性。4.学习虚基类在解决问题中的作用。

第五章 多态性 12学时(课堂讲授学时8+课程实验学时4)主要内容:

1.编译时的多态性与运行时的多态性 2.函数重载 3.运算符重载 4.类型转换 5.虚函数 教学要求:

多态的基本概念;实现运算符重载的方法(成员函数);实现运算符重载的方法(友元函数);静态联编和动态联编的基本概念;虚函数的作用;虚函数的运用。其它教学环节:

实验5:虚函数和多态性。实验目的和要求:

1.理解编译时的多态性和运行时的多态性。2.掌握运算符重载的基本方法。3.掌握虚函数的定义和使用方法。

第六章 模板 7学时(课堂讲授学时4+课程实验学时3)主要内容:

1.模板的概念

2.函数模板与模板函数 3.类模板和模板类 教学要求:

模板的基本概念;为什么要使用模板;函数模板和模板函数的基本概念;函数模板的声明和使用;类模板和模板类的基本概念。其它教学环节:

实验6:函数模板与类模板。实验目的和要求:

1.掌握函数模板及其声明方法。2.掌握模板函数及其生成方法。3.学习类模板的声明与使用方法。

第七章 C++的I/O流类库 6学时(课堂讲授学时3+课程实验学时3)主要内容:

1.C++建立类类库的目的 2.预定义类型的输入输出

3.用户自定义类型的输入和输出 教学要求:

掌握在各种情况下的<<和>>运算符的重载。其它教学环节:

实验7:I/O流类库。实验目的和要求:

1.掌握流及流类库的作用。

2.掌握流类库中常用的类及其成员函数的使用方法。3.掌握重载“<<”和“>>”的方法。

4.掌握控制输出宽度的函数width和setw。

5.掌握函数setosflags和resetiosflags设置和恢复对齐方式、精度、大小写等。

研究教学内容 5学时(课程讲解和讨论学时)

程序综合设计:按照面向对象程序开发的原则和方法,利用一个实例来讲解面向对象程序设计的整个过程,然后要求学生根据自己的开发经验进行分组讨论,从而帮助学生进一步理解和熟悉面向对象程序设计方法。

四、教学重点、难点及教学方法

重点:类和对象的基本概念;对象定义;对象的成员的访问。访问属性的理解和运用;构造函数和析构函数的定义;对象数组的定义和使用;this的指针的理解和使用。基类和派生类的基本概念;继承成员的访问规则;派生类构造函数和析构函数的运行规则。多态的基本概念;函数的重载。

难点:多重继承;虚函数;模板。

教学方法:课堂授课采用多媒体教学和分组讨论的方法,实验采用任务驱动方式。通过未来愿景描述和学以致用的方法来提高学生的学习兴趣,通过分组交流和师生积极互动的方式提高学生学习本门课程的学习能力。

五、考核方式及成绩评定方式:考试

六、教材及参考书目

推荐教材:

[1] 《C++面向对象程序设计》,陈维兴,林小茶,清华大学出版社,第2版,2004 参考书:

[1] 《C++面向对象程序设计习题解析与上机指导》,陈维兴,清华大学出版社,2003 [2] 《C++程序设计基础》,周霭如,电子工业出版社,2003 [3] 《C++语言程序设计》,郑莉,清华大学出版社,2005 修(制)订人: 审核人:

2010年 3 月30

下载面向对象程序设计教程 (马石安版)word格式文档
下载面向对象程序设计教程 (马石安版).doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    《面向对象程序设计》教学大纲

    《面向对象程序设计》教学大纲 课程名称:面向对象程序设计 英文名称:Object Oriented Programming) 学分:2 总学时:36 实验(上机)学时: 8 开课专业:电子商务专业 一、 本课程的性质......

    面向对象程序设计心得体会

    这次课程设计让我收获到很多,上个学期我们也有过课程设计,但是我们都是从网上下一个程序,连带着报告,看一遍程序,修改修改报告,然后就直接去答辩,都是糊弄糊弄就过去了,自己根本就没......

    面向对象程序设计实习报告

    《面向对象程序设计》实习报告 班级:电子商务 学号:xx 姓名xx 指导教师: 实习时间:2011.12.26-2012.1.6 一、 实习目的 经过两个周的面向对象程序设计的实习,让我再次复习了SQL......

    面向对象程序设计实习报告

    《面向对象程序设计》 实习报告 学 年:20010-2011学年第一学期 试验名称:面向对象程序设计 姓 名:李 芳班 级:电子商务(本)0902班 学 号:0902110206 一、 实习目的 1.了解SQL Server......

    java面向对象程序设计教案

    武汉大学珞珈学院 系/教研室 Java 面 向 对 象 程 序 设 计 课 教 案 主讲教师:熊春秀 编写时间:2011-4-30 第一章:概述 第 1、2 节:面向对象的基本概念、面向对象程序设计概述......

    《面向对象程序设计》课程教学大纲

    《面向对象程序设计》课程教学大纲学时:72 学分:4 理论学时:52 实验学时:20 面向专业:计算机科学与技术、专升本 课程代码:2700410 先开课程:计算机导论,C语言程序设计 课程性......

    面向对象程序设计-教学大纲-信管

    面向对象程序设计(教学大纲) Object-oriented programming 课程编码:05405170 学分:2.5 课程类别: 专业基础课 计划学时:48 其中讲课:32 实验或实践: 上机:16 适用专业:信息管理与信......

    Java面向对象程序设计教学大纲

    Java面向对象程序设计课程教学大纲 Object-Oriented Programming with Java Syllabus 课程名称 课程类别 建设单位/教研室 前后课程 适用专业、层次 Java面向对象程序设课......