1、资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。 第2章 C+的初步知识【2.3】【解】B【2.4】【解】C【2.5】【解】C【2.6】【解】C【2.7】 【解】C【2.8】【解】A【2.9】【解】B【2.10】 【解】D【2.11】【解】D【2.12】解】 C【2.13】【解】 D说明:”int *p=new int(5);”表示动态分配1个整型内存空间,初值为5;”int *p=new int5;”表示动态分配5个整型内存空间;”int *p=new int;”表示动态分配1个整型内存空间;”int *p=new int5(0)”想给一个数组分配内存空间时,对数组进行初始化,
2、这是不允许的。【2.14】 【解】 D说明:name被定义为指向常量的常指针, 这个指针变量所指的地址不能改变,它所指向的地址中的数据也不能改变。”name3=a;”修改了name所指向的地址中的数据,”name=lin;”和”name=new char5;”修改了name所指的地址,只有D输出一个字符是正确的。【2.15】 【解】 A说明:name被定义常指针,它所指向的地址中的数据能改变,但它所指的地址不能改变。”name3=q;”修改了name所指向的地址中的数据,是正确的。而”name=lin;”、 ”name=new char5;”和”name=new char(q);”以不同的方法
3、修改了name所指的地址,都是错误的。【2.16】【解】 A说明:name被定义指向常量的指针, 它所指向的地址中的数据不能改变,但它所指的地址能够修改,而”name3=q;”修改了name所指向的地址中的数据,是错误的。”name=lin;” 、 ”name=new char5;”和”name= new char(q)”以不同的方法修改了name所指的地址,都是正确的。【2.17】【解】C【2.18】【解】 D说明:C+中不能建立引用数组和指向引用的指针,也不能建立引用的引用。因此A、 B、 C是错误的,D是正确的。【2.19】【解】A【2.20】【解】B【2.21】【解】(1) 这两个函数
4、原型是等价的,因为函数原型中的参数名能够缺省。(2) 这两个函数的第一行是不等价的,函数的第一行中必须包含参数名。【2.23】【解】本程序的运行结果如下:x+y=65【2.24】【解】本程序的运行结果如下:101说明: 在语句”:i=i+1;”中赋值号左边”:i”的中i是全局变量,赋值号右边的i是局部变量。因此执行该语句的结果是将局部变量i的值加1(即101)后赋值给全局变量i。【2.25】【解】本程序的运行结果如下:10 10说明:函数f(&m,n)中 第1个参数是引用参数, 引用参数是一种按地址传递参数的方法,对其的调用是传地址调用;而第2个参数是变量参数,对它的调用是传值调用。因此调用函
5、数f后, 实参a的值被改为10, 实参b的值不变,仍为10。【2.26】【解】本程序的运行结果如下:1020说明:函数f的参数是变量的引用, 对它的调用是传地址调用,因此函数f调用后,主函数中k的值变为10。又由于m是对函数f的引用,当m被赋值为20时,k的值也变为20 。【2.27】 【解】程序的作用是: 输入3个整数, 然后输出其中值最大的数。在主函数中输入3个整数, 然后调用f函数, 在f函数中实现找最小的整数, 用if语句比较两个数, 将大者存放在变量m中, 经过两个if语句的比较, m中存放的是3个整数中最大的数。运行情况如下: 2 4 7 (输入3个整数)7 (输出其中最大的数)【
6、2.28】 【解】实现本题功能的程序如下:#include#includeusing namespace std;int main() float x,y; coutxy; float z=pow(x,y); coutpow(x,y)=zendl; return 0;本程序的运行结果是:please input 2 floats to x,y: 2.1 3pow(2.1,3)=9.261说明:由于要用到系统函数pow(x, y), 因此要包含头文件cmath。【2.29】【解】实现本题功能的程序如下:#include using namespace std;int main() int *p=
7、new int20; /动态分配20个整型内存空间 *p=1; *(p+1)=1; /对前面2个内存空间赋值1 cout*pt*(p+1)t; p=p+2; /p指向第3个内存空间 for (int i=3;i=20;i+) *p=*(p-1)+*(p-2); cout*pt; if (i%5=0) coutendl;p+; /p指向下一个内存空间;return 0;本程序的运行结果是:1 1 2 3 58 13 21 34 5589 144 233 377 610987 1597 2584 4181 6765【2.30】 【解】实现本题功能的程序如下:#include #include us
8、ing namespace std;double sroot(int i) return sqrt(i);double sroot(long l) return sqrt(l); double sroot(double d) return sqrt(d);int main() int i=12; long l=1234; double d=12.34;couti的二次方根是: sroot(i)endl;coutl的二次方根是: sroot(l)endl;coutd的二次方根是: sroot(d)endl;return 0;本程序的运行结果是:i的二次方根是: 3.4641l的二次方根是: 35
9、.1283d的二次方根是: 3.51283第3章 类和对象3.1 习题参考解答【3.1】 【解】 类声明的一般格式如下:class 类名public: 公有数据成员;公有成员函数;private:私有数据成员;私有成员函数; ;类的声明由关键字class打头,后跟类名,花括号中是类体,最后以一个分号”;”结束。【3.2】【解】C【3.3】【解】B【3.4】【解】B【3.5】【解】D【3.6】【解】B说明:C+中对构造函数有一些规定:不能带返回值;能够不带参数;也能够缺省定义;但构造函数的名字与类名必须完全相同。【3.7】【解】B【3.8】【解】C【3.9】【解】C【3.10】【解】B【3.11
10、】【解】C说明:C+中对析构函数也有一些规定:没有参数;不能重载;析造函数的名字与是在类名前加”;析构函数不能指定返回类型。【3.12】 【解】C【3.13】【解】C【3.14】【解】B【3.15】【解】D【3.16】 【解】语句(1)使用带默认参数的构造函数,或不带参数的构造函数,定义了point类的两个对象p2和p3;语句(2)在建立新对象p2时,用已经存在的对象P1去初始化新对象p2,在这个过程中用”赋值法”调用了拷贝构造函数。语句(3)在建立新对象p2时,用已经存在的对象P1去初始化新对象p2,在这个过程中用”代入法”调用了拷贝构造函数。语句(4)将对象p1数据成员的值拷贝到对象p4中
11、, 这个过程是经过默认赋值运算符函数实现的。【3.17】【解】本程序的运行结果如下:Exit maindst 55【3.18】【解】本程序的运行结果如下: Counting at 0 Counting at 1 Counting at 2 Counting at 3 Counting at 4 Counting at 5 Couhting at 6 Counting at 7 Counting at 8 Counting at 9说明:在本程序中主函数main只包括了一个return语句,但竟然有内容输出! 什么时候调用了构造函数? 我们知道,构造函数在对象被定义时调用。那么对象anObjec
12、t是何时被调用的呢? 在主函数main之前,语句”test anObject”处。【3.19】【解】本程序的运行结果如下:Con.Copy con.default.【3.20】【解】 第1个错误:printStu()和setSno两个成员函数没有用public定义,不允许外部函数对对象进行操作。第2个错误:成员函数在类外定义,应加上类名”Student:”。第3个错误:setAge应在类中说明,而且在类外定义时,应加上类名”Student:”。【3.21】【解】构造函数Point是私有的,语句”Point cpoint;”执行时出现错误。【3.22】【解】 实现本题功能的程序如下:#inclu
13、de using namespace std;class Circlepublic: Circle(float r)radius=r; float area()return 3.14*radius*radius;private: float radius;int main() float r;coutr;Circle p(r);cout半径为r的圆的面积为:p.area()endl;return 0;程序的运行结果是:请输入圆的半径:3半径为3的圆的面积为:28.26【3.23】 【解】实现本题功能的程序如下:#include using namespace std;class cylinde
14、rpublic: cylinder(double a,double b); void vol();private: double r,h; double volume;cylinder:cylinder(double a,double b) r=a; h=b; volume=3.141592*r*r*h;void cylinder:vol() coutvolume is:volumen;int main() cylinder x(2.2,8.09); x.vol();return 0;程序的运行结果是:volume is:123.011【3.24】【解】实现本题功能的程序如下:#include
15、 using namespace std;class Date public: Date() Date(int y,int m,int d) year=y; mon=m; day=d; Date(Date&d) year=d.year; mon=d.mon; day=d.day; void SetDate(int Y,int m,int d) year=Y; mon=m; day=d; void printDate() cout日期是:year年mon月day日endl; int GetYear() return year; int GetMonth() return mon; int Get
16、Day() return day; private: int day,mon,year;void main() Date d1( ,6,8);cout日期是:d1.GetYear()年d1.GetMonth()月d1.GetDay()日endl; Date d2; d2.SetDate( ,8,1);d2.printDate(); Date d3(d1);d3.printDate();程序的运行结果是:日期是: 6月8日日期是: 8月1日日期是: 6月8日第4章 类和对象的进一步讨论4.1 习题参考解答【4.1】【解】 所谓对象数组是指每一数组元素都是对象的数组,也就是说,若一个类有若干个对象
17、,我们把这一系列的对象用一个数组来存放。对象数组的元素是对象,不但具有数据成员,而且还有函数成员。【4.2】【解】对象指针就是用于存放对象地址的变量。声明对象指针的一般语法形式为: 类名* 对象指针名;【4.3】【解】B【4.4】【解】C【4.5】【解】B说明:C+中规定,在建立对象前就能够为静态数据成员赋值。同时规定在静态成员函数中不能使用this指针;静态成员函数在类外定义时,不需要用static前缀;静态成员函数既能够在类内定义也能够在类外定义。【4.6】【解】D 【4.7】【解】C 【4.8】【解】D 【4.9】【解】A【4.10】【解】A说明:由于友元函数能够直接访问对象的私有成员,
18、因此友元的作用是提高程序运行的效率。【4.11】【解】A 【4.12】【解】B【4.13】【解】B 如果一个对象说明为常对象,则经过该对象只能调用它的常成员函数。题中,对象a被定义成类Sample的常对象,因此经过对象a只能调用其常成员函数disp。因此程序最后输出disp2。 【4.17】 【解】实现本题功能的程序如下:#includeusing namespace std;class Student public: Student(int n,float s):num(n),score(s) void display(); private:int num;float score;void
19、Student:display()cout学号:num 成绩: scoreendl;int main() Student stu6=Student(1001,88.5),Student(1002,75.5),Student(1003,68.5),Student(1004,99.0),Student(1005,93.5),Student(1006,86.0);Student* p=stu;p=p+1;for(int i=1;idisplay();return 0;本程序的运行结果如下: 学号:1002 成绩: 75.5学号:1004 成绩: 99学号:1006 成绩: 86【4.18】【解】实现
20、本题功能的程序如下: #includeusing namespace std;class Student public: Student(int n,float s):num(n),score(s) int num; float score; ;int main() Student stu6=Student(1001,88.5),Student(1002,75.5),Student(1003,68.5),Student(1004,99.0),Student(1005,93.5),Student(1006,86.0);void max(Student*);Student* p=&stu0;max
21、(p);return 0;void max(Student* arr) float max_score=arr0.score;int k=0;for(int i=1;imax_score) max_score=arri.score; k=i; cout学号:arrk.num 成绩: max_scoreendl;本程序的运行结果如下: 学号:1004 成绩: 99【4.19】 【解】实现本题功能的程序如下:#include using namespace std;class book public: book(int a, int b) qu= a;price= b; void show_mon
22、ey() coutqu*pricen;private: int qu,price;int main() book ob5= book(1,10),book(2,20), book(3,30),book(4,40),book(5,50) ; int i; for(i=0; i5; i+) obi.show_money(); return 0;本程序的运行结果如下: 104090160250【4.21】【解】实现本题功能的程序如下: #include #include using namespace std;class Studentpublic: Student(int n,string na,
23、double d) no=n;deg=d;name=na;sum+=d;num+;static double avg() return sum/num;static int total() return num;void disp() coutno name degendl;private:int no; /学 号string name; /姓 名double deg; /成 绩static double sum; /总成绩static int num; /学生人数;double Student:sum=0;int Student:num=0;int main() Student s1(100
24、1,Zhou,97),s2(1002,Zhan,65),s3(1003,Chen,88);cout学号 姓名 成绩n;s1.disp();s2.disp();s3.disp();cout学生人数=Student:total()endl;cout平均成绩=Student:avg();return 0;本程序的运行结果如下:学号 姓名 成绩1001 Zhou 971002 Zhan 651003 Chen 88学生人数=3平均成绩=83.3333 第5章 继承与派生5.1 习题参考解答【5.1】【解】 派生类能够继承基类中除了构造函数与析构函数之外的成员,可是这些成员的访问属性在派生过程中是能够调
25、整的。从基类继承来的成员在派生类中的访问属性是由继承方式控制的。类的继承方式有public(公有继承)、 protected(保护继承)和private(私有继承)3种,不同的继承方式导致不同访问属性的基类成员在派生类中的访问属性也有所不同。在派生类中,从基类继承来的成员能够按访问属性划分为4种:不可直接访问、 公有 (public)、 保护 (protected)和私有(private)。表5.1列出了基类成员在派生类中的访问属性。表5.1 基类成员在派生类中的访问属性基类中的成员继承方式基类成员在派生类中的访问属性私有成员(private)公有继承(public)不可直接访问私有成员(pr
26、ivate)私有继承(private) 不可直接访问私有成员(private)保护继承(protected) 不可直接访问 公有成员(public)公有继承(public) 公有(public) 公有成员(public) 私有继承(private) 私有(private) 公有成员(public) 保护继承(protected) 保护(protected) 保护成员(protected) 公有继承(public) 保护(protected) 保护成员(protected) 私有继承(private) 私有(private) 保护成员(protected) 保护继承(protected) 保护(
27、protected) 【5.2】 【解】派生类不能直接访问基类的私有成员,可是能够经过基类提供的公有成员函数间接地访问基类的私有成员。 【5.3】【解】当类的继承方式为公有继承时,基类中的所有保护成员在派生类中仍以保护成员的身份出现,在派生类内能够访问这些成员,但派生类外部不能访问它们,而在下一层派生类内能够访问它们。当类的继承方式为私有继承时,基类中的所有保护成员在派生类中都以私有成员的身份出现, 在派生类内能够访问这些成员,但派生类外部不能访问它们。【5.4】【解】一般情况下,当创立派生类对象时,首先调用基类的构造函数,随后再调用派生类的构造函数;当撤销派生类对象时,则先调用派生类的析构函
28、数,随后再调用基类的析构函数。【5.5】【解】当一个派生类具有多个基类时,这种派生方法称为多继承。多重继承的构造函数的执行顺序与单继承构造函数的执行顺序相同,也是遵循先调用基类的构造函数,再调用对象成员的构造函数,最后调用派生类构造函数体的原则。处于同一层次的各个基类构造函数的调用顺序,取决于声明派生类时所指定的各个基类的顺序,与派生类构造函数中所定义的成员初始化列表的各项顺序没有关系。析构函数的调用顺序则刚好与构造函数的执行顺序相反。【5.6】【解】B说明:经过派生类的使用,能够经过增加少量代码的方法得到新的的类,从而解决了代码的重用问题。【5.7】【解】A【5.10】【解】B.【5.11】
29、【解】A.【5.12】【解】B.【5.13】【解】B.【5.14】【解】本程序的运行结果如下:0, 0, 0 0, 1, 0 3, 6, 9 【5.15】 【解】本程序的运行结果如下:主食=bread 副食=steak 【5.17】 【解】 修改后的程序如下:#include using namespace std;class Timepublic: Time(int h,int m,int s) hours=h; minutes=m; seconds=s;void display() cout出生时间:hours时minutes分seconds秒endl; protected: int ho
30、urs,minutes,seconds;class Datepublic:Date(int m,int d,int y) month=m;day=d;year=y; void display() cout出生年月:year年month月day日endl; protected: int month,day,year;class Birthtime:public Time,public Date public: Birthtime(char *Cn,int yy,int mm,int dd,int hh,int mint,int ss) :Time (hh,mint,ss),Date(mm,dd,
31、yy) strcpy(Childname,Cn); void display() cout姓 名:Childnameendl; Date:display(); Time:display(); protected: char Childname20;int main() Birthtime yx(王小明 , ,12,17,18,20,30); yx.display();return 0;程序的运行结果是:姓 名:王小明出生年月: 12月17日出生时间:18时20分30秒第6章 多态性与虚函数6.1 习题参考解答【6.1】【解】从实现的角度来讲, 多态能够划分为两类:编译时的多态性和运行时的多态性
32、。编译时的多态性是经过静态联编实现的, 而运行时的多态性则是经过动态联编实现的。在C+中, 编译时多态性主要是经过函数重载和运算符重载实现的。运行时多态性主要是经过虚函数来实现的。【6.2】【解】A【6.3】【解】D【6.4】【解】A说明:C+规定构造函数不能是虚函数, 而析构函数能够是虚函数。【6.5】【解】D说明:C+规定虚函数在派生类中重新定义时,其函数原型,包括函数类型、 函数名、 参数个数、 参数类型的顺序,都必须与基类中的原型完全相同。【6.6】【解】A【6.7】【解】C 说明:”virtual show()=0; ”表示是show是纯虚函数,但没指定不带返回值,因此是错误的;”v
33、irtual void show();”未表明show是纯虚函数,因此也是错误的;”void show()=0 virtual;”把 virtual 的位置写错了。正确的答案应该是”virtual void show()=0;”。【6.8】【解】A【6.9】【解】C 说明: 如果在抽象类的派生类中没有重新说明纯虚函数,则该函数在派生类中依然为纯虚函数,而这个派生类依然还是一个抽象类。【6.10】【解】A第10章 异常处理和命名空间10.1 习题参考解答【10.1】【解】程序在运行过程中出现的错误统称为异常,对异常的处理称为异常处理。异常处理是对所能预料的运行错误进行处理的一套实现机制。【10.
34、2】【解】 C+处理异常的办法是:如果在执行一个函数过程中出现异常,能够不在本函数中立即处理,而是发出一个信息,传给它的上一级(即调用函数)来解决,如果上一级函数也不能处理,就再传给其上一级,由其上一级处理。如此逐级上传,如果到最高一级还无法处理,运行系统一般会自动调用系统函数terminate,由它调用abort终止程序。这样的异常处理方法使得异常的引发和处理机制分离, 而不是由同一个函数完成。这样做法的好处是使底层函数(被调用函数)着重用于解决实际任务,而不必过多地考虑对异常的处理,以减轻底层函数的负担,而把处理异常的任务上移到上层去处理。例如在主函数中调用十几个函数,只需在主函数中设计针
35、对不类型的异常处理,而不必在每个函数中都设置异常处理,这样能够大大提高效率。【10.3】【解】所谓命名空间, 实际上就是一个由程序设计者命名的内存区域。程序设计者能够根据需要指定一些有名字的命名空间, 将各命名空间中声明的标识符与该命名空间标识符建立关联,保征不同命名空间的同名标识符不发生冲突。B) 【10.4】【解】B【10.5】 【解】A 【10.6】【解】B【10.7】【解】 本程序的运行结果如下:4!=24n=-2 不能计算n!.程序执行结束.【10.8】【解】 本程序的运行结果如下:NS1:funNS2:fun 【10.9】【解】 实现本题功能的程序如下: #include usin
36、g namespace std;#include class Stud protected: int no;char name10; int score;public: Stud() ; void getdata() cinnonamescore; if(score100|score0) throw name; void disp() cout setw(4)nosetw(10)namesetw(16)scoreendl; ;int main() Stud st5;cout输入学生数据:endl;cout学号, 姓名, 成绩:endl;for(int i=0;i5;i+) trysti.get
37、data(); catch(char*s) cout s成绩输入错误!endl; cout输出学生数据:endl; for(i=0;i5;i+) sti.disp(); return 0;【解】 本程序的运行结果如下:输入学生数据:学号, 姓名, 成绩:1001 aa 451002 bb 102 bb成绩输入错误!1003 cc -8 cc成绩输入错误!1004 dd 671005 ff 78输出学生数据: 1001 aa 45 1002 bb 102 1003 cc -8 1004 dd 67 1005 ff 78 第11章 综合设计与实现【11.1】【解】 实现本题功能的程序如下: #include using namespace std; class Data_rec; class Student; class Teacher; class Employee; ostream& operator(istream& input, Student& ob); ostream& operator(istream& input, Teacher& ob); ostream& operator(istream& input, Employee& ob); class Data_rec friend class LinkList; protected: