《C面向对象程序设计习题解答.doc》由会员分享,可在线阅读,更多相关《C面向对象程序设计习题解答.doc(15页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第1章 面向对象的方法学1什么是面向对象方法学?解:面向对象方法学就是尽量模拟人类习惯的思维方式,使软件开发的方法与过程尽可能接近人类认识世界、解决问题的方法与过程,从而使描述问题的问题空间(即问题域)与实现解法的解空间(即求解域)在结构上尽可能一致。2什么是对象?它与传统的数据有何关系?有什么不同?解:对象是封装了数据结构及可以施加在这些数据结构上的操作的封装体。它与传统数据有本质的不同,传统数据是被动地等待对它进行处理,对象是进行处理的主体。3什么是封装性和继承性?解:封装是面向对象方法的一个重要特点,即将对象的属性和行为封装在对象的内部,形成一个独立的单位,并尽可能隐蔽对象的内部细节。继
2、承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。4什么是多态性?解:多态性是面向对象方法的重要特征。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。5试写出学生管理系统中所涉及的类(属性和方法)。学生管理系统中学生信息有:姓名、学号、年龄、成绩;学生管理系统完成学生信息输入、学生信息输出、插入学生信息、删除学生信息、查找学生信息。解:class Studentprivate: char cName12;/姓名long lNum;/学号 int age; /年龄 float fGrade;/成绩public: void Input();/输入学生信息 void
3、Print();/输出学生信息 void Insert();/插入学生信息 void Del(); /删除学生信息 void Find(); /查找学生信息;6目前常用的面向对象程序设计语言有哪些?各有哪些特点?解:Visual C+6.0支持面向对象编程、可视化、模块化、代码可重用和组件共享等技术,可以大大提高软件系统的设计、管理和开发速度。Java语言是一种通用、并发、基于类的面向对象程序设计语言。Java语言具有简捷性、面向对象、分布式、健壮性、安全性、可移植性、解释型、高性能、多线程、动态性等特点。C#(读做“C sharp”)是微软公司发布的一种面向对象的、运行于.NET Frame
4、work之上的高级程序设计语言。C#集C语言的简洁强大、C+的面向对象、VB的图形化设计方法、Java的编译与执行机制等优点于一身。C#是创新性的新式编程语言,它巧妙地结合了最常用的行业语言和研究语言中的功能,并引入了多种潜在的新功能,提高了开发人员在语言构造方面的效率,将快速的应用程序开发与对底层平台各种功能的访问紧密结合在一起,使得程序员能够在.NET平台上快速开发各种应用程序。7C+支持多态性主要表现在哪些方面?解:C+支持两种多态性,即编译时的多态性和运行时的多态性。编译时的多态性是通过重载来实现的,运行时的多态性是通过虚函数来实现的。思考题1设计一个栈类,实现的操作有初始化栈、入栈、
5、出栈、判栈空。解:class Stackprivate: int top; int s100;public: void Ini_Stack(); /初始化栈 void Push_Stack(); /入栈 void Pop_Stack(); /出栈 void Empty(); /判栈空;2设计一个队列类,实现的操作有初始化队列、入队、出队、判队空。解:class Queueprivate: int front,rear; int que100;public: void Ini_Queue(); /初始化队列 void In_Queue(); /入队 void Out_Queue(); /出队 v
6、oid Empty(); /判队空;第2章 类 与 对 象1构造函数和析构函数的主要作用是什么?解:构造函数的功能是在创建对象时,给数据成员赋初值,即对象的初始化。析构函数的功能是释放一个对象,在对象删除之前,用它来做一些内存释放等清理工作。2什么是this指针?它的主要作用是什么?解:this指针称为自引用指针。每当对象调用成员函数时,系统就将该对象的地址赋给this指针,这时C+编译器将根据this指针所指向的对象来确定应该引用哪一个对象的数据成员。3什么是友元函数?解:友元函数不是当前类中的成员函数,它可以是一个不属于任何一个类的一般函数(即非成员函数),也可以是另外一个类的成员函数。4
7、什么是静态数据成员?静态数据成员的定义和初始化方法是什么?解:类的静态数据成员拥有一块单独的存储区,不管用户创建了多少个该类的对象,所有这些对象的静态数据成员都共享这一块静态存储空间,是这些对象互相通信的一种方法。静态数据成员的定义格式:static 类型名 静态成员名;静态数据成员的初始化格式:类型 类名静态数据成员= 初始化值;5关于构造函数的叙述正确的是( B )。 A构造函数可以有返回值B构造函数的名字必须与类名完全相同 C构造函数必须带有参数D构造函数必须定义,不能默认6关于析构函数特征描述正确的是( C )。 A一个类中可以有多个析构函数B析构函数名与类名完全相同 C析构函数不能指
8、定返回类型D析构函数可以有一个或多个参数7构造函数是在( B )时被执行的。 A程序编译B创建对象C创建类D程序装入内存8定义A是一个类,那么执行语句“A a, b(3),*p;”调用了( A )次构造函数。 A2B3C4D59在下列函数原型中,可以作为类Base析构函数的是( B )。 AvoidBaseBBase( )CBase( )const DBase( )10this指针是C+实现( B )的一种机制。 A抽象B封装C继承D重载11已知类中的一个成员函数说明为:void Set (X &a)其中,X &a的含义是( C )。 A指向类X的指针为aB将a 的地址赋给变量 Ca是类X的对
9、象引用,用来作为Set( )的形参 D变量X与a按位与作为函数Set( )的形参12下面关于友元函数的描述中,正确的说法是( A )。 A友元函数是独立于当前类的外部函数 B一个友元函数不能同时定义为两个类的友元函数 C友元函数必须在类的外部定义 D在外部定义友元函数时,必须加关键字friend13一个类的友元函数能够访问该类的( D )。 A私有成员B保护成员C公有成员D所有成员14友元的作用之一是( A )。 A提高程序的运行效率B加强类的封装性 C实现数据的隐藏性D增强成员函数的种类15n=1516s=1017Constructing10Destructing20Destructing思
10、考题1定义一个学生类,学生信息有学号、姓名和成绩。成绩包括计算机、英语、数学成绩和平均分。要求利用队列实现学生的入队、出队和显示等功能。const int MAXSIZE=5; /queue.hstruct datatypelong no;char name10;float score;class Studentprivate:datatype dataMAXSIZE;int front,rear;int num;public:Student();int In_SeQueue(datatype x);int Out_SeQueue();void Print_SeQueue();/ queue.
11、cpp#include iostreamusing namespace std;#include queue.hint _tmain(int argc, _TCHAR* argv)Student sq;int i;for (i=1;i=3;i+)datatype stu;coutinput no,name,scorestu.no stu.name stu.score ;sq.In_SeQueue (stu);coutPrint_SeQueueendl;sq.Print_SeQueue ();sq.Out_SeQueue ();coutAfter Out_SeQueue 0;number-,i=
12、(i+1)%MAXSIZE)coutdatai.no datai.name datai.score endl;2定义一个图书类,图书信息有图书名称、作者、出版社、价格。要求利用栈实现图书的入库、出库和显示等功能。const int MAXSIZE=5; / stack.hstruct datatypechar name10,author10,publish20;float price;class Stackprivate:datatype dataMAXSIZE;int top;public:Stack();int Push_SeqStack(datatype x);int Pop_SeqSt
13、ack();void Print_SeqStack();/ stack.cpp#include iostreamusing namespace std;#include stack.hint _tmain(int argc, _TCHAR* argv)Stack sq;int i;for (i=1;i=3;i+)datatype b;coutinput name,author,publish,priceb.name b.author b.publish b.price ;sq.Push_SeqStack(b);coutPrint_SeqStackendl;sq.Print_SeqStack()
14、;sq.Pop_SeqStack ();coutAfter Popendl;sq.Print_SeqStack();return 0;Stack:Stack()top=-1;int Stack:Push_SeqStack(datatype x)if(top=MAXSIZE-1)return(0);elsetop+;datatop=x;return(1);int Stack:Pop_SeqStack()if(top=-1)return 0;elsetop-;return 1;void Stack:Print_SeqStack()int i;for(i=0;i=top;i+)coutdatai.n
15、ame datai.author datai.publish datai.priceendl;3有Distance类和Point类,将Distance类定义为Point类的友元类来实现计算两点之间距离。/ point.hclass Distance;class Pointpublic:Point(int xx=0,int yy=0)X=xx;Y=yy;friend class Distance;private:int X,Y;class Distancepublic:float fDist(Point a,Point b);/point.cpp#includeiostream#includem
16、ath.husing namespace std;#includepoint.h#include math.hint _tmain(int argc, _TCHAR* argv) Point myp1(1,1),myp2(4,5);Distance d;coutThe distance is: ;coutd.fDist(myp1,myp2)endl; return 0;float Distance:fDist(Point p1,Point p2)double x,y;x=p1.X -p2.X ;y=p1.Y -p2.Y ;return float(sqrt(x*x+y*y);第3章 函数重载与
17、内联函数1为什么要进行函数重载?解:当函数实现的是同一类功能,只是部分细节不同(如参数的个数或参数类型不同)时,利用函数重载机制可以将这些函数取成相同的名字,从而使程序易于阅读和理解,方便记忆和使用。2什么是内联函数?解:内联函数是一个函数,它与一般函数的区别是在使用时可以像宏一样展开,所以没有函数调用的开销。因此,使用内联函数可以提高系统的执行效率。3函数重载的意义主要在于( A )。 A使用方便,提高可读性B提高执行效率 C减少存储空间开销D提高程序可靠性4下面关于重载函数的说法中正确的是( C )。 A重载函数一定具有不同的返回值类型B重载函数形参个数一定不同 C重载函数一定有不同的形参
18、列表 D重载函数名可以不同5一个函数功能不太复杂,但要求被频繁调用,选用( A )。 A内联函数B重载函数C递归函数D嵌套函数6将函数声明为内联函数的关键字是( C )。 AregisterBstaticCinlineDextern7在内联函数内允许使用的是( C )。 A循环语句B开关语句C赋值语句D以上都允许8在C+中,下列关于参数默认值的描述中正确的是( C )。 A设置参数默认值时,应当全部设置 B设置参数默认值后,调用函数不能再对参数赋值 C设置参数默认值时,应当从右向左设置 D只能在函数定义时设置参数默认值9741013思考题1 利用重载求两个整数、三个整数和四个整数的最小值。#i
19、nclude iostreamusing namespace std;int Min(int x1,int x2);int Min(int x1,int x2,int x3);int Min(int x1,int x2,int x3,int x4);int main()int x1,x2,x3,x4;coutinput x1,x2,x3,x4x1x2x3x4;coutMin(x1,x2)endl;coutMin(x2,x3,x4)endl;coutMin(x1,x2,x3,x4)endl;return 0;int Min(int x1,int x2)return (x1x2 ? x1:x2);
20、int Min(int x1,int x2,int x3)int y;y=x1x2 ? x1:x2;return (yx3 ? y:x3);int Min(int x1,int x2,int x3,int x4)int y1,y2;y1=x1x2 ? x1:x2;y2=x3x4 ? x3:x4;return (y1y2 ? y1:y2);2利用重载计算长方形、正方形、圆、梯形的面积和体积。#include iostreamusing namespace std;float Area(float x,float y);float Area(float x);float Area(float r,
21、const double pi);float Area(float a,float b,float h);float Volumn(float a,float b,float h);float Volumn(float a);float Volumn(float r,const float pi);float Volumn(float a,float b,float a1,float b1,float h);int main()float x,y,z,x1,y1;const float PI=3.14;cout-计算面积-endl;cout输入长、宽xy;cout长方形的面积是:Area(x,
22、y)endl;cout输入边长x;cout正方形的面积是:Area(x)endl;cout输入半径x;cout圆的面积是:Area(x,PI)endl;cout输入上底、下底及高xyz;cout梯形的面积是:Area(x,y,z)endl;cout-计算体积-endl;cout输入长、宽和高xyz;cout长方形的体积是:Volumn(x,y,z)endl;cout输入边长x;cout正方形的体积是:Volumn(x)endl;cout输入半径x;cout圆的体积是:Volumn(x,PI)endl;cout输入上底边长a、b,下底边长a1、b1,以及高xyx1y1z;cout梯形的体积是:V
23、olumn(x,y,x1,y1,z)endl;return 0;float Area(float x,float y)return x*y;float Area(float x)return x*x;float Area(float r,const double pi)return pi*r*r;float Area(float a,float b,float h)return (a+b)*h/2;float Volumn(float a,float b,float h)return a*b*h;float Volumn(float a)return a*a*a;float Volumn(fl
24、oat r,const float pi)return 4*pi*r*r*r/3;float Volumn(float a,float b,float a1,float b1,float h)return h*(a*b+(a+a1)*(b+b1)+a1*b1)/6.0;3利用重载实现对10个整数和10个实数的排序。#include iostreamusing namespace std;void sort(int a,int n);void sort(float a,int n);int main()const int n=10;int i,an;float bn;cout输入n个整数endl
25、;for(i=0;iai;sort(a,n);cout排序结果为:endl;for(i=0;in;i+)coutai ;coutendl;cout输入n个实数endl;for(i=0;ibi;sort(b,n);cout排序结果为:endl;for(i=0;in;i+)coutbi ;coutendl;return 0;void sort(int a,int n)int i,j,t;for (i=0;in-1;i+)for (j=i+1;jn;j+)if(aiaj)t=ai;ai=aj;aj=t;void sort(float a,int n)int i,j;float t;for (i=0;
26、in-1;i+)for (j=i+1;jn;j+)if(aiaj)t=ai;ai=aj;aj=t;第4章 常量与引用1使用const的优点是什么?应该注意哪些问题?答:使用const的好处是它允许指定一种语意上的约束:某种对象不能被修改而由编译器具体来实施这种约束。通过const,可以通知编译器和其他程序员某个值要保持不变。注意问题:(1) 尽量把const定义放进头文件里,由此通过包含头文件,把const定义放在一个需要放置的地方,并由编译器分配给它一个编译单元。(2) 当定义一个常量(const)时,必须初始化,即赋初值给它,除非用extern做了清楚的说明。2指出下面非法的定义。(D)
27、Aint I;Bconst int ic;Cconst int *pic;Dint *const cpi;3下列哪些初始化为合法的?指出原因。(D) Aint i=1;Bconst int ic=I;Cconst int *pic=⁣ Dint *const cpi=⁣E const int *const cpic=⁣4根据第3题,以下赋值哪些是非法的?为什么?(E) Ai=ic;Bpic=cpic;Cpic=⁣Dcpic=⁣ Ecpi=pic;Fic=*cpic;5下列定义中,哪些是无效的?为什么?如何改正?(BDFGIJ) Aint i=1.02;Bint &
28、j=1.002;Cint & k=i;Dint &m=&i; Eint *pi=&i;Fint &n=pi;Gint &p=*pi;Hint &* pval=pi; Iconst int &iv=1;Jconst int &* pval=&ival;6下面的类型声明中正确的是(D)。 Aint &a4;Bint &*p;Cint &q;Dint i,*p=&i;7建立一个包含const成员的类,在构造函数初始化表达式里初始化这个const成员,建立一个无标记的枚举,用它决定一个数组的大小。class conClass const int NUM; public: conClass();conC
29、lass:conClass():NUM(100)8建立一个类,该类具有const和非const成员函数。建立这个类的const和非const对象,试着为不同类型的对象调用不同类型的成员函数。class Studentint No;char Name20;public:Student();int GetNo()const;/const成员函数const char* GetName();/返回值为const的成员函数,不是const成员函数;int Student:GetNo()constreturn No;const char* Student:GetName()return Name;9引用的
30、使用规则是什么?答:(1) 当引用被创建时,它必须被初始化(指针则可以在任何时候被初始化)。(2) 一旦一个引用被初始化为指向一个对象,它就不能被改变为对另一个对象的引用(指针则可以在任何时候指向另一个对象)。(3) 没有NULL引用。必须确保引用是和一个合法的存储单元关联。10写一个带有拷贝构造函数的类,并编写一个测试它的程序,以观察在值传递时,拷贝构造函数是否被调用。class Studentstatic int number;public:Student() number+; show(Student);/拷贝构造函数Student(const Student&) number+; sh
31、ow(Student);int Student:number=0;Student f(Student x)x.show(x inside f();return x;int main()Student h1;Student h2=f(h1);Student:show(after call f();return 0;11.略第5章 静态与命名控制1下列静态数据成员的特性中,错误的是( D )。 A说明静态数据成员时,前边要加关键字static B静态数据成员在类外进行初始化 C引用静态数据成员时,要在静态数据成员名前加和作用域运算符 D静态数据成员不是所有对象所共有的2下列关于静态数据成员的叙述,
32、错误的是( A )。 A静态数据成员在对象调用析构函数后,从内存中撤销 B即使没有实例化类,静态数据成员也可以通过类名进行访问 C类的静态数据成员是该类所有对象所共享 D类的静态数据成员需要初始化3下列关于静态成员的叙述中,错误的是( B )。 A类的外部可以直接调用类的静态数据成员和静态成员函数 B与一般成员一样,只有通过对象才能访问类的静态成员 C类的静态数据成员不能在构造函数中初始化 D类的一般成员函数可以调用类的静态成员4声明类的成员为静态成员,必须在其前面加上关键字( B )。 AconstBstaticCpublicDvirtual 5静态成员为该类的所有( B )共享。 A成员B
33、对象Cthis指针D友元6程序运行结果:1237程序运行结果:CStatic:val=10思考题1利用静态数据成员的概念,编写一个类,统计目前存在多少个该类的对象。class Aprivate:static int n;public:A()n+;void Print()coutnendl;int A:n=0;int main()A a1;a1.Print();A a5,a2;a2.Print ();return 0;2利用静态数据成员的概念,编写一个学生类,学生信息包括姓名、学号、成绩;统计学生的总人数及总成绩,并输出。#include iostream#includeiomanipusing
34、 namespace std;class Studentprivate:char *name;int stu_no;float score;static int total_num;static float total_score;public:Student(char *na,int no,float sco);void Print();int Student:total_num =0;float Student:total_score =0;int main()Student s1(张明,1,90);s1.Print();Student s2(王兰,2,95);s2.Print();Stu
35、dent s3(于敏,3,87);s3.Print();return 0;Student:Student(char *na,int no,float sco)name=new charstrlen(na)+1;strcpy(name,na);stu_no=no;score=sco;total_num+;total_score=total_score+score;void Student:Print() cout第total_num个学生:namesetw(4)stu_nosetw(4)score endl;cout总人数是:total_numendl;cout总分数是:total_scoreendl;3利用静态的概念,编写一个小猫类,统计并输出每个小猫的重量、小猫的总数量及总重量。class small_cat / cat.hprivate:double weight;static double total_weight;static double total_number;public:small_cat(double w):weight(w)total_weight=total_weight+weight;total_number=total_number+1;void Print()couttotal_weight total_numberB+
限制150内