C面向对象程序设计课后答案解析.docx

上传人:b****3 文档编号:27083329 上传时间:2023-06-26 格式:DOCX 页数:15 大小:19.59KB
下载 相关 举报
C面向对象程序设计课后答案解析.docx_第1页
第1页 / 共15页
C面向对象程序设计课后答案解析.docx_第2页
第2页 / 共15页
C面向对象程序设计课后答案解析.docx_第3页
第3页 / 共15页
C面向对象程序设计课后答案解析.docx_第4页
第4页 / 共15页
C面向对象程序设计课后答案解析.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

C面向对象程序设计课后答案解析.docx

《C面向对象程序设计课后答案解析.docx》由会员分享,可在线阅读,更多相关《C面向对象程序设计课后答案解析.docx(15页珍藏版)》请在冰豆网上搜索。

C面向对象程序设计课后答案解析.docx

C面向对象程序设计课后答案解析

习题1

1-1面向对象程序设计与面向过程程序设计相比有什么优点?

答:

优点有:

(1)写程序不再是从计算机的角度考虑问题,而是站在人类思维的角度;

(2)程序的可拓展性比其他不是面向对象的好;

(3)能最大限度波爱护已有程序的代码。

1-2简述C++语言程序的特点。

答:

C++语言是在C语言的基础上发展而来,但它比C语言更容易学习和掌握,它与C的最大区别是把函数放进了结构中,并引入了新的关键词类。

C++完美的体现了面向对象的各种特性。

1-3C++与C语言的关系如何?

它们的本质区别是什么?

答:

C++语言是基于C语言的基础上发展起来的。

它们的关系十分密切,很多语句之间是通用的。

它们的本质区别是C语言是面向过程的编程语言,而C++是面向对象的编程语言。

 

1-3组件编程有什么优点?

答:

组件编程的优点是它把对象技术应用于系统设计,对面向对象的程序设计的实现过程做了进一步抽象。

它强调真正的软件可重用性和高度的互操作性。

习题2

2-1结构与联合有何区别?

答:

联合是有别于以前任何一种数据类型的特殊数据类型,它是多个成员的一个组合体,但与结构体不同,联合体的成员被分配在同一段内存空间中,它们的开始地址相同,使得同一段内存由不同的变量共享。

2-2struct和class区别是什么?

答:

C++中,struct和class基本是一直的,唯一不同在于,struct中缺省权限public,class缺省权限private,即在struct和class没有写public时,struct默认为public,class默认为private。

2-3什么是内联函数?

内联函数的优点是什么?

答:

C++提供一种提高效率的方法,即变异时将调用函数的代码直接嵌入到主函数中,而不是将流程转出去,这种嵌入到主函数的函数叫内联函数。

使用内联函数可以节省运行时间,提高函数的执行效率。

2-4什么是函数重载?

编译系统如何区别同名函数的不同版本?

答:

C++允许用同一函数名定义多个函数,这函数的参数个数和参数类型不同,这就是函数的重载。

在编译时,编译系统会根据同名函数的参数不同等对名字做处理。

2-5什么是“引用”?

申明和使用“引用”要注意哪些?

答;引用就是某一变量的一个别名,对引用的操作与对变量直接操作是完全一样。

申明和使用引用要注意:

(1)不同有NULL引用,引用必须与合法的存储单元关联;

(2)引用被创建的同时,必须初始化;(3)一旦引用被初始化,就不能改变引用关系,但指定对象其内容可以改变。

2—7简述C++函数3种调用的方式实现机制,特点及其实参,形参格式。

答:

在C++中,有按值传递,地址传递,引用传递3种的函数调用方式,按值传递的过程为:

首先计算出实参表达式值,给对应的形参变量分配一个存储空间,该空间大小等于形参类型,然后把求出的实参的值一一存入形参变量的存储空间中,成为形参变量的初值。

种种传递是把实参表达式的值传递给对应的形参变量,使用这种方式,调用函数不对实参进行操作。

而抵制传世是如果函数定义时将形参说明成指针,对这样的函数进行调用时需要指定地址形式的实参。

2-8写出下面程序的输出

Union

{inti;

charx[2];

}a;

