Visual C++ 实用教程 第4版_郑阿奇__习题参考答案_第1页
Visual C++ 实用教程 第4版_郑阿奇__习题参考答案_第2页
Visual C++ 实用教程 第4版_郑阿奇__习题参考答案_第3页
Visual C++ 实用教程 第4版_郑阿奇__习题参考答案_第4页
Visual C++ 实用教程 第4版_郑阿奇__习题参考答案_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.7 指针和引用55. 已知int d=5, *pd=&d, b=3; 求下列表达式的值。 A. *pd*b B. +*pd-b C. *pd+ D. +(*pd)答:15, 3 , 5, 6 56选择填充。(1)选择正确的说明语句为( )。A. int Nb; B. int N4,9;C. int N; D. int *N10;答:B(2)若有定义:int a=100,*p=&a;则*p的值是( )。 A变量p的地址 B 变量a的地址值 C变量a的值 D.无意义答:C(3)下述程序的输出结果是( )。#include void main() int a5=2,4,6,8,10; int *

2、p=a, *q=&p; cout*(p+), *q;A. 4,4 B. 2,2 C. 4,2 D. 4,5答:B(4)下述程序片段的输出是( )。int a34=1,2,3,4,5,6,7,8;int x, *p=a0;x=(*p)*(*p+2)*(*p+4);coutxendl;A 15 B 14 C 16 D 13答:A(5)若有以下定义,则下列对数组引用正确的是( )。int (*q)3 = new int23;A. q23 B. *q C. *(*q+2) D. *(*(q+2)+3)答:C(6)若要用如下程序片段使指针变量p指向一个存储动态分配的存储单元: float *p;p=(f

3、loat * ) new float;则空白处应填入: Afloat * B *float C 省略; D.( float )(7)下列表示引用的方法中,( )是正确的。已知:int m=10;A. int &x=m; B. int &y= 10; C.int &z; D. float &t = &m;答:A57分析下列程序的结果。#include int &fun( int n, int s) int &m=sn; return m;void main()int s =15,4,3,2,1,0; fun(3, s)=10; coutfun(3,s)endl;答:1058用指针作为函数的参数,

4、设计一个实现两个参数交换的函数。输入3个实数,按升序排序后输出。59编写函数void fun(int *a,int *n,int pos,int x);其功能是将x值插入到指针a所指的一维数组中,其中指针n所指存储单元中存放的是数组元素个数,pos为指定插入位置的下标。60编写函数void fun(char *s),其功能是将s所指的字符串逆序存放。61 输入一个字符串, 串内有数字和非数字字符, 例如,abc2345 345fdf678jdhfg945。将其中连续的数字作为一个整数,依次存放到另一个整型数组b中。如将2345存放到bO、345放入b1、678放入b2、统计出字符串中的整数个数

5、,并输出这些整数。要求在主函数中完成输入和输出工作。设计一个函数,把指向字符串的指针和指向整数的指针作为函数的参数,并完成从字符串中依次提取出整数的工作。62有5个学生,每个学生的数据结构包括学号、姓名、年龄、C+成绩、数学成绩和英语成绩、总平均分,从键盘输入5个学生的学号、姓名、3门课的成绩,计算3门课的总平均分,最后将5个学生的数据输出。要求各个功能用函数来实现。第2章 C+面向对象程序设计21 类和对象1什么是类?类的定义格式?类的成员一般分为哪两部分?它们的区别如何?“类”是对具有共同的属性特征和行为特征的对象的概括和抽象。类的定义格式:class 类名 private: 私有数据成员

6、和成员函数 public: 公有数据成员和成员函数 ;类的成员一般分为数据成员和成员函数两部分。数据成员一般用来表示对象属性特征,而成员函数一般表示了对象的可以进行的操作,即行为特征。2类与结构体有什么区别?类中可以包含两类成员数据成员和成员函数;而标准C语言中的结构体只能包含数据成员;但是C+中的结构体对C语言中的结构体有扩展,C+中的结构体也可以两类成员数据成员和成员函数;因此C+中的类和C+中的结构体出来在定义方式上不一样之外(class,struct ),还有就是它们的缺省封装字是不一样的,一个是private,一个是public。3什么是对象?如何定义一个对象?对象的成员如何表示?对

