VC++习题参考答案.docx

上传人:b****8 文档编号:29319998 上传时间:2023-07-22 格式:DOCX 页数:30 大小:59.65KB
下载 相关 举报
VC++习题参考答案.docx_第1页
第1页 / 共30页
VC++习题参考答案.docx_第2页
第2页 / 共30页
VC++习题参考答案.docx_第3页
第3页 / 共30页
VC++习题参考答案.docx_第4页
第4页 / 共30页
VC++习题参考答案.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

VC++习题参考答案.docx

《VC++习题参考答案.docx》由会员分享,可在线阅读,更多相关《VC++习题参考答案.docx(30页珍藏版)》请在冰豆网上搜索。

VC++习题参考答案.docx

VC++习题参考答案

习题参考答案

指针和引用

55.已知intd=5,*pd=&d,b=3;求下列表达式的值。

A.*pd*bB.++*pd-bC.*pd++D.++(*pd)

答:

15,3,5,6

56.选择填充。

(1)选择正确的说明语句为()。

A.intN['b'];B.intN[4,9];

C.intN[][];D.int*N[10];

答:

B

(2)若有定义:

inta=100,*p=&a;则*p的值是()。

A.变量p的地址B.变量a的地址值

C.变量a的值D.无意义

答:

C.

(3)下述程序的输出结果是()。

#include<>

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

(5)若有以下定义,则下列对数组引用正确的是()。

int(*q)[3]=newint[2][3];

A.q[2][3]B.*qC.*(*q+2)D.*(*(q+2)+3)

答:

C

 

(6)若要用如下程序片段使指针变量p指向一个存储动态分配的存储单元:

float*p;

p=(float*)newfloat;

则空白处应填入:

A.float*B.*floatC省略;D.(float)

(7)下列表示引用的方法中,()是正确的。

已知:

intm=10;

A.int&x=m;B.int&y=10;&z;D.float&t=&m;

答:

A

57.分析下列程序的结果。

#include<>

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.什么是对象如何定义一个对象对象的成员如何表示

⑴对象是类的实例,是类的变量。

⑵对象的定义:

类名对象名称;

或:

类名*对象指针;

⑶对象成员的表示:

对象名称.成员名字;

或:

对象指针→成员名字;

4.什么是构造函数构造函数有哪些特点

构造函数是类的成员函数,它有以下特点:

构造函数的名字必须与类名相同。

构造函数可以有任意的形参,但不能具有返回值。

定义对象时,编译系统会自动地调用构造函数。

构造函数可以重载

5.什么是析构函数析构函数有哪些特点

析构函数也是类的成员函数,它有以下特点:

析构函数名也应与类名相同,只是在函数名前面加一个波浪符~。

析构函数不能带任何参数,也没有返回值。

每个类有而且只能有一个析构函数。

析构函数不能重载。

 

6.什么是默认构造函数和默认析构函数

假如用户没有自己编写构造函数或析构函数,编译系统也会自动生成一个构造函数和析构函数,这就是默认的构造函数和析构函数,但是这两个函数没有任何参数,也不进行任何操作。

7.什么是复制构造函数它的功能和特点是什么

复制构造函数是一种特殊的构造函数,它用来在已存在的对象基础上建立一个新对象。

复制构造函数的名称也和类名是一样的,但是它的形式参数,都是指向一个已经存在的对象,因此它的形式参数都是这种形式:

“const类名&ob”,即是一个对象的引用。

8.什么是静态成员静态成员的作用是什么

9.如何对对象进行初始化

对象的初始化都是通过构造函数进行的,只要在声明对象时,逐个添好构造函数的实参。

10.什么是友元它的作用有哪些什么是友元函数和友元类

11.什么是this指针它有何作用

一个类可以同时有很多对象存在,许多不同的对象可以调用相同的成员函数,编译系统为了知道当前是那个对象在调用成员函数,因此定义了this指针,this指针其实就是指向当前对象的指针。

12.什么是类的作用域对象的生存期有何不同

类的作用域简称类域,它是指在类的定义中由一对花括号所括起来的部分,每一个类都具有相应的类域。

