该用户从未签到
|
三、简答题(25分)
+ Y6 J* b; a9 R$ m" @* @) X" |& b2 W1、头文件中的 ifndef/define/endif 干什么用?
" k) M/ c, \2 q! I# Y起码加上前缀(#)吧,其中 #ifnedf 就是说如果没有定义什么则……
0 G% ^9 f2 }- D! D9 Z#define xxx yyy 就是把之后出现的yyy用xxx替换
7 V% }, K! Y3 P#endif 与#if系列配合使用
. U; }4 G, q, ]' \/ ~6 s2、#include 和 #include “filename.h” 有什么区别? ?/ o% W7 D& X
这个玩笑闹大了…… 估计前是用是指先在系统指定的包含目录中查找文件,""是在当前目录中,当然可以使用绝对路径
: z4 V8 X/ c5 q+ z' j/ V& F3、const 有什么用途?(请至少说明两种)
* {! }! s0 y8 A+ ~' _6 [! n限制变量不被修改,保证函数不修改变量
& Y* f1 W) S2 R3 B. L, P% U4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
2 ~$ D& m# O" k% z指编译的时候使用C风格的函数名9 ~ v2 B! K- V4 e5 b% ~* f
8 w" W4 t3 P; q3 ^; T0 x
四、有关内存的思考题(20分)
, |+ D& g# S( b5 ~) e3 ~void GetMemory(char *p)
; i8 x. e- p! i0 D- O! n' P9 w/ Z; `+ A{
9 F, `7 G! g/ Np = (char *)malloc(100);
6 W) ]# D4 v. a+ v( B b J}' n/ F4 w& B! ^" z
void Test(void)
- [9 Y2 k+ X# D* w1 F{. X& d0 d7 J; W& l8 f
char *str = NULL;
$ j6 n1 [8 n. N2 R0 P% SGetMemory(str);
/ y6 r6 o* l" d5 s! g* lstrcpy(str, "hello world");
- ~, x2 b$ U, K! g7 b/ Oprintf(str);
* H; j5 h" N. ^' p5 z}
' }% S T9 ` N& Q7 |; ]请问运行Test函数会有什么样的结果? G. C1 y: R! |' S
答:错误,str没有正确指向申请的内存地址
( t* }' F2 j* e* S* ^+ ZVoid GetMemory2(char **p, int num)
0 C7 I5 ?+ g- u# I' ^( x{
* q& n+ y$ x& B) H; |6 ?- B*p = (char *)malloc(num);! g x* e7 B. K) J, Q" u
}
% {: o; w+ w Z' j/ H2 ivoid Test(void)( Y4 \( ], t- W' m$ l
{
0 y ^$ J9 x; c) M9 Tchar *str = NULL;
7 b, [7 m3 t! E+ g& P5 d1 f$ ]3 JGetMemory(&str, 100);7 S' A7 N+ r4 m1 g1 A
strcpy(str, "hello");
) X6 l) r; ~2 vprintf(str);
2 I! J: U3 Q5 }1 A2 g}
3 q) B! G; c1 r请问运行Test函数会有什么样的结果?% Q% [/ _3 t2 f. ~
答:正确执行,打印出“Hello”
& A2 K; U6 T T$ }/ qchar *GetMemory(void)
+ L! f( s) Y! f# R{
3 |. p: h) h2 G& schar p[] = "hello world";
" K2 j7 ]3 N& T& H# t: M* n" X& Yreturn p;
# s o/ A; |: Y}! d7 x r" @# g4 d
void Test(void)
3 B) ], m$ [& a& b# s% H{) R: f6 T' X& V2 @: _) o
char *str = NULL;
$ E0 {5 ^8 G- c6 ^! y6 k& ^! rstr = GetMemory();1 Q, d5 {; G0 j- Z+ o
printf(str);
8 j7 M: q$ v' e6 x- i2 Z}
f9 c9 c- m+ w |. i( n, Q6 `请问运行Test函数会有什么样的结果?! W8 O* x9 J( s) V5 |% o8 I
答:错误,str指向的内存地址已经被系统释放
9 t; _+ q* x% K. C7 z. G3 @void Test(void)$ _4 h5 T4 q2 B E0 H( `: N# H7 e
{0 ]7 ~& V9 o, s/ m I) ?0 V
char *str = (char *) malloc(100);3 \6 w4 T+ k' Q) u: E; i) u, a2 h
strcpy(str, “hello”); 8 X& V v8 ?; Z' ~/ u
free(str); 6 q( i. n( i8 k) T6 E4 q8 l6 G0 z
if(str != NULL)
1 E5 _- Q2 H$ W3 }! L7 j; `{
& z+ E( }* P9 Jstrcpy(str, “world”);
1 } A4 g' v5 e) _7 x( q1 Bprintf(str);8 a1 S! {1 N7 L. v, z0 j
}/ f) C; B8 h' R. s$ g' J
}
2 Y- b/ q5 f+ j" T1 q, Q T, P' K! D请问运行Test函数会有什么样的结果?3 U L" j- ` O
答:错误,free函数不负责将str置0,故strcpy无法正确工作7 b4 @0 S1 M/ N& ^+ ` A
5 Q9 Y" K. H9 i: Z; Q' q五、编写strcpy函数(10分): g. Y: X- L, _3 i4 u6 @( i
已知strcpy函数的原型是
. `1 [) m1 Y4 q8 X: u0 tchar *strcpy(char *strDest, const char *strSrc);0 c0 G' j% P, u# f0 \
其中strDest是目的字符串,strSrc是源字符串。% Q6 i, a0 B9 y% Y6 r, n
(1)不调用C++/C的字符串库函数,请编写函数 strcpy
3 \1 O) N8 j1 m# L& G7 l" R: j9 tchar *strcpy(char *strDest, const char *strSrc)- `& _/ o% X0 h ]
{! h6 |& Z* M2 O" ?
if(strDest == NULL || strSrc == NULL) return 0;" w' E5 h; c. a; m7 N
for(int i =0;(strDest[ I] = strSrc[I ]) != 0;i++);! G1 t+ [& t4 c# F; k
return strDest;: B2 F, t i/ E5 b- b% ~
}. _2 u* m) T% j0 ~0 J
2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
. \, ]+ C( ]. M9 P4 T这个倒真不知道,大概是利于编程
; c0 u; o5 z V; ~六、编写类String的构造函数、析构函数和赋值函数(25分)- ?8 y$ i2 k& N% d) e" o
已知类String的原型为:
# [* B' j* k* s$ Y& L1 Nclass String" n; p& ~) C' i: [# B
{
, @! f0 y& m% {0 w public:
( a* g6 O5 c8 o( { String(const char *str = NULL) // 普通构造函数
3 w! k9 ?! v8 J/ e{) H4 ]! T4 w1 B3 A/ i
if(str==NULL){
9 l9 u& k) \" N1 Q0 u6 P. p w7 V" C m_data = new char[1];6 ~% r8 W2 A9 ^. T' }
m_data[0] = 0;
! W2 h) Q) V( Y }; m2 \: l/ N# z$ k8 V( z$ S
else/ Q1 \# U: `( T3 N+ d
{# U8 a8 X* j" ^- ]% ~4 i7 G+ x
m_data = new char[strlen(str) + 1];
0 p) i; {9 _% t" X! K strcpy(m_data,str);
5 [. k/ b! {; X# c2 e }# Q' g1 ?4 F6 @3 u$ `' q
}; c* D" i2 {- s2 R
String(const String &other) // 拷贝构造函数
5 F. X- J( _3 C, A" ]- T/ l5 D{
+ B6 S$ H2 A( _* t *this = other;' [8 A7 W7 r) g( T' ]
}# o, t7 [) A& J
~ String(void) // 析构函数
+ q/ [) d# W+ B{ c, u, v5 ]6 I4 t( Y- q, b
delete [] m_data;9 K8 C5 w% L- M2 S
}
& d; Z4 |& t( c# z# F- T3 S String & operate =(const String &other) // 赋值函数 q. U7 m; n: k1 N9 K: ]4 p; m
{
; p( A- F6 Z4 H% z4 A# }+ L m_data = new char[strlen(other.m_data) + 1];+ a/ B7 |, q/ s# s8 R
strcpy(m_data,str);
( J. F' t7 i0 U5 @$ c; H" b return *this;, V0 c% Z! Q# e8 _3 H" b
}% r$ d9 h+ v) _& J
private:# K# s5 f$ W) K. L$ s
char *m_data; // 用于保存字符串
! [, s# C! P$ W8 P, [% |& Y};7 Q/ Y2 s, V8 o- G6 C2 D! E
请编写String的上述4个函数。# K3 w# U8 l; x3 Q2 R: o
[此贴子已经被作者于2005-6-3 19:23:13编辑过]
" t& _0 H4 I6 z7 r* e2 g3 T- t! K: R |
|