Voidmain(0

{a.x[0]=10;

a.x[1]=1;

printf(“%d”,a.i);

}

答:

输出是266

2-10写出下面程序的输出

structA

{chart:

4;

Chark:

4;

Unsignedshorti:

8;

Unsignedlongm;

};

Main(0

{structAa;

a.t=’b’;

printf(“%x”,a.t);

}

答:

输出是2

 

习题3

3-1Newdelete与mallocfree的联系与区别是什么?

答;在程序开发中的内存的动态分配与管理是一个让开发者头痛的问题,在C中,一般通过malloc和free来进行内存分配和回收,而在C++中,new和delete已经完全包含malloc和free的功能,并且更为强大。

它们的区别是malloc和free是库函数而不是运算符,不在编译器控制权限之内,而new和delete是运算符。

New出来的指针式直接带类型信息,而malloc返回是void指针。

3-2描述内存分配以及它们的区别。

答:

内存分配的“堆”和“栈”。

主要区别是:

(1)管理方式和碎片问题:

对于栈来说,由编译器自动管理;对于堆来说,释放工作由程序员控制,容易产生内存碎片。

(2)分配效率:

栈的效率要比堆的高得多;(3):

增长方式不同:

栈内存是从高地址到低地址增长,而堆是相反的;(4)空间大小的不同:

一般来讲,在32位系统下,内存可以达到4GB空间,但对于栈来讲,一般都是有一定的空间大小的。

3-3请定义一个变量,初始化为34759,并以八进制与十六进制输出。

如果将该整数定义成无符号短整数,当以有有符号数输出时,结果是什么?

答;程序如下:

#include

usingnamespacestd;

voidmain()

{inti=34759;

cout<

cout<

}

输出结果是10370787C7

3-4写一个C++程序,使用cout输出提示信息,向用户询问一个矩形的长和宽,都使用cin从键盘接收用户的输入信息,并输出矩形的周长和面积。

答:

程序如下:

#include

usingnamespacestd;

voidmain()

{inta,b,c,s;

cout<<”输出矩形的长和宽“<

cin>>a>>b;

c=(a+b)*2;

s=a*b;

cout”<<“周长是“<

}

3-6分析程序,写出运行结果

intmain(void)

{try

{printf(“try:

1\n”);

throw1;

}

catch(inti)

{printf(“catchtry:

1int:

%d\n”,i);

}

catch(doubled)

{

printf(“catdhtry:

1double%f\n”,d);

}

try

{

printf(“try:

2\n”);

throw1.2;

}

catch(inti)

{

printf(“catchtry:

2int:

%d\n”,i);

}

catch(doubled)

{

printf(“catchtry:

2double:

%f\n”,d);

}

return0;

}

答:

运行结果是

try:

1

catchtry:

1int:

1

try:

2

catchtry:

2double:

1.200000

习题4

4-1什么是类?

什么是对象?

对象和类是什么关系?

答:

类(Class)实际上是对某种类类型的对对象定义变量和方法的原型。

它表示对现实生活中一类具有共同特征的事物的抽象,是面向对象编程的基础。

一个类定义了一组对象。

类具有行为,它描述一个对象能够做什么以及做的方法。

对象是具有类类型的变量。

它们的关系是类是对象的抽象,而对象是类的具体实例。

类是抽象的,不占用内存,而对象是具体的,占用存储空间。

类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板

4-2面向对象程序设计中类之间的关系主要有哪两种?

答;主要有is-a和has-a的关系

4-3一个类的各数据成员的构造顺序是什么?

类的对象成员与类的一般数据成员的构造顺序是什么?

构造顺序与析构顺序的关系是什么?

答:

按它们在类出现的先后顺序进行,先定义者先构造;先构造类的对象成员,再构造一般数据成员;二者顺序相反,先构造者后析构。

4-4复制构造函数的作用是什么?

答:

复制构造函数是一种特殊的构造函数,具有一般构造函数的所有特性。

它创建一个新的对象,作为另一个对象的拷贝。

4-7分析程序,写出运行结果。

#include

usingnamespacestd;

classBC

{

public:

BC(){sBC=newchar[3];cout<<"BCallocates3bytes.inBC()\n";}

~BC(){delete[]sBC;cout<<"BCfree3bytes.\nin~BC()";}

private:

char*sBC;

};

classDC:

publicBC

{

public:

DC(){sDC=newchar[5];cout<<"DCallocates5bytes.inDC()\n";}

~DC(){delete[]sDC;cout<<"DCfree5bytes.inDC()\n";}

private:

char*sDC;

};

intmain()

{

DCd;

cout<<"thisisatest."<

return0;

}

答:

运行结果如下:

BCallocates3bytes.inBC()

DCallocates5bytes.inDC()

thisisatest

DCfree5bytes.inDC()

BCfree3bytes.

in~BC()

4-8分析下列程序的输出结果

#include

usingnamespacestd;

classTest

{

public:

Test(intn=1){val=n;cout<<"Con."<

Test(constTest&t){val=t.val;cout<<"Copycon."<

Test&operator=(Test&t)

{

val=t.val;

cout<<"Assignment."<

return*this;

}

private:

intval;

};

voidfun1(Testt){}

Testfun2()

{

Testt;

returnt;

}

voidmain()

{

Testt1

(1);

Testt2=t1;

Testt3;

t3=t1;

fun1(t2);

t3=fun2();

}

答:

运行结果为

Con.

Copycon.

Con.

Assignment

Copycon.

Con.

Copycon.

Assignment

 

4-14设计一个点类Point,求两个点直接的距离

答:

程序如下

#include

#include

usingnamespacestd;

classpoint

{

public:

voidDistance(intx1,inty1,intx2,inty2);

voidOutput();

private:

floatdistance;

};

intmain()

{

intd1,d2,d3,d4;

pointdis;

cout<<"请输入第一个点的坐标"<

cin>>d1>>d2;

cout<<"请输入第二点的坐标"<

cin>>d3>>d4;

dis.Distance(d1,d2,d3,d4);

dis.Output();

return0;

}

voidpoint:

:

Distance(intx1,inty1,intx2,inty2)

{

floatlength;

length=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

distance=length;

}

voidpoint:

:

Output()

{

cout<<"两点距离是"<

}

4-15定义一个Circle类,计算圆的周长和面积。

答:

程序如下

classcircle

{

doublerd;//半径成员

public:

circle()

{

rd=0.0;

}//构造函数

circle(doubleb)

{

rd=b;

}//重构构造函数

doublezc()

{

return2*pi*rd;

}

doublemj()

{

returnpi*rd*rd;

}

}

习题5

5-1重载(overload)和覆盖(overried)的区别

答:

重载与覆盖的区别:

1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系。

2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。

3、覆盖要求参数列表相同;重载要求参数列表不同。

4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。

5-2分析程序,写出运行结果

classA

{

public:

virtualvoidact1();

voidact2(){act1();}

};

voidA:

:

act1()

{

cout<<"A:

:

act1()called."<

}

classB:

publicA

{

public:

voidact1();

};

voidB:

:

act1()

{

cout<<"B:

:

act1()called."<

}

voidmain()

{

Bb;

b.act2();

}

答:

运行结果为:

B:

act()called.

5-4分析程序,写出运行结果

classA

{

inta;

public:

A(inti){a=i;cout<<"A="<

virtualvoidfunc(){cout<<"A:

:

func"<

virtual~A(){cout<<"~A="<

};

classB:

publicA

{

intb;

public:

B(inti,intj):

A(i){b=j;cout<<"B="<

virtualvoidfunc(){cout<<"B:

:

func"<

~B(){cout<<"~BB"<

};

voidmain()

{

A*pa=newA(8);

deletepa;

A*pb=newB(6,9);

pb->func();

deletepb;

}

答:

运行结果如下

A=8

~A=8

A=6

B=9

B:

:

func

~BB9

~A=6

5-6多重继承的内存分配问题:

比如有classA:

publicclassB,publicclassC{}那么A的内存结构大致是怎么样?

答:

这个是compiler-dependent的,不同的实现其细节可能不同。

如果不考虑有虚函数、虚继承的话就相当简单,否则的话,相当复杂。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1