类域中定义的变量不能使用auto,register和extern等修饰符,只能用static修饰符,函数也不能用extern修饰符。

所谓对象的生存期是指对象从被创建开始到被释放为止的时间,按生存期的不同对象可分为如下三种:

  1、局部对象:

当对象被定义时调用构造函数,该对象被创建,当程序退出定义该对象所在的函数体或程序块时,调用析构函数,释放该对象。

  2、静态对象:

当程序第一次执行所定义的静态对象时,该对象被创建,当程序结束时,该对象被释放。

  3、全局对象:

当程序开始时,调用构造函数创建该对象,当程序结束时调用析构函数释放该对象。

13.分析下列程序的运行结果。

程序1:

#include<>

#include<>

classCCounter

{

private:

doublem_value;

public:

voidSetValue(doublev){m_value=v;}

doubleGetValue();

intGetNum();

};

doubleCCounter:

:

GetValue()

{

returnsin*m_value);

}

intCCounter:

:

GetNum()

{return(int)m_value;}

voidmain()

{

CCountersam;

;

cout<<"Thevalueis:

"<<()<

cout<<"Thenumis:

"<<()<

}

程序2:

#include<>

#include<>

classperson

{

intage;

charname[10];

public:

voidinit(inti,char*str)

{age=i;strcpy(name,str);}

voiddisplay()

{cout<

};

voidmain()

{persondemo;

(30,"LiMing");

();

}

程序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;

(30,"LiMing");

();

}

程序4:

#include<>

classCSam

{

public:

staticintm;

CSam(){m++;}

CSam(intn){m=n;}

staticvoidtestm(){m++;}

};

intCSam:

:

m=0;

voidmain()

{

CSamA;

CSamB(3);

();

CSam:

:

testm();

cout<<"m="<<<

}

 

14.定义一个描述学生基本情况的类,数据成员包括姓名、学号、C++、英语和数学成绩,成员函数包括输出数据、置姓名和学号、置3门课的成绩,求出总成绩和平均成绩。

#include<>

#include<>

classCStudentInfo

{

charstu_name[20];

charstu_id[10];

floatC_score;

floatE_score;

floatM_score;

public:

CStudentInfo(char*name,char*id)

{

strcpy(stu_name,name);

strcpy(stu_id,id);

C_score=E_score=M_score=;

}

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:

"<GetTotal()<<"Averageis:

"<GetAvg()<

}

};

voidmain()

{CStudentInfostu("andrew","");

floatscore1,score2,score3;

cout<<"CLanguage:

";

cin>>score1;

cout<<"English:

";

cin>>score2;

cout<<"Mathmetics:

";

cin>>score3;

(score1,score2,score3);

();

}

15.设有一个描述坐标点的CPoint类,其私有变量x和y代表一个点的x、y坐标值。

编写程序实现以下功能:

利用构造函数传递参数,并设其默认参数值为60和75,利用成员函数display()输出这一默认的值;利用公有成员函数setpoint()将坐标值修改为(80,150),并利用成员函数输出修改后的坐标值。

16.以下是一个类的测试程序,给出类的定义,构造一个完整的程序。

执行程序时的输出如下。

输出结果:

200-60=140

主函数为:

voidmain()

{

CTestc;

(200,60);

();

}

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<>

classCSample

{

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;

("Mynameis","andrew");

();

(a);

();

();

}

本程序的设计是有问题的,最好是把new分配内存写在构造函数中!

如此无法进行()!

因为对象b没有用new分配内存,因此不可以用delete运算符。

 

18.设有一个类,其定义如下:

#include<>

classCArray

