|
三、简答题(25分)
* i L! T" V3 {8 g3 y1、头文件中的 ifndef/define/endif 干什么用?3 P6 T$ B; m8 |7 W$ f, O0 O
起码加上前缀(#)吧,其中 #ifnedf 就是说如果没有定义什么则……1 x; R% |) l" S
#define xxx yyy 就是把之后出现的yyy用xxx替换$ t+ Z" G6 Y6 C5 i. @3 n
#endif 与#if系列配合使用% ~8 P! v4 S; [+ @( a
2、#include 和 #include “filename.h” 有什么区别?2 r. d7 r& u0 n" j
这个玩笑闹大了…… 估计前是用是指先在系统指定的包含目录中查找文件,""是在当前目录中,当然可以使用绝对路径 # v: q7 c" n- R, h+ w
3、const 有什么用途?(请至少说明两种); _' c& ^5 c; C0 E1 o8 T* `
限制变量不被修改,保证函数不修改变量) Q2 ] d9 S( z. f+ q3 }
4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
3 @- m, y+ C$ z7 g/ i- ]指编译的时候使用C风格的函数名
- d3 D: B0 s: D# J6 M/ z7 ?
8 T" R X1 ^) Q/ m% ~6 J0 Y四、有关内存的思考题(20分)
: m) m3 t- B7 a2 @8 _void GetMemory(char *p)
* k' l" c; p2 ]2 ~/ P$ G, P{) ?, K4 b S7 v/ f/ b# {* ^
p = (char *)malloc(100);( ^1 q1 M. ]4 ?7 i3 Y! y) U, l4 x
}! G7 r3 Q1 @0 u
void Test(void) 9 O2 w: [8 p8 g
{
3 j0 `8 T) ~ V2 q% Z' Hchar *str = NULL;- F, U8 z' T# g1 O; ^
GetMemory(str);
0 B1 w" R7 A/ O1 q* Ustrcpy(str, "hello world");
3 v" M; k" i8 w# Wprintf(str);6 f* ]' t$ O9 b3 N3 N
}
: L# q. _* q# n7 }. h请问运行Test函数会有什么样的结果?
8 c/ l6 Y% r' ~- ^5 |$ y" v答:错误,str没有正确指向申请的内存地址. y+ ?; \ R4 n& O) T4 o0 J
Void GetMemory2(char **p, int num)
0 D" Z6 o: r0 g4 Y{
, u! E( x) f9 [9 b*p = (char *)malloc(num);
& f, a9 _2 y1 P8 a9 T+ g}
" R' n& U# X* h, N8 F f) u. F8 z" ~void Test(void)
K) C* c& j# R+ W1 g{. T6 a# K$ A/ Q8 L8 s
char *str = NULL;
* C( F' @9 e! t5 z7 u# [GetMemory(&str, 100);% J. g; u# D* j! y7 ~2 x' i
strcpy(str, "hello"); / i* {3 q- V7 ?' ^4 P7 V- ` F! c; j2 n
printf(str);
N }) K2 [/ @6 S}
" k9 `5 [% Z5 t请问运行Test函数会有什么样的结果?
9 ?- w% e" O# d3 x答:正确执行,打印出“Hello”
& ]0 l4 @7 U3 v0 B. I- o& Pchar *GetMemory(void)
& c4 b' P/ m- K$ k{ s% T- L' E* G) k
char p[] = "hello world";
. p5 Y6 _3 H/ T! ereturn p;. z( C2 Q# J! D& p, ?# q
}
& r( P/ ~, i/ y0 n" evoid Test(void)0 v! I$ r! |, {+ Z* |' R2 y9 o7 P( @
{: G2 y* D& \! I- ^' V; _' ^4 W
char *str = NULL;& N! e" M+ g! {
str = GetMemory();
1 X$ P/ V4 |& `; uprintf(str);
: ~# d# y% k; b7 ~: `" ]0 r}3 @, z2 d# S* |- G
请问运行Test函数会有什么样的结果?( a5 ?7 _' H3 ~' l& W
答:错误,str指向的内存地址已经被系统释放
% [& g$ \' m1 p- y" fvoid Test(void)$ N7 F# ]0 i1 W8 a2 ]9 {3 a
{% Z; g/ [, E6 p3 u& ?1 i9 k
char *str = (char *) malloc(100);
7 Z& [! E, V! }# Y; bstrcpy(str, “hello”);
8 p& E( O& F; B7 H( Nfree(str);
: p* p3 I+ m2 I% ?if(str != NULL) * k1 X! C0 S3 @' m* A7 ?. j' I4 V
{
( b# L4 n) _% L5 c& Y" V% h$ Ustrcpy(str, “world”); - Z" @3 Q' Q6 v B! A o
printf(str);
2 H/ _' Y$ T6 k& L}
- v6 B$ d- t9 [0 }, f. V5 F}: G: q0 k5 G" L+ M* |
请问运行Test函数会有什么样的结果?
3 s( _6 i) j% \7 _- m答:错误,free函数不负责将str置0,故strcpy无法正确工作
2 Z+ t. B4 D" n3 @ B- f9 G1 z, n0 Q
五、编写strcpy函数(10分)
9 ^8 M# C) j7 r" {. M% c已知strcpy函数的原型是
/ y3 A5 [7 v* I; wchar *strcpy(char *strDest, const char *strSrc);# d# ~* p& s, N0 @
其中strDest是目的字符串,strSrc是源字符串。
$ n: o& g, I, I8 _" Z(1)不调用C++/C的字符串库函数,请编写函数 strcpy' X/ Q- d: h5 q
char *strcpy(char *strDest, const char *strSrc)
3 m9 z( V+ E8 ?" |; O{
. h; _0 Q- F' x% t7 O if(strDest == NULL || strSrc == NULL) return 0;
, r2 `" K, L4 i7 E4 G( @$ F9 q# E for(int i =0;(strDest[ I] = strSrc[I ]) != 0;i++);
' A1 I: o1 j9 U" u! A' m+ I return strDest;' ]: \0 F& [9 O( H2 {6 q& L
}& H; k2 R o; k- a
2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?: L/ l" T4 r( f6 h& D; N, C7 }+ A
这个倒真不知道,大概是利于编程, s( K E4 t+ e; l* k. L
六、编写类String的构造函数、析构函数和赋值函数(25分)8 }& ?( N& a. ?* ^ }; n m+ I7 b
已知类String的原型为:
Y$ f; O, N. `2 A4 Q3 y/ Y; |8 Fclass String
& ^ @7 Q* m( f+ M/ S{5 {1 u# p: [2 V, V+ E
public:
. c8 u6 Z) x4 m String(const char *str = NULL) // 普通构造函数
' R0 ]8 P: C' ^5 U1 @4 @{: ^/ X* K! `. w! Z/ K9 @. U) j
if(str==NULL){, W; c& \) R: s) I% z _
m_data = new char[1];$ C! U8 d* `: p7 @1 I
m_data[0] = 0;
1 P! @8 ~8 P2 S4 c1 l }
: e$ `5 k1 u4 E: J else
* U0 V; q0 E3 N1 z {0 y$ j( T* G& W
m_data = new char[strlen(str) + 1];* z2 e7 M$ A0 k2 q3 s: @
strcpy(m_data,str);
( @, A2 r" \8 M! \' x+ _ }' g9 @1 j" p( Q' m) ~
}
; \6 {( B6 V j. ?8 T5 i+ c String(const String &other) // 拷贝构造函数/ u; X; J: h5 N
{
6 k3 h! U% `8 O, v6 k *this = other;
1 C& R' Y, b* a% d}+ |/ } \& V' x% C& V1 c( m
~ String(void) // 析构函数
9 B& b' C0 t$ O3 ]$ H( Z; y, y{, w( }* q7 g" k& R- z0 V
delete [] m_data;5 Z8 E s9 w" U- W. I1 s, R# P
}
9 v/ @" A( ?; O String & operate =(const String &other) // 赋值函数; o! t- S: T& z5 R+ N5 B% x
{3 f& {; n! {" |- ~6 B
m_data = new char[strlen(other.m_data) + 1];8 Q% f) p! k! \# U
strcpy(m_data,str);/ J2 I3 a: F0 P ?. x$ q% Q) x
return *this;2 L) V& d5 W% l" l
}
4 A, }, W: `% F1 y' B: F private:+ y" Y: m4 _5 n( i
char *m_data; // 用于保存字符串& d, @/ s* X/ \8 E* P
};* e- L' {" r4 h. @9 y/ O' n1 B- j# S
请编写String的上述4个函数。" h( s' ]/ j+ z5 a) n0 `
[此贴子已经被作者于2005-6-3 19:23:13编辑过] & G) w, j$ [& x7 _* }+ @3 o
|
|