7、象是类的实例,是类的变量。对象的定义: 类名 对象名称; 或:类名 * 对象指针;对象成员的表示:对象名称.成员名字;或: 对象指针成员名字;4什么是构造函数?构造函数有哪些特点?构造函数是类的成员函数,它有以下特点:u 构造函数的名字必须与类名相同。u 构造函数可以有任意的形参,但不能具有返回值。u 定义对象时,编译系统会自动地调用构造函数。u 构造函数可以重载5什么是析构函数?析构函数有哪些特点?析构函数也是类的成员函数,它有以下特点:u 析构函数名也应与类名相同,只是在函数名前面加一个波浪符。u 析构函数不能带任何参数,也没有返回值。u 每个类有而且只能有一个析构函数。析构函数不能重载。

8、 6什么是默认构造函数和默认析构函数?假如用户没有自己编写构造函数或析构函数,编译系统也会自动生成一个构造函数和析构函数,这就是默认的构造函数和析构函数,但是这两个函数没有任何参数,也不进行任何操作。7什么是复制构造函数?它的功能和特点是什么?复制构造函数是一种特殊的构造函数,它用来在已存在的对象基础上建立一个新对象。 复制构造函数的名称也和类名是一样的,但是它的形式参数,都是指向一个已经存在的对象,因此它的形式参数都是这种形式:“const 类名 &ob”,即是一个对象的引用。8什么是静态成员?静态成员的作用是什么?9如何对对象进行初始化? 对象的初始化都是通过构造函数进行的,只要在声明对象

9、时,逐个添好构造函数的实参。10什么是友元?它的作用有哪些?什么是友元函数和友元类?11什么是this指针?它有何作用?一个类可以同时有很多对象存在,许多不同的对象可以调用相同的成员函数,编译系统为了知道当前是那个对象在调用成员函数,因此定义了this指针,this指针其实就是指向当前对象的指针。12什么是类的作用域?对象的生存期有何不同?类的作用域简称类域,它是指在类的定义中由一对花括号所括起来的部分,每一个类都具有相应的类域。类域中定义的变量不能使用auto,register和extern等修饰符,只能用static修饰符,函数也不能用extern修饰符。所谓对象的生存期是指对象从被创建开

10、始到被释放为止的时间,按生存期的不同对象可分为如下三种:1、局部对象:当对象被定义时调用构造函数,该对象被创建,当程序退出定义该对象所在的函数体或程序块时,调用析构函数,释放该对象。2、静态对象:当程序第一次执行所定义的静态对象时,该对象被创建,当程序结束时,该对象被释放。3、全局对象:当程序开始时,调用构造函数创建该对象,当程序结束时调用析构函数释放该对象。13分析下列程序的运行结果。程序1:#include #include class CCounter private: double m_value; public: void SetValue(double v) m_value=v;

11、double GetValue(); int GetNum(); ;double CCounter:GetValue() return sin(10.0*m_value);int CCounter: GetNum() return (int)m_value; void main() CCounter sam; sam.SetValue(50.0); coutThe value is: sam.GetValue()endl; coutThe num is: sam.GetNum()endl;程序2:#include #include class person int age; char name

12、10; public: void init(int i, char *str) age = i; strcpy(name, str); void display() coutname is age years old; ; void main() person demo; demo.init(30, LiMing); demo.display();程序3:#include #include class person int age; char *name; public: void init(int i, char *str) int j; j=strlen(str)+1; name=new

13、charj; strcpy(name, str); age = i; person() delete name; coutdestructor is called.; void display() coutname is age years oldn; ;void main() person demo; demo.init(30, LiMing); demo.display(); 程序4:#include class CSam public: static int m; CSam() m+; CSam( int n ) m = n; static void testm() m+; ; int

14、CSam:m =0;void main() CSam A; CSam B(3); A.testm(); CSam:testm(); coutm = B.mendl; 14定义一个描述学生基本情况的类,数据成员包括姓名、学号、C+、英语和数学成绩,成员函数包括输出数据、置姓名和学号、置3门课的成绩,求出总成绩和平均成绩。#include #include class CStudentInfo char stu_name20; char stu_id10; float C_score; float E_score; float M_score; public: CStudentInfo(char

15、*name, char *id) strcpy(stu_name,name); strcpy(stu_id,id); C_score=E_score=M_score=0.00; void Init(float score1, float score2,float score3) C_score=score1; E_score=score2; M_score=score3; float GetTotal() return (C_score+E_score+M_score); float GetAvg() return (C_score+E_score+M_score)/3; void Displ

16、ay() coutName:stu_name ID:stu_idendl;coutC Language:C_score English:E_score Mathmetics: M_scoreendl; coutTotal is:GetTotal() Average is:GetAvg()endl; ;void main() CStudentInfo stu(andrew,98041011); float score1,score2,score3; coutscore1;coutscore2;coutscore3; stu.Init(score1,score2,score3); stu.Disp

17、lay(); 15设有一个描述坐标点的CPoint类,其私有变量x和y代表一个点的x、y坐标值。编写程序实现以下功能:利用构造函数传递参数,并设其默认参数值为60和75,利用成员函数display()输出这一默认的值;利用公有成员函数setpoint()将坐标值修改为(80,150),并利用成员函数输出修改后的坐标值。16以下是一个类的测试程序,给出类的定义,构造一个完整的程序。执行程序时的输出如下。输出结果:200-60=140主函数为:void main() CTest c; c.init(200, 60); c.print();CTest类的构造如下:#include class CTe

18、st int x,y;public:void init(int x0,int y0)x=x0;y=y0; void print() cout200-60=x-yendl;17设有一个类,其定义如下:#include class CSample char *p1, *p2; public: void init(char *s1, char *s2); void print() coutp1 =p1np2 = p2n; void copy(CSample &one); void free(); 成员函数init()是将s1和s2所指向的字符串分别送到p1和p2所指向的动态申请的内存空间中,函数co

19、py将对象one中的两个字符串复制到当前的对象中,free()函数释放p1和p2所指向的动态分配的内存空间。设计一个完整的程序,包括完成这3个函数的定义和测试工作。 #include #include class CSample char *p1, *p2; public: void init(char *s1, char *s2); void print() coutp1 =p1np2 = p2p1; delete this-p2;void main() CSample a,b; a.init(My name is ,andrew); a.print(); b.copy(a); b.prin

20、t(); a.free(); 本程序的设计是有问题的,最好是把new分配内存写在构造函数中!如此无法进行b.free()!因为对象b没有用new分配内存,因此不可以用delete运算符。18设有一个类,其定义如下:#include class CArray int nSizeOfInt; /整型数组的大小 int nNumOfInt; /整型数组中实际存放的元素个数 int nSizeOfFloat; /浮点数组的大小 int nNumOfFloat; /浮点数组中实际存放的元素个数 int *pInt; /指向整型数组,动态分配内存空间 float *pFloat; /指向浮点数组,动态分配

21、内存空间 public: CArray(int nIntSize=100, int nFloatSize=200); void put(int n); /将n加入到整型数组中 void put(float x); /将x加入到浮点数组中 int getInt(int index); /取整型数组中第index个元素,index从0开始 float getFloat(int index); /取浮点数组中第index个元素,index从0开始 CArray(); /析构函数,释放动态分配的内存空间 void print(); /分别输出整型数组和浮点数组中的所有元素;构造完整的程序,包括类成员函

22、数的定义和测试程序的设计。构造函数中的nIntSize 和nFloatSize分别表示整型数组和浮点数组的大小。CArray:CArray(int nIntSize, int nFloatSize) nSizeOfInt=nIntSize; pInt=new intnSizeOfInt; nSizeOfFloat=nFloatSize; pFloat=new floatnSizeOfFloat;nNumOfInt=0;nNumOfFloat=0;void CArray:put(int n) pIntnNumOfInt+=n;void CArray:put(float x) pFloatnNum

23、OfFloat+=x; int CArray:getInt(int index)if (index=0 & index=0 & index=nNumOfFloat) return pFloatindex;CArray:CArray() delete pFloat; delete pInt;void CArray:print() for( int i=0;inNumOfInt;i+) coutpInti ; coutn; for( int j=0;jnNumOfFloat;j+) coutpFloatj ; coutn;void main() int a=10; float x=10.5; CA

24、rray MyArray(10,15); MyArray.put(a); MyArray.put(x); MyArray.put(a+1); MyArray.put(x+1); MyArray.put(a+2); MyArray.put(x+2); MyArray.print();19在一个程序中,实现如下要求:(1)构造函数重载;(2)成员函数设置默认参数;(5)使用不同的构造函数创建不同的对象。#include#includeclass stud private: int num; char name10; char sex; public: stud() num=10010; strcp

25、y(name,Wang Li); sex=F; stud(int n,char nam ,char s ) num=n; strcpy(name, nam) ; sex=s; void display() coutnum:numendl; coutname:nameendl; coutsex:sexendl; ; void main() stud stud1; stud1.display(); stud stud2(10011,Zhang fun,m); stud2.display(); 22 继承和派生类20派生类是如何定义的?它有哪些特点? 定义派生类的一般形式为: class 派生类名:

26、引用权限 基类名 派生类新增的数据成员 派生类新增的成员函数 ;派生类继承了基类的所有数据成员和成员函数,并增加新的成员。21派生类的继承方式有哪些?它们各有哪些特点?这是继承技术中比较关键的问题。从基类继承来的成员的引用,不是简单地把基类的私有成员和公用成员直接作为派生类的私有成员和公用成员来使用,而要根据基类成员的“封装权限”和派生类声明的“引用权限”共同决定。当引用权限为public时,称为“公用派生类”。在公用派生类中,基类的public成员和protected成员仍然成为派生类中的public成员和protected成员;然而基类中的私有成员却成为了派生类中的“不可访问的成员”,不能

27、被派生类使用。当引用权限为private时,称为“私有派生类”。在私有派生类中,基类的公用成员和保护成员成为了派生类中的私有成员,基类的私有成员成为派生类“不可访问的成员”。从以上两点可以看出,基类中的私有成员在派生类中都成为了“不可访问的成员” 。因此在继承中经常使用另外一种封装字protected,被protected封装的成员称为“保护成员”, 保护成员和私有成员相似,不能被外界引用,但它却可以被派生类的成员函数引用。22在定义派生类的过程中,如何对基类的数据成员进行初始化?基类的数据成员初始化往往是通过基类的构造函数进行的,但是在么在建立派生类的对象时,是不会自动执行基类的构造函数,因

28、而就会使基类中成员变量未初始化。所以在设计派生类的构造函数时,不仅要考虑派生类所增加的成员变量初始化,还应当考虑基类的成员变量初始化。在执行派生类的构造函数时,应当调用基类的构造函数。因此考虑到基类成员变量初始化后,派生类的构造函数一般形式为: 派生类构造函数名(参数表):基类构造函数名(参数表)例如:student(int n,char nam,char s,int a,char ad ):stud(n,nam,s)其中,student类是stud的派生类。23在派生类中能否直接访问基类中的私有成员?在派生类中如何实现访问基类中的私有成员? 在派生类中是不能直接访问基类中的私有成员的,要在派

29、生类中访问基类中的私有成员,只能通过基类所提供的public或protected封装的成员函数进行。 24什么是虚基类?它的作用如何?在声明派生类时,在基类的引用权限前面加上virtual,就将基类声明成了虚基类,即: class 派生类名:virtual 引用权限 基类名虚基类的引入主要是针对多重派生的,是为了消除派生类的二义性使用的。通过虚基类派生出来的新类,同一个成员变量在不同的派生类中都只有一个复制,当通过普通基类派生的新类,同一个成员变量,在不同的派生类中的副本是不一样的。 25分析以下程序的结果。程序一、#include class A private: int a, b; pub

30、lic: A(int i, int j) a=i; b=j; void Offset(int x, int y) a+=x; b+=y; void Display() cout(a,b)endl; ;class B:private A private: int x, y; public: B(int i, int j, int k, int l):A(i,j) x=k; y=l; void Display() coutx,yendl; void Move() Offset(3,5); void Show() A:Display(); ;void main() A e(1,2); e.Displ

31、ay(); B d(3,4,5,6); d.Move(); d.Display(); d.Show();运行结果:程序二、#include class CRoot public: int small; CRoot()small= 2; CRoot(int n) small = n; void showsmall() coutsmall=smallendl; ;class CDer1:public CRoot public: CDer1(int m):CRoot(m) ;class CDer2:public CRoot public: int small; CDer2(int n=0) smal

32、l=n; ;void main() CRoot A; CDer1 B(3); CDer2 C; A.showsmall(); B.showsmall(); C.showsmall(); 运行结果:26.定义一个人员类CPerson,包括数据成员:姓名、编号、性别和用于输入输出的成员函数。在此基础上派生出学生类CStudent(增加成绩)和教师类CTeacher(增加教龄),并实现对学生和教师信息的输入输出。#include class CPerson /声明基类 protected: /基类保护成员 int ID; char name10; char sex; public: CPerson(

33、)cout请输入以下资料:endl; coutID; coutname; coutsex;coutendl; void output() cout编号:IDendl; cout姓名:nameendl; cout性别:sexendl;class CStudent:public CPerson private:float score;public: CStudent() coutscore; void output() CPerson:output(); cout成绩:scoreendl; ; class CTeacher:public CPerson private:int age;public

34、: CTeacher() coutage; void output() CPerson:output(); cout年龄:ageendl; ;void main() CPerson person1; person1.output(); CStudent stu;stu.output(); CTeacher teacher; teacher.output(); 27. 把定义平面直角坐标系上的一个点的类CPoint作为基类,派生出描述一条直线的类CLine,再派生出一个矩形类CRecto要求成员函数能求出两点间的距离、矩形的周长和面积 等。设计一个测试程序,并构造完整的程序。#include #

35、include class CPoint /声明基类 protected: int x0,y0; public: CPoint(int a=0,int b=0) x0=a;y0=b; void output() coutx0=x0endl; couty0=y0endl; ;class CLine:public CPoint private: int x1,y1; public: CLine(int x,int y, int u=0, int v=0):CPoint(x,y) x1=u; y1=v; void output() CPoint:output(); coutx1=x1endl; co

36、uty1=y1endl; double length() return (double)sqrt(x1-x0)*(x1-x0)+(y1-y0)*(y1-y0) ); ; class CRect:public CPoint private: int x1,y1; public: CRect(int x,int y, int u=0, int v=0):CPoint(x,y) x1=u; y1=v; float length() return (float)(2*(x1-x0)+(y1-y0); float area() return (float)(x1-x0)*(y1-y0); ;void m

37、ain() CLine l(1,0,1,1); cout长度=l.length()endl; CRect rect(0,1,4,10); cout周长=rect.length()endl; cout面积=rect.area()endl; 28. 定义一个字符串类CStrOne,包含一个存放字符串的数据成员,能够通过构造函数初始化字符串,通过成员函数显示字符串的内容。在此基础上派生出CStrTwo类,增加一个存放字符串的数据成员;并能通过派生类的构造函数传递参数,初始化两个字符串,通过成员函数进行两个字符串的合并以及输出。(字符串合并可使用标准库函数strcat,需要包含头 文件string.h

38、)#include #include class CStrOne protected: char *pstr; public: CStrOne( char str ) pstr=str; void show() coutstrings=pstrendl; ;class CStrTwo:public CStrOne char *newpstr; public: CStrTwo( char str1 ,char str2 ):CStrOne(str1) newpstr=str2; void show() coutstrings1=pstrendl; coutstrings2=newpstrendl

39、; void joint() char temp100; strcpy(temp, pstr); newpstr=strcat(temp,newpstr); coutnewpstrendl; ;void main() CStrTwo str(My Name is Lian, 45 years old); str.show(); str.joint(); 23 多态和虚函数29什么是多态性?所谓“多态性”就是不同对象收到相同的消息时,产生了不同的动作。这里的消息主要是指对类的成员函数的调用,因此的函数重载就是多态性的表现。30什么是虚函数?为什么要定义虚函数?在函数的声明时,在函数名前面加上vi

40、tual就实现了虚函数的声明。通过虚函数和继承,可以实现运行时的多态性。即在程序执行前,根据函数和参数还无法确定应该调用哪一个函数,必须在程序的执行过程中,根据执行情况动态地确定。31什么是纯虚函数?什么是抽象类?声明纯虚函数的一般格式为: virtual 函数类型 函数名(形参表)=0; 它与一般虚函数不同的是:在纯虚函数的形参表后面多了个“=0”。把函数名赋于0,本质上是将指向函数的指针的初值赋为0,纯虚函数不能有具体的实现代码。抽象类是指至少包含一个纯虚函数的特殊的类。它本身不能被实例化,也就是说不能声明一个抽象类的对象。必须通过继承得到派生类后,在派生类中定义了纯虚函数的具体的实现代码

41、,才能获得一个派生类的对象。32分析下列程序的结果。#include class B public: B() B(int i) b = i; virtual void virfun() coutB:virfun() is called.n; private: int b;class D: public B public: D() D(int i, int j):B(i) d=j; private: int d; void virfun() coutvirfun();void main() D *pd = new D; fun(pd);33定义一个抽象类CShape,包含纯虚函数Area()(用

42、于计算面积)和SetData()(用于重设形状大小)。然后派生出三角形CTriangle类、矩形CRect类、圆CCircle类,分别求其面积。最后定义一个CArea类,计算这几个形状的面积之和,各形状的数据通过CArea类构造函数或成员函数来设置。编写一个完整的程序。#include class CShape public: virtual float Area()=0; virtual void SetData(float, float)=0;class CTriangle:public CShape private: float l,h; public: void SetData(flo

43、at width=0, float height=0) l=width; h=height; float Area() cout h*l/2n; return (h*l/2); ;class CRect:public CShape private: float w,h; public: void SetData(float width=0, float height=0) w=width; h=height; float Area() cout h*wn; return (h*w); ;class CCircle:public CShape private: float r; public: void SetData(float radius=0,float l=0) r=radius; float Area() cout 2*3.1416*r*rn; return

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论