C++第四版习题解答下5716.pdf
《C++第四版习题解答下5716.pdf》由会员分享,可在线阅读,更多相关《C++第四版习题解答下5716.pdf(62页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+程序设计基础(第 4 版)(下)习题与解答 第 6 章 类与对象 6.1 选择题 1若有以下说明,则在类外使用对象 objX 成员的正确语句是(C )。class X int a;void fun1();public:void fun2();X objX;(A)objX.a=0;(B)objX.fun1();(C)objX.fun2();(D)X:fun1();2若有以下说明,则对 n 的正确访问语句是(B )。class Y /;public:static int n;int Y:n;Y objY;(A)n=1;(B)Y:n=1;(C)objY:n=1;(D)Yn 3若有以下类 Z 说明
2、,则函数 fStatic 中访问数据 a 错误的是(C )。class Z static int a;public:static void fStatic(Z&);int Z:a=0;Z objZ;(A)void Z:fStatic()objZ.a=1;(B)void Z:fStatic()a=1;(C)void Z:fStatic()thisa=0;(D)void Z:fStatic()Z:a=0;4若有以下类 W 说明,则函数 fConst 的正确定义是(A )。class W int a;public:void fConst(int&)const;(A)void W:fConst(int
3、&k)const k=a;(B)void W:fConst(int&k)const k=a+;(C)void W:fConst(int&k)const cin a;(D)void W:fConst(int&k)const a=k;5若有以下类 T 说明,则函数 fFriend 的错误定义是(C )。class T int i;friend void fFriend(T&,int);(A)void fFriend(T&objT,int k)objT.i=k;(B)void fFriend(T&objT,int k)k=objT.i;(C)void T:fFriend(T&objT,int k)k
4、+=objT.i;(D)void fFriend(T&objT,int k)objT.i+=k;6在类定义的外部,可以被访问的成员有(C )。(A)所有类成员 (B)private 或 protected 的类成员(C)public 的类成员 (D)public 或 private 的类成员 7关于 this 指针的说法正确的是(C )。(A)this 指针必须显式说明 (B)定义一个类后,this 指针就指向该类(C)成员函数拥有 this 指针 (D)静态成员函数拥有 this 指针 8说明一个类的对象时,系统自动调用(B );撤销对象时,系统自动调用(C )。(A)成员函数(B)构造函数
5、 (C)析构函数 (D)友元函数 9下面对构造函数的不正确描述是(C )。(A)用户定义的构造函数不是必须的 (B)构造函数可以重载(C)构造函数可以有参数,也可以有返回值 (D)构造函数可以设置默认参数 10下面对析构函数的正确描述是(C )。(A)系统在任何情况下都能正确析构对象 (B)用户必须定义类的析构函数(C)析构函数没有参数,也没有返回值 (D)析构函数可以设置默认参数 11关于类的静态成员的不正确描述是(D )。(A)静态成员不属于对象,是类的共享成员(B)静态数据成员要在类外定义和初始化(C)静态成员函数不拥有 this 指针,需要通过类参数访问对象成员(D)只有静态成员函数可
6、以操作静态数据成员 12在下列选项中,(C )不是类的成员函数。(A)构造函数 (B)析构函数 (C)友元函数 (D)复制构造函数 13下面对友元的错误描述是(D )。(A)关键字 friend 用于声明友元(B)一个类中的成员函数可以是另一个类的友元(C)友元函数访问对象的成员不受访问特性影响(D)友元函数通过 this 指针访问对象成员 14若 class B 中定义了一个 class A 的类成员 A a,则关于类成员的正确描述是(C )。(A)在类 B 的成员函数中可以访问 A 类的私有数据成员 (B)在类 B 的成员函数中可以访问 A 类的保护数据成员 (C)类 B 的构造函数可以调
7、用类 A 的构造函数做数据成员初始化 (D)类 A 的构造函数可以调用类 B 的构造函数做数据成员初始化 6.2 阅读下列程序,写出运行结果 1#include using namespace std;class A public:int f1();int f2();void setx(int m)x=m;cout x endl;void sety(int n)y=n;cout y endl;int getx()return x;int gety()return y;private:int x,y;int A:f1()return x+y;int A:f2()return x-y;int ma
8、in()A a;a.setx(10);a.sety(5);cout a.getx()t a.gety()endl;cout a.f1()t a.f2()endl;【解答】10 5 10 5 15 5 2#include using namespace std;class T public:T(int x,int y)a=x;b=y;cout 调用构造函数 1.endl;cout a t b endl;T(T&d)cout 调用构造函数 2.endl;cout d.a t d.b endl;T()cout 调用析构函数.endl;int add(int x,int y=10)return x+y
9、;private:int a,b;int main()T d1(4,8);T d2(d1);cout d2.add(10)endl;【解答】调用构造函数 1.4 8 调用构造函数 2.4 8 20 调用析构函数.调用析构函数.3#include using namespace std;class T public:T(int x)a=x;b+=x;static void display(T c)couta=c.atb=c.bendl;private:int a;static int b;int T:b=5;int main()T A(3),B(5);T:display(A);T:display
10、(B);【解答】a=3 b=13 a=5 b=13 4#include using namespace std;#include class Point public:Point(float x,float y)a=x;b=y;cout点(a,b);friend double d(Point&A,Point&B)return sqrt(A.a-B.a)(A.a-B.a)+(A.b-B.b)(A.b-B.b);private:double a,b;int main()Point p1(2,3);cout 到;Point p2(4,5);cout 的距离是:d(p1,p2)endl;【解答】点(3
11、,4)到点(4,5)的距离是:2.82843 5#include using namespace std;class A public:A()a=5;void printa()cout A:a=a endl;private:int a;friend class B;class B public:void display1(A t)t.a+;cout display1:a=t.a endl;void display2(A t)t.a-;cout display2:a=t.a endl;int main()A obj1;B obj2;obj1.printa();obj2.display1(obj1
12、);obj2.display2(obj1);obj1.printa();【解答】A:a=5 display1:a=6 display2:a=4 A:a=5 6#include using namespace std;class A public:A(int x):a(x=0)void getA(int&A)A=a;void printA()couta=aendl;private:int a;class B public:B(int x,int y):aa(x=0)b=y;void getAB(int&A,int&outB)aa.getA(A);outB=b;void printAB()aa.p
13、rintA();coutb=bendl;private:A aa;int b;int main()A objA;int m=5;objA.getA(m);coutobjA.a=mendl;coutobjB:n;B objB;objB.getAB(12,56);objB.printAB();【解答】objA:a=5 objB:a=12 b=56 6.3 思考题 1结构与类有什么区别?如果把程序中定义结构的关键字 struct 直接改成 class,会有什么问题?用教材中的一个例程试试看,想一想做什么修改能使程序正确运行?【解答】结构是数据的封装,类是数据和操作的封装。可以把结构看成是类的特例。结
14、构和类都可以用关键字 struct 或 class 定义。区别是,struct 定义的结构或类的全部成员都是公有的,用 class定义的结构或类不做声明的成员是私有的。若把 struct 改成 class,只需要把全部成员定义为 public 就可以了。2有说明:class A int a;double x;public:funMember();A a1,a2,a3;编译器为对象 a1、a2 和 a3 开辟了什么内存空间?它们有各自的 funMember 函数的副本吗?C+通过什么机制调用类的成员函数?【解答】开辟的存储空间有 a1.a,a1.x,a2.a,a2.x,a3.a,a3.x。各对象
15、没有 funMember 函数的副本,C+通过 this 指针调用成员函数。3C+提供了系统版本的构造函数,为什么还需要用户自定义构造函数?编写一个验证程序,说明自定义构造函数的必要性。【解答】类的默认构造函数可以建立基本类型数据成员的存储空间。基于以下两个原因,需要用户定义构造函数:(1)对数据成员的值做指定初始化;(2)类的数据是由指针管理的堆。程序略。4试从定义方式、访问方式、存储性质和作用域 4 个方面来分析类的一般数据成员和静态数据成员的区别,并编写一个简单程序验证它。【解答】定义方式 访问方式 存储性质 作用域 一般数据成员 类中定义 对象.数据成员 局部数据 由 访 问 属 性p
16、ublic,protected,private 决定 静态数据成员 类中声明,类外定义 对象.数据成员 类:数据成员 全局数据 程序略。5试从定义方式、调用方式两个方面来分析常成员函数、静态成员函数和友元函数的区别。考察例 6-15,若 class Goods 的指针域:Goods next;被声明为私有(private)成员,程序会出现什么错误?做什么最小修改能使程序正确运行?【解答】定义方式 调用方式 常成员函数 函数原型以 const 做后缀 this 指针被约束为指向常量的常指针 与一般成员函数调用形式相同 对数据成员只读 静态成员函数 以 static 做函数原型前缀 没有 this
17、 指针 通过类或对象调用 用于操作静态数据成员 友员函数 以 friend 做函数原型前缀 没有 this 指针 通过参数访问对象 可以访问对象的不同属性的成员 在例 6-15 中,若把 next 声明为私有数据成员,只须把有关指针操作的函数定义为友员函数就可以了:friend void purchase(Goods*&f,Goods*&r,int w);friend void sale(Goods*&f,Goods*&r);6设有:class M public:int a;class N public:M m;int b;void fun()/;int main()N n;N p=&n;/描
18、述在 N:fun 中如何访问 M 类的数据成员 a?在 main 函数中又如何访问对象 n 的全部数据成员?【解答】在 N:fun 中访问 M 类的数据成员 a 的形式是:m.a 在 main 函数中访问 M 类的数据成员的形式是:n.b,n.m.a 6.4 编程题 1定义一个 Book(图书)类,在该类定义中包括以下数据成员和成员函数。数据成员:bookname(书名)、price(价格)和 number(存书数量)。成员函数:display()显示图书的情况;borrow()将存书数量减 1,并显示当前存书数量;restore()将存书数量加 1,并显示当前存书数量。在 main 函数中,
19、要求创建某一种图书对象,并对该图书进行简单的显示、借阅和归还管理。【解答】#include using namespace std;class Book public:void setBook(char*,double,int);void borrow();void restore();void display();private:char bookname40;double price;int number;/在类外定义 Book 类的成员函数 void Book:setBook(char*name,double pri,int num)strcpy(bookname,name);price
20、=pri;number=num;void Book:borrow()if(number=0)cout 已没存书,退出!endl;abort();number=number-1;cout 借一次,现存书量为:number endl;void Book:restore()number=number+1;cout 还一次,现存书量为:number endl;void Book:display()cout 存书情况:endl bookname:bookname endl price:price endl number:number endl;int main()char flag,ch;Book co
21、mputer;computer.setBook(c+程序设计基础,32,1000);computer.display();ch=y;while(ch=y)cout flag;switch(flag)case b:computer.borrow();break;case r:computer.restore();cout ch;computer.display();2定义一个 Box(盒子)类,在该类定义中包括以下数据成员和成员函数。数据成员:length(长)、width(宽)和 height(高)。成员函数:构造函数 Box,设置盒子的长、宽和高 3 个初始数据;成员函数 setBox 对数
22、据成员置值;成员函数 volume 计算盒子的体积。在 main 函数中,要求创建 Box 对象,输入长、宽、高,输出盒子的体积。【解答】#include using namespace std;class BOX public:BOX(double l,double w,double h)length=l;width=w;height=h;void volume()cout volume=length*width*height endl;private:double length,width,height;int main()BOX box1(1,3,5);box1.volume();BOX
23、 box2(2,4,6);box2.volume();3定义一个 Student 类,在该类定义中包括:一个数据成员(分数 score)及两个静态数据成员(总分 total 和学生人数 count);成员函数 scoretotalcount(double s)用于设置分数、求总分和累计学生人数;静态成员函数 sum()用于返回总分;静态成员函数 average()用于求平均值。在 main 函数中,输入某班同学的成绩,并调用上述函数求全班学生的总分和平均分。【解答】#include using namespace std;class student public:void scoretotal
24、count(double s)score=s;total=total+score;count+;static double sum()return total;static double average()return total/count;private:double score;static double total;static double count;double student:total=0;double student:count=0;int main()int i,n;double s;cout n;student stu;for(i=1;i=n;i+)cout 请输入第
25、i s;stu.scoretotalcount(s);cout 总分:student:sum()endl;cout 平均分:student:average()endl;4定义一个表示点的结构类型 Point 和一个由直线方程 y=ax+b 确定的直线类 Line。结构类型 Point 有两个成员 x 和 y,分别表示点的横坐标和纵坐标。Line 类有两个数据成员 a 和 b,分别表示直线方程中的系数。Line 类有一个成员函数 print 用于显示直线方程。友元函数setPoint(Line&l1,Line&l2)用于求两条直线的交点。在 main 函数中,建立两个直线对象,分别调用 prin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 第四 习题 解答 5716
限制150内