VisualC++实用教程第4版郑阿奇习题参考答案.docx
- 文档编号:26749252
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:48
- 大小:36.18KB
VisualC++实用教程第4版郑阿奇习题参考答案.docx
《VisualC++实用教程第4版郑阿奇习题参考答案.docx》由会员分享,可在线阅读,更多相关《VisualC++实用教程第4版郑阿奇习题参考答案.docx(48页珍藏版)》请在冰豆网上搜索。
VisualC++实用教程第4版郑阿奇习题参考答案
1.7指针和引用
55.
已知
intd=5,*pd=&d,b=3;
求下列表达式的值。
A.
*pd*b
B.++*pd-b
C.*pd++
D.++(*pd)
答:
15,3
5,6
56.选择填充。
(1)选择正确的说明语句为()。
A.intN['b'];B.intN[4,9];
C.intN[][];D.int*N[10];
答:
B
⑵若有定义:
inta=100,*p=&a;则*p的值是()
A.变量p的地址B.变量a的地址值
C.变量a的值D.无意义
答:
C.
(3)下述程序的输出结果是()。
#inelude
voidmain()
{
inta[5]={2,4,6,8,10};
int*p=a,**q=&p;
cout<<*(p++)<<','<<**q;
}
A.4,4B.2,2C.4,2D.4,5
答:
B
(4)下述程序片段的输出是()。
inta[3][4]={{1,2,3,4},{5,6,7,8}};
intx,*p=a[0];
x=(*P)*(*P+2)*(*p+4);
cout< A.15B.14C.16D.13 答: A ⑸若有以下定义,则下列对数组引用正确的是() int(*q)[3]=newint[2][3]; A.q[2][3]B.*qC.*(*q+2)D.*(*(q+2)+3) 答: C p指向一个存储动态分配的存储单元: 省略;D.(float) (6)若要用如下程序片段使指针变量 float*p;p=(float*)newfloat; 则空白处应填入: A.float*B.*floatC (7)下列表示引用的方法中, 已知: intm=10; A.int&x=m;B.int&y=10; ()是正确的。 C.int&z;D.float&t=&m; 答: A 57.分析下列程序的结果。 #inelude int&fun(intn,ints[]) {int&m=s[n]; returnm; } voidmain() { ints[]={15,4,3,2,1,0}; fun(3,s)=10; cout< } 答: 10 58.用指针作为函数的参数,设计一个实现两个参数交换的函数。 输入3个实数,按升序排序后输出。 59.编写函数voidfun(int*a,int*n,intpos,intx);其功能是将x值插入到指针a 所指的一维数组中,其中指针n所指存储单元中存放的是数组元素个数,pos为指定插入位 置的下标。 60.编写函数voidfun(char*s),其功能是将s所指的字符串逆序存放。 61输入一个字符串,串内有数字和非数字字符,例如,"abc2345345fdf678jdhfg945"。 将其中连续的数字作为一个整数,依次存放到另一个整型数组b中。 如将2345存放到b[O]、 345放入b[1]、678放入b[2]、……统计出字符串中的整数个数,并输出这些整数。 要求在 主函数中完成输入和输出工作。 设计一个函数,把指向字符串的指针和指向整数的指针作为 函数的参数,并完成从字符串中依次提取出整数的工作。 62.有5个学生,每个学生的数据结构包括学号、姓名、年龄、C++成绩、数学成绩和英语 成绩、总平均分,从键盘输入5个学生的学号、姓名、3门课的成绩,计算3门课的总平均分,最后将5个学生的数据输出。 要求各个功能用函数来实现。 第2章C++面向对象程序设计 2.1类和对象 1.什么是类? 类的定义格式? 类的成员一般分为哪两部分? 它们的区别如何? ⑴“类”是对具有共同的属性特征和行为特征的对象的概括和抽象。 ⑵类的定义格式: class类名{ [private: ] 私有数据成员和成员函数 public: 公有数据成员和成员函数 }; ⑶类的成员一般分为数据成员和成员函数两部分。 ⑷数据成员一般用来表示对象属性特征,而成员函数一般表示了对象的可以进行的操作,即 行为特征。 2.类与结构体有什么区别? 类中可以包含两类成员一一数据成员和成员函数;而标准C语言中的结构体只能包含数据成 员;但是C++中的结构体对C语言中的结构体有扩展,C++中的结构体也可以两类成员—— 数据成员和成员函数;因此C++中的类和C++中的结构体出来在定义方式上不一样之外 (class,struct),还有就是它们的缺省封装字是不一样的,一个是private,一个是public。 3.什么是对象? 如何定义一个对象? 对象的成员如何表示? ⑴对象是类的实例,是类的变量。 ⑵对象的定义: 类名对象名称; 或: 类名*对象指针; ⑶对象成员的表示: 对象名称•成员名字; 或: 对象指针t成员名字; 4•什么是构造函数? 构造函数有哪些特点? 构造函数是类的成员函数,它有以下特点: 构造函数的名字必须与类名相同。 构造函数可以有任意的形参,但不能具有返回值。 定义对象时,编译系统会自动地调用构造函数。 构造函数可以重载 5•什么是析构函数? 析构函数有哪些特点? 析构函数也是类的成员函数,它有以下特点: 析构函数名也应与类名相同,只是在函数名前面加一个波浪符〜。 析构函数不能带任何参数,也没有返回值。 每个类有而且只能有一个析构函数。 析构函数不能重载。 6•什么是默认构造函数和默认析构函数? 假如用户没有自己编写构造函数或析构函数,编译系统也会自动生成一个构造函数和析 构函数,这就是默认的构造函数和析构函数,但是这两个函数没有任何参数,也不进行任何 操作。 7•什么是复制构造函数? 它的功能和特点是什么? 复制构造函数是一种特殊的构造函数,它用来在已存在的对象基础上建立一个新对象。 复制构造函数的名称也和类名是一样的,但是它的形式参数,都是指向一个已经存在的对象,因此它的形式参数都是这种形式: “const类名&ob”,即是一个对象的引用。 &什么是静态成员? 静态成员的作用是什么? 9•如何对对象进行初始化? 对象的初始化都是通过构造函数进行的,只要在声明对象时,逐个添好构造函数的实参。 10•什么是友元? 它的作用有哪些? 什么是友元函数和友元类? 11.什么是this指针? 它有何作用? 一个类可以同时有很多对象存在,许多不同的对象可以调用相同的成员函数,编译系统 为了知道当前是那个对象在调用成员函数,因此定义了this指针,this指针其实就是指向 当前对象的指针。 12.什么是类的作用域? 对象的生存期有何不同? 类的作用域简称类域,它是指在类的定义中由一对花括号所括起来的部分,每一个类都 具有相应的类域。 类域中定义的变量不能使用auto,register和extern等修饰符,只能用static修饰符,函数也不能用extern修饰符。 所谓对象的生存期是指对象从被创建开始到被释放为止的时间,按生存期的不同对象可 分为如下三种: 1、局部对象: 当对象被定义时调用构造函数,该对象被创建,当程序退出定义该对象所在的函数体或程序块时,调用析构函数,释放该对象。 2、静态对象: 当程序第一次执行所定义的静态对象时,该对象被创建,当程序结束时,该对象被释放。 3、全局对象: 当程序开始时,调用构造函数创建该对象,当程序结束时调用析构函数释放该对象。 13•分析下列程序的运行结果。 程序1: #inelude #inelude classCCounter { private: doublem_value; public: voidSetValue(doublev){m_value=v;} doubleGetValue(); intGetNum(); }; doubleCCounter: : GetValue() { returnsin(10.0*m_value); } intCCounter: : GetNum() {return(int)m_value;} voidmain() { CCountersam;sam.SetValue(50.0); cout<<"Thevalueis: "< "< } 程序2: #include #include classperson { intage; charname[10]; public: voidinit(inti,char*str) {age=i;strcpy(name,str);} voiddisplay() {cout< }; voidmain() {persondemo; demo.init(30,"LiMing"); demo.display(); } 程序3: #include #include classperson{ intage; char*name; public: voidinit(inti,char*str) { intj; j=strlen(str)+1; name=newchar[j]; strcpy(name,str); age=i; } ~person() {deletename; cout<<"destructoriscalled..."; } voiddisplay() {cout< }; voidmain() {persondemo; demo.init(30,"LiMing"); demo.display(); } 程序4: #include classCSam { public: staticintm; CSam(){m++;} CSam(intn){m=n;} staticvoidtestm(){m++;} }; intCSam: : m=0; voidmain() { CSamA; CSamB(3); A.testm(); CSam: : testm(); cout<<"m="< } 14•定义一个描述学生基本情况的类,数据成员包括姓名、学号、C++、英语和数学成绩, 成员函数包括输出数据、置姓名和学号、置3门课的成绩,求出总成绩和平均成绩。 #include #include classCStudentlnfo { charstu_name[20]; charstu_id[10]; floatC_score; floatE_score; floatM_score; public: CStudentlnfo(char*name,char*id) { strcpy(stu_name,name); strcpy(stu_id,id); C_score=E_score=M_score=0.00; }--- voidInit(floatscore1,floatscore2,floatscore3) { C_score=score1; E_score=score2; M_score=score3; } floatGetTotal() { return(C_score+E_score+M_score); }--- floatGetAvg() { return(C_score+E_score+M_score)/3; }--- voidDisplay() { cout<<"Name: "< "< cout<<"CLanguage: "< "< " < cout<<"Totalis: "< is: "< } }; voidmain() {CStudentlnfostu("andrew","98041011"); floatscore1,score2,score3; cout<<"CLanguage: "; cin>>score1; cout<<"English: "; cin>>score2; cout<<"Mathmetics: "; cin>>score3; stu.lnit(score1,score2,score3); stu.Display(); } 15.设有一个描述坐标点的CPoint类,其私有变量x和y代表一个点的x、y坐标值。 编写程序实现以下功能: 利用构造函数传递参数,并设其默认参数值为60和75,利用成员函数 display()输出这一默认的值;利用公有成员函数setpoint()将坐标值修改为(80,150), 并利用成员函数输出修改后的坐标值。 16.以下是一个类的测试程序,给出类的定义,构造一个完整的程序。 执行程序时的输出如 下。 输出结果: 200-60=140 主函数为: voidmain() { CTestc; c.init(200,60); c.print(); } CTest类的构造如下: #include classCTest { intx,y; public: voidinit(intx0,inty0) {x=x0; y=y0;} voidprint() { cout<<"200-60="< } }; 17.设有一个类,其定义如下: #include classCSample { char*p1,*p2; public: voidinit(char*s1,char*s2); voidprint() {cout<<"p1="< } voidcopy(CSample&one); voidfree(); }; 成员函数init()是将s1和s2所指向的字符串分别送到p1和p2所指向的动态申请的 内存空间中,函数copy将对象one中的两个字符串复制到当前的对象中,free()函数释放 p1和p2所指向的动态分配的内存空间。 设计一个完整的程序,包括完成这3个函数的定义 和测试工作。 #include #include char*p1,*p2; public: voidinit(char*s1,char*s2); voidprint() { cout<<"p1="< } voidcopy(CSample&one); voidfree(); }; voidCSample: : init(char*s1,char*s2){ p1=newchar[strlen(s1)+1]; p2=newchar[strlen(s2)+1]; strcpy(p1,s1); strcpy(p2,s2); } voidCSample: : copy(CSample&one) { if(this! =&one)*this=one; } voidCSample: : free(){ delete[]this->p1; delete[]this->p2; }voidmain() { CSamplea,b; a.init("Mynameis","andrew"); a.print(); b.copy(a); b.print(); a.free(); } 本程序的设计是有问题的,最好是把new分配内存写在构造函数中! 如此无法进行b.free()! 因为对象b没有用new分配内存,因此不可以用delete运算符。 18•设有一个类,其定义如下: #inelude classCArray {intnSizeOflnt;// intnNumOflnt;// intnSizeOfFloat;//intnNumOfFloat;//int*pInt;// float*pFloat;//public: 整型数组的大小 整型数组中实际存放的元素个数 浮点数组的大小 浮点数组中实际存放的元素个数 指向整型数组,动态分配内存空间 指向浮点数组,动态分配内存空间 CArray(intnlntSize=100,intnFloatSize=200); voidput(intn);// voidput(floatx);// intgetInt(intindex);// floatgetFloat(intindex);//~CArray();// voidprint();// 将n加入到整型数组中 将x加入到浮点数组中 取整型数组中第index个元素,index从0开始 取浮点数组中第index个元素,index从0开始 析构函数,释放动态分配的内存空间 分别输出整型数组和浮点数组中的所有元素 };构造完整的程序,包括类成员函数的定义和测试程序的设计。 构造函数中的nFloatSize分别表示整型数组和浮点数组的大小。 nlntSize和 CArray: : CArray(intnlntSize,intnFloatSize){ nSizeOflnt=nlntSize;plnt=newint[nSizeOflnt]; nSizeOfFloat=nFloatSize; pFloat=newfloat[nSizeOfFloat];nNumOflnt=0;nNumOfFloat=0; } voidCArray: : put(intn) { plnt[nNumOflnt++]=n; } voidCArray: : put(floatx) {pFloat[nNumOfFloat++]=x; } intCArray: : getInt(intindex) { if(index>=0&&index<=nNumOflnt)returnpint[index]; floatCArray: : getFloat(intindex) { if(index>=0&&index<=nNumOfFloat)returnpFloat[index]; } CArray: : ~CArray() { delete[]pFloat; delete[]pint; } voidCArray: : print() { for(inti=0;i cout< cout<<'\n: for(intj=O;j cout<<'\n: } voidmain() {inta=10; floatx=10.5; CArrayMyArray(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 #include classstud{ private: intnum; charname[10]; charsex; public: stud(){ num=10010; strcpy(name,"WangLi"); sex='F: } stud(intn,charnam[],chars){num=n; strcpy(name,nam); sex=s; } voiddisplay。 {cout<<"num: "< "< "< voidmain() {studstud1; stud1.display(); studstud2(10011,"Zhangfun",‘m');stud2.display(); } 2.2继承和派生类 20.派生类是如何定义的? 它有哪些特点? ⑴定义派生类的一般形式为: class派生类名: [引用权限]基类名 {派生类新增的数据成员 派生类新增的成员函数 }; ⑵派生类继承了基类的所有数据成员和成员函数,并增加新的成员。 21.派生类的继承方式有哪些? 它们各有哪些特点? 这是继承技术中比较关键的问题。 从基类继承来的成员的引用,不是简单地把基类的私有成员和公用成员直接作为派生类 的私有成员和公用成员来使用,而要根据基类成员的“封装权限”和派生类声明的“引用权 限”共同决定。 1当引用权限为public时,称为“公用派生类”。 在公用派生类中,基类的public成
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VisualC 实用教程 版郑阿奇 习题 参考答案