{intnSizeOfInt;

2C

义一个人员类CPerson,包括数据成员:

姓名、编号、性别和用于输入/输出的成员函数。

在此基础上派生出学生类CStudent(增加成绩)和教师类CTeacher(增加教龄),并实现对学生和教师信息的输入/输出。

#include<>

classCPerson把定义平面直角坐标系上的一个点的类CPoint作为基类,派生出描述一条直线的类CLine,再派生出一个矩形类CRecto要求成员函数能求出两点间的距离、矩形的周长和面积等。

设计一个测试程序,并构造完整的程序。

#include<>

#include<>

classCPoint定义一个字符串类CStrOne,包含一个存放字符串的数据成员,能够通过构造函数初始化字符串,通过成员函数显示字符串的内容。

在此基础上派生出CStrTwo类,增加一个存放字符串的数据成员;并能通过派生类的构造函数传递参数,初始化两个字符串,通过成员函数进行两个字符串的合并以及输出。

(字符串合并可使用标准库函数strcat,需要包含头文件

#include<>

#include<>

classCStrOne

{protected:

char*pstr;

public:

CStrOne(charstr[])

{pstr=str;

}

voidshow()

{cout<<"strings="<

}

};

classCStrTwo:

publicCStrOne

{

char*newpstr;

public:

CStrTwo(charstr1[],charstr2[]):

CStrOne(str1)

{newpstr=str2;

}

voidshow()

{cout<<"strings1="<

cout<<"strings2="<

}

voidjoint()

{chartemp[100];

strcpy(temp,pstr);

newpstr=strcat(temp,newpstr);

cout<

}

 

};

 

voidmain()

{

CStrTwostr("MyNameisLian",",45yearsold");

();

();

}

 

2.3多态和虚函数

29.什么是多态性

所谓“多态性”就是不同对象收到相同的消息时,产生了不同的动作。

这里的消息主要是指对类的成员函数的调用,因此的函数重载就是多态性的表现。

30.什么是虚函数为什么要定义虚函数

在函数的声明时,在函数名前面加上vitual就实现了虚函数的声明。

通过虚函数和继承,可以实现运行时的多态性。

即在程序执行前,根据函数和参数还无法确定应该调用哪一个函数,必须在程序的执行过程中,根据执行情况动态地确定。

31.什么是纯虚函数什么是抽象类

声明纯虚函数的一般格式为:

virtual函数类型函数名(形参表)=0;

它与一般虚函数不同的是:

在纯虚函数的形参表后面多了个“=0”。

把函数名赋于0,本质上是将指向函数的指针的初值赋为0,纯虚函数不能有具体的实现代码。

抽象类是指至少包含一个纯虚函数的特殊的类。

它本身不能被实例化,也就是说不能声明一个抽象类的对象。

必须通过继承得到派生类后,在派生类中定义了纯虚函数的具体的实现代码,才能获得一个派生类的对象。

32.分析下列程序的结果。

#include<>

classB{

public:

B(){}

B(inti){b=i;}

virtualvoidvirfun()

{cout<<"B:

:

virfun()iscalled.\n";}

private:

intb;

};

classD:

publicB

{

public:

D(){}

D(inti,intj):

B(i)

{d=j;}

private:

intd;

voidvirfun()

{cout<<"D:

:

virfun()iscalled.\n";}

};

voidfun(B*obj)

{

obj->virfun();

}

voidmain()

{

D*pd=newD;

fun(pd);

}

 

33.定义一个抽象类CShape,包含纯虚函数Area()(用于计算面积)和SetData()(用于重设形状大小)。

然后派生出三角形CTriangle类、矩形CRect类、圆CCircle类,分别求其面积。

最后定义一个CArea类,计算这几个形状的面积之和,各形状的数据通过CArea类构造函数或成员函数来设置。

编写一个完整的程序。

#include<>

classCShape

{

public:

virtualfloatArea()=0;

virtualvoidSetData(float,float)=0;

};

classCTriangle:

publicCShape

{

private:

floatl,h;

public:

voidSetData(floatwidth=0,floatheight=0)

{l=width;h=height;}

floatArea()

{cout<

return(h*l/2);

}

};

classCRect:

publicCShape

{

private:

floatw,h;

public:

voidSetData(floatwidth=0,floatheight=0)

{w=width;h=height;}

floatArea()

{cout<

return(h*w);

}

};

classCCircle:

publicCShape

{

private:

floatr;

public:

voidSetData(floatradius=0,floatl=0)

{r=radius;}

floatArea()

{cout<<2**r*r<<'\n

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 考试认证 > 其它考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1