该用户从未签到
|
三、简答题(25分)# D/ p0 p* r' f. P/ @* t
1、头文件中的 ifndef/define/endif 干什么用?
: P# Y. D8 S% h起码加上前缀(#)吧,其中 #ifnedf 就是说如果没有定义什么则……3 A6 e- h$ Z, F6 l
#define xxx yyy 就是把之后出现的yyy用xxx替换! V9 B+ l, R$ q: [5 S$ s5 [6 T: A
#endif 与#if系列配合使用) `% j& U/ W% F
2、#include 和 #include “filename.h” 有什么区别?& k5 Q! C1 v" t/ E$ c! K/ B. h
这个玩笑闹大了…… 估计前是用是指先在系统指定的包含目录中查找文件,""是在当前目录中,当然可以使用绝对路径
' l+ M# X, B) l, r1 m# @3、const 有什么用途?(请至少说明两种); L! E }) a' ~: n. \7 Z
限制变量不被修改,保证函数不修改变量
' J4 O6 {& u ~5 f9 i; Y5 q5 _4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?) C1 f+ `, J6 {' J
指编译的时候使用C风格的函数名
5 L9 C7 t, T) s; T6 L( D2 h% A
' b& L. X+ W+ |1 T. K5 L四、有关内存的思考题(20分)6 C/ j) A: [ e1 s+ W, E$ U3 h
void GetMemory(char *p)4 Z/ u* b# L5 a3 _
{" r& c& h- ]2 @1 ?# r. e
p = (char *)malloc(100);1 C1 t$ Q: u6 w
}- l* O! L# V8 @4 x
void Test(void)
) ~# s: B) J+ G1 q( c' q{0 E X v: t) O$ D6 \% ^1 r
char *str = NULL;
! H* `: b/ W, z9 k5 @1 k6 M# P. `2 PGetMemory(str); # n& [3 t. q# D; Z; X
strcpy(str, "hello world");" N! f$ m1 M. o! D
printf(str);5 s) }. k" X% J
}! w" q# i+ |$ Y2 S9 K* C, P( x4 U
请问运行Test函数会有什么样的结果?
2 z" W" T8 F5 a答:错误,str没有正确指向申请的内存地址
- Q8 p8 Z! m7 s6 Q" @, lVoid GetMemory2(char **p, int num)
0 v0 M" Q" `! B! d- H! s/ q9 g [. x+ ?{
$ W! ]% C c) \6 |. O$ R*p = (char *)malloc(num);
) p% f% M2 F. D S9 D( [}
9 _9 N5 `3 |: w- A* T0 s: Uvoid Test(void), |. o% a, } ~& P7 {* C
{7 W) f, I4 C: ]' D1 x6 d5 i4 ^
char *str = NULL;
5 [8 `4 v3 ?: W7 y9 k& z3 LGetMemory(&str, 100);& y7 l# |+ [( f3 T
strcpy(str, "hello"); 1 o0 Z5 S' ~8 b' e8 \" e- A# q
printf(str);
, O: @; D. a! S5 Q4 O& i$ l f. [}; X+ t5 Z% |% @1 l+ ]
请问运行Test函数会有什么样的结果?8 d, S. e" x4 g% R4 x
答:正确执行,打印出“Hello”
( y( E! c6 E9 ?# h. V6 kchar *GetMemory(void)
' p C. r6 w0 K i{ . U" v# _7 x3 {% k* G
char p[] = "hello world";, {% F) x% g; v* q) g2 k- z
return p;
6 f+ m7 P; D& _, g( l- S. z}" l# J, l* T8 I5 g v% H4 s) E, m
void Test(void), ?+ v& ^) i( S6 q" K4 g- w
{' R1 a8 }" @0 t4 }# c7 S
char *str = NULL;
& A+ h+ V- B: d' w2 Vstr = GetMemory();
8 c$ @1 Z3 b! D! P- \, wprintf(str);
y* E5 ^8 d6 ~2 f* z) d, k}! O& w" u3 ^6 G4 ^; a* M5 U
请问运行Test函数会有什么样的结果?* K- L- w$ o1 }) i! o2 W) I2 v# b
答:错误,str指向的内存地址已经被系统释放; l! j6 o/ V9 G' g7 q$ t8 Z
void Test(void)
# z0 h5 l4 R6 G2 N8 L{7 [: r- ^. F' [# Y. w1 m" Q
char *str = (char *) malloc(100);
7 e8 Z% K1 j2 H' E1 j# ystrcpy(str, “hello”); 9 A4 c* g7 I2 h3 @+ I4 S
free(str);
+ T$ T. Q" o1 [9 g, Sif(str != NULL)
) c# d6 U% q: [7 N9 R. i{8 m6 O5 H( ]) C: Z& _/ a
strcpy(str, “world”); + U+ f( B9 Y6 d) ]: r6 p, [+ ~
printf(str);3 A7 R6 z0 o- e
}
1 |. a6 r" i4 B4 e9 J}
3 X( ]5 `- j' Y7 P' C: P; n$ Q请问运行Test函数会有什么样的结果?
# t: _7 X; S% \/ e+ b+ c3 F答:错误,free函数不负责将str置0,故strcpy无法正确工作
" O* G% E" t9 b- s3 l2 W6 X4 n1 `3 t5 @' m+ I1 R
五、编写strcpy函数(10分)
4 X9 q# T% R0 S7 C已知strcpy函数的原型是9 f9 y/ s3 N7 U4 ~1 |8 b, A2 N- o
char *strcpy(char *strDest, const char *strSrc);
/ x& @. E5 ? E2 w# ~其中strDest是目的字符串,strSrc是源字符串。
8 F" m- L& I: I2 @5 B4 Y) p' g(1)不调用C++/C的字符串库函数,请编写函数 strcpy/ x: c5 S* U4 T9 j# |
char *strcpy(char *strDest, const char *strSrc)
9 g$ u3 ^+ j3 \6 W3 @' I- Z{: V3 f+ h: L0 p+ h
if(strDest == NULL || strSrc == NULL) return 0;
0 {! I! x! n! a" Y" k for(int i =0;(strDest[ I] = strSrc[I ]) != 0;i++);: }. a9 Y+ z& q% S& t) y
return strDest;
6 H" O- w, i' |- j! N4 k4 q}
5 w2 e5 V- u0 j) r2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
4 p: U( W( A* T' ?3 L+ R; ^这个倒真不知道,大概是利于编程 M' B3 P5 [8 Y' ?. T- q
六、编写类String的构造函数、析构函数和赋值函数(25分)/ S: l/ \0 {2 F) v
已知类String的原型为:5 p+ g7 q( b" u8 S
class String: B6 k6 R. o/ U
{
0 h8 F% k% _5 b& e% x public:
/ w- f9 g5 W+ _( C) e String(const char *str = NULL) // 普通构造函数
: B+ G2 a. `, ?0 G3 I{
8 g5 z" l% |6 |% [" a+ k. n# I if(str==NULL){
" N- `, Q8 ?1 z3 h8 Y m_data = new char[1];
$ C9 r3 g3 ^$ J5 ~& [6 t m_data[0] = 0;
6 C/ v# b# W- P3 Q }
1 U6 H6 d8 T6 [ else+ q* M, ~4 _4 N% ~
{# d& a5 g" E! C6 U. d; Y
m_data = new char[strlen(str) + 1];
% R& F0 ?' Z7 | strcpy(m_data,str);( u2 o' n) z4 A" F. Z
}. {" {" H' b8 }9 [- o) \
} y; e8 T# U2 H! g$ [' F, U
String(const String &other) // 拷贝构造函数% ~' ?: j- l6 V8 m) j0 M
{6 U: ~0 k+ a1 z, L7 Z
*this = other;6 m- l9 y6 Z+ V3 D1 Q* r
}
) ]7 g: X' Y! q2 M4 A: h ~ String(void) // 析构函数7 I: W2 C3 v- N
{. T. z" v- I/ p* B {
delete [] m_data;8 p4 l2 }. O! p5 S. Y
}) m2 f9 R% r3 i7 Z( V
String & operate =(const String &other) // 赋值函数
& U' G! W |3 p0 O1 f @{" j* w1 ~, g/ Z
m_data = new char[strlen(other.m_data) + 1];& l$ h" M3 f% R8 j; r7 \# X& s
strcpy(m_data,str);# N& F( p$ w. S9 F @4 A
return *this;
6 \" Y) x K9 g" o* \, M* e& t}, y) s( u; i5 {! q/ A( ^7 V M6 v
private:5 O7 o+ Y3 | V, a+ `
char *m_data; // 用于保存字符串" R! J. \, c; G" y$ z
};. W, V3 R- a7 m, ?! H5 _/ i- ?
请编写String的上述4个函数。7 h& K; c+ x# r* P4 ]% S
[此贴子已经被作者于2005-6-3 19:23:13编辑过]
& @6 b+ `9 m- a |
|