上海大学 面向对象的程序设计 答案资料Word文件下载.docx
- 文档编号:20187722
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:23
- 大小:30.46KB
上海大学 面向对象的程序设计 答案资料Word文件下载.docx
《上海大学 面向对象的程序设计 答案资料Word文件下载.docx》由会员分享,可在线阅读,更多相关《上海大学 面向对象的程序设计 答案资料Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
定义一种类型的别名,而不只是简单的宏替换。
可以用作同时声明指针型的多个对象。
比如:
char*
pa,
pb;
//
这多数不符合我们的意图,它只声明了一个指向字符变量的指针,
和一个字符变量;
以下则可行:
typedef
PCHAR;
一般用大写
PCHAR
可行,同时声明了两个指向字符变量的指针
虽然:
char
*pa,
*pb;
也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。
用途二:
用在旧的C代码中(具体多旧没有查),帮助struct。
以前的代码中,声明struct新对象时,必须要带上struct,即形式为:
struct
结构名
对象名,如:
tagPOINT1
{
int
x;
};
tagPOINT1
p1;
而在C++中,则可以直接写:
对象名,即:
估计某人觉得经常多写一个struct太麻烦了,于是就发明了:
tagPOINT
}POINT;
POINT
这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候
或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。
3.有函数
typedefchar*LPTSTR;
//此处规定了LPTSTR的类型是一个字符型的指针,这里为typedef的用途一
intGetSystemDirectory(LPTSTRlpBuffer,intuSize);
//函数中的两个参数类型,第一个为字符型的指针,第二个为整型
正确的调用代码是(多选)
A.chardir[200];
GetSystemDirectory(dir,200);
//dir[200]表示一个数组,dir也可以理解为该数组第一个成员的地址(类似于指针)
B.char*pdir=newchar[200];
GetSystemDirectory(pdir,200);
//前半句定义了一个字符型的指针pdir并且动态创建了一个长度为200的字符型数组,所以可以满足后半句中函数参数的要求
C.char*dir;
GetSystemDirectory(dir,200);
//前半句定义了一个字符型的指针dir,但是为什么不选这项我也不清楚,我要问问老师
D.stringdir;
//dir的类型是一个字符串型的,不满足函数参数的要求
E.LPTSTRlpBuffer;
GetSystemDirectory(dir,200);
//dir不知道从何而来,前半句定义lpBuffer为一个LPTSTR(字符类型的指针,为什么?
看这道题的第一个注释)类型,并没有提到dir
4.有函数
typedefstruct_SYSTEMTIME{
WORDwYear;
WORDwMonth;
WORDwDayOfWeek;
WORDwDay;
WORDwHour;
WORDwMinute;
WORDwSecond;
WORDwMilliseconds;
}SYSTEMTIME,*LPSYSTEMTIME;
//此处用到了typedef的用途一:
SYSTEMTIME和*LPSYSTEMTIME两者等价,类型都为结构体_SYSTEMTIME,只是SYSTEMTIME定义的变量为结构体_SYSTEMTIMELE类型,而LPSYSTEMTIME定义的变量的指针为结构体_SYSTEMTIME类型
voidGetSystemTime(LPSYSTEMTIMElpSystemTime);
//此处要求lpSystemTime为结构体_SYSTEMTIME的指针
A.LPSYSTEMTIMEtime;
GetSystemTime(time);
//用LPSYSTEMTIME定义变量的形式为LPSYSTEMTIME*time,所以题目中time不是一个指针类型
B.SYSTEMTIME*ptime;
GetSystemTime(ptime);
C.SYSTEMTIMEtime;
GetSystemTime(&
time);
D.SYSTEMTIME*ptime=newSYSTEMTIME;
5.根据下面的调用
charstr[200];
boolok=getstr(str,200);
//①我们观察getstr函数里面的两个参数:
str是一个大小为200的数组的数组名,同时也是指向这个数组第一个元素的指针名(基地址);
200为这个数组的元素个数,也同时是这个数组表示的存储空间里面基地址的偏移量②可以观察到ok的类型是bool型,所以函数getstr也应为bool型
写出其函数原型(多选)
A.voidgetstr(charstr,intsize);
//不符合②
B.boolgetstr(charstr[],intsize);
C.boolgetstr(char*p,intlen);
D.ok=getstr(str,200);
//函数原型应包括函数得到类型
6.下面哪条代码是错误的?
A.strings;
s="
iloveC++"
;
cout<
s<
'
\n'
//p322.5.4读写string
B.strings1="
ilovec++"
chars2[30];
s2=s1;
s2<
//p33的2.5.5,明确说明了赋值时,左边必须是一个string类型得到字符串,右边可以是一个string类型的字符串,也可以是一个C风格的字符串或仅仅是一个char字符
C.strings;
ilove"
s+="
C++"
//p342.5.6字符串的连接
D.strings="
iloveyou"
t;
t=s+"
!
"
t<
//同上
7.如下代码的输出是p.x=4p.y=-11//注意cout输出内容的格式,不要忘记“p.x=”,“p.y=”
structpoint
{intx,y;
voidmove(point&
q)
{q.x--;
q.y++;
intmain()
pointp;
p.x=5;
p.y=-12;
move(p);
p.x="
p.x<
p.y="
p.y<
8.如下代码的输出是*p.x=4*p.y=-11
#include<
int*x,*y;
--*q.x;
//此处是将q.x所指向的内容自减1
++*q.y;
//此处是将q.y所指向的内容自增1
inta=5,b=-12;
p.x=&
a;
//此处,令a的地址为p.x
p.y=&
//此处,令b的地址为p.y
*p.x="
*p.x<
*p.y="
*p.y<
9.写一段代码double*db_ptr=newdouble;
分配一个类型为double的存储空间,并将它的地址赋给变量db_ptr
//此题代码也可为:
double*db_ptr;
db_ptr=newdouble;
10.下面代码输出为5,有一行错误修改为:
int&
ai(inti)
intj=1;
改为staticintj=1;
//因为代码定义了一个引用返回类型,j和b直接关联在一起,没改之前,当returnj时,存储j的空间已经收回,所以要把j改为静态(全局)变量
j+=i;
returnj;
int&
b=ai
(1);
b++;
b=ai
(2);
11.下面代码填空//此题主要是考枚举的概念,p282.4.4
enum{MinSize=0,MaxSize=1000};
enumColor{red=0xff0000,green=0xff00,blue=0xff};
voiddraw(Colorcolor)
if(color==red)
cout<
红"
endl;
elseif(color==green)
绿"
elseif(color==blue)
蓝"
intmain(intargc,char*argv[])
inta[MaxSize];
for(inti=0;
i<
MaxSize;
i++)
a[i]=i;
Colorcolor=red;
draw(color);
12.下面代码的输出er:
越界!
012//此题考察例外处理,p532.8
constintMaxSize=3;
intcurr=0;
intA[MaxSize];
voidappend(intx)
if(curr<
MaxSize)
A[curr++]=x;
else
throw"
er:
越界!
inti;
try
for(i=0;
5;
append(i);
catch(char*e)
e<
for(intj=0;
j<
i;
j++)
A[j]<
"
☆第三章类
类
(1)
设计并实现类(P1273-7)
1.填空
classProfession
stringname;
stringtitle;
doubleavgIncom;
public:
Profession(){}//构造函数
Profession(stringname){this->
name=name;
}//构造函数
~Profession(){}//析构函数
intCompareIncome(Profession&
profes)
if(this->
avgIncom<
profes.getavgIncom())return-1;
elseif(this->
avgIncom==profes.getavgIncom())return0;
//根据main函数最后输出结果的形式得出,特别注意C++的等于用“==”表示
elsereturn1;
staticintCompareIncome(Profession&
profes1,Profession&
profes2)
if(profes1.getavgIncom()<
profes2.getavgIncom())return-1;
elseif(profes1.getavgIncom()>
profes2.getavgIncom())return1;
elsereturn0;
stringgetname(){returnname;
}//name是字符串类型
stringgettitle(){returntitle;
doublegetavgIncom(){returnavgIncom;
}//avgIncom是double型
voidsetname(stringname){this->
name=name;
}//表示Profession类里面定义的name被setname的参数赋值
voidsettitle(stringtitle){this->
title=title;
voidsetavgIncom(doubleavgIncom){this->
avgIncom=avgIncom;
Professionprof[2];
2;
stringname;
stringtitle;
doubleavgIncom;
cin>
name>
title>
avgIncom;
prof[i].setname(name);
//在循环中对两个prof都进行setname操作,但是要它们自己调用自己的成员函数setname
prof[i].settitle(title);
prof[i].setavgIncom(avgIncom);
for(i=0;
prof[i].getname()<
\t"
prof[i].gettitle()<
prof[i].getavgIncom()<
//两个prof分别调用各自的成员函数getname
intcomp=Profession:
CompareIncome(prof[0],prof[1]);
//用到Profession类里面的函数,调用方法就为以上形式
prof[0].getname()<
avgIncom比"
prof[1].getname();
if(comp<
0)
少"
elseif(comp>
多"
相同"
2.改写settitle成员函数为外式实现
voidProfession:
settitle(stringtitle){this->
//因为是外联式实现(写在类外面),所以要用到“:
”域解析操作符
3.改写析构函数为外联式实现
Profession:
~Profession(){}
//同理
4.考察main()函数中的调用代码:
prof[i].settitle(title);
设对象prof[0]的地址0x11234567,对象prof[1]的地址0x21234567那么运行分别进入成员setname函数体中,
this值分别是0x11234567、0x21234567
//p119最右边有■的一句话:
this指向对象c1,即this的值为&
c1
类
(2)
以下是第3章类教材中的练习
1.78页3.1.8-2Airplaneairplane;
(注:
对象名airplane)Airplaneairplanes[5];
5个对象的数组,名airplanes)
2.79页3.1.8-5//与struct区别开来,struct成员都是公有的
A.私有B.公有
3.79页3.1.8-9改为//此题牵涉到成员函数外联实现的表现形式
A.private:
unsignedgetHeadCount()const;
B.unsignedCircus:
getHeadCount()const{...}
C.Circus:
unsignedgetHeadCount()const{...}
D.unsignedCircus:
getHeadCount(){...}
4.82页3.2.7-2getTop其声明及内联式的实现(注:
不考虑栈可能是空的情况)intgetTop(){returnarr[top];
}//所写代码只要满足要求即可
5.85页3.3.5-5错的地方修改为
A.voidsetAux(string&
s){dm=s;
B.voidsetAux(conststring&
s)const{dm=s;
C.voidset(string&
s)const{setAux(s);
D.voidset(conststring&
s){setAux(s);
}//修改之前set函数使用const标记的,而setAux是非const类型,所以这种调用是错误的,具体陈述请见p84最后一段
6.105页3.5.12-2错的地方修改为Z();
//构造函数没有函数类型
7.106页3.5.12-7错的地方修改为public:
//构造函数需要被调用,所以必须为公有成员函数
8.106页3.5.12-9错的地方修改为R(constR&
arg);
参量要使用const修饰)//拷贝构造函数的定义,p953.5.4
9.106页3.5.12-13输出1-999//这道题要说明什么我也不清楚
10.107页3.5.12-19错的地方修改为
A.public:
voidC(inta){c=a;
B.constintc=0;
C.public:
constintc;
D.public:
C(inta)c(a){}
//此题表示的是,当要对const类型的对象赋值时,不能直接在函数内部赋值,需要用到构造函数的初始化段
11.108页3.5.12-22错的地方修改为~A();
//析构函数没有函数类型
12.117页3.7.4-3补上所缺的代码intC:
x=0;
设初值为0)
//因为x为static类型,属于全局变量,所以可以在类的外面对x赋值,但要用到“:
13.117页3.7.4-4错误地方修改为
A.++this->
xB.this->
++x
C.s函数内不能访问xD.public:
intx;
//static函数不能访问非static内容,具体陈述见p155中间一段
14.117页3.7.4-5输出123//s为static类型,属于全局变量
15.120页3.8.2-1错的地方修改为
A.voidg(C&
c1);
B.g(c1);
C.p->
m();
D.c1.g(&
c1);
//必须用这种形式,p118例3-42
以下是自编练习:
16.设有classCC{public:
CC(intx){}};
以下创建对象的方法正确的有(多选)
A.CCc
(1);
B.CC*pc=newCC
(1);
C.CCcs[2]={C
(1),C
(2)};
D.CCc;
E.CCcs[2]={1,2};
F.CCc1
(1);
CCc2(c1);
//因为构造函数带有参数,所以创建对象时,必须要带参数创建,所以只有D没有带参数,故选ABCEF
17.设有classCC{public:
voidm();
staticvoidsm();
inta;
staticints;
以下正确的有(多选)
A.CCc;
c.m();
c.sm();
B.CCc;
CC:
C.CCc;
sm();
D.CCc;
E.intCC:
s=0;
F.voidCC:
sm(){s=9;
G.voidCC:
m(){this->
s=9;
}H.voidCC:
sm(){this->
a=9;
//见p115例3-39后面有一个表格,说明了当成员函数是static类型时,可以用C:
sm()调用,也可以用c.sm()调用;
当成员函数非static类型时,只能用c.m()调用。
故B、D错误,另static成员函数只能访问static成员,a为非static类型,所以H错误
☆第四章继承
1.
137页4.2.5-1
2(个)。
//本身有一个y,又从A类继承了一个x
2.
137页4.2.5-2错的地方可修改为(多选)
intx;
B.public:
inty;
C.protected:
D.protected:
//若x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 上海大学 面向对象的程序设计 答案资料 上海 大学 面向 对象 程序设计 答案 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)