|
三、简答题(25分)
6 n* R, p- ~$ d6 p' C6 c, v1、头文件中的 ifndef/define/endif 干什么用?
# o5 m) {- T U3 o! y起码加上前缀(#)吧,其中 #ifnedf 就是说如果没有定义什么则……; b6 z6 T, q( ~& A) S4 Z8 k4 `1 s
#define xxx yyy 就是把之后出现的yyy用xxx替换
9 ~# u, t& Q6 f' X6 r1 N% V#endif 与#if系列配合使用; i/ i5 \6 X$ [6 l& ^: I) C3 F
2、#include 和 #include “filename.h” 有什么区别?2 t- Q! r) ~8 \: _0 }" U7 p2 Q8 z* a
这个玩笑闹大了…… 估计前是用是指先在系统指定的包含目录中查找文件,""是在当前目录中,当然可以使用绝对路径 ; S& {, x- c8 a' M9 g% S8 i, L
3、const 有什么用途?(请至少说明两种)8 C8 H1 R! h) ~* o( D; V# E! P
限制变量不被修改,保证函数不修改变量# Z3 K8 _: b, R: M
4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
, r! d, s) A: ^) X指编译的时候使用C风格的函数名3 ]( k0 x$ c" r# M. ]: q
0 t0 F- l/ ~2 k" \9 O |; {
四、有关内存的思考题(20分)
. n5 Z" w3 G! U) f7 ^void GetMemory(char *p)2 {( k3 j. p. D' m8 r% S
{" D4 Y8 I9 Z. j* V& c( k
p = (char *)malloc(100);& [( L! ?: k% F& o! U1 ?! H8 m
}# t# ~. ~* U$ p( |3 `9 |. X+ w/ N
void Test(void) / l- |/ A) e! p7 d% u( Y
{
5 I) D. o/ I; Nchar *str = NULL;% D/ ~/ t) m- G( I5 M% {( v
GetMemory(str); 7 r7 w4 W4 B+ V3 }7 |+ q
strcpy(str, "hello world");
- |: V/ V6 Y7 K' G# Oprintf(str);
& V I. W$ O+ N0 h}: o6 @0 N" J: v' r( P7 i6 m: m8 Q
请问运行Test函数会有什么样的结果?
8 ^: [/ Q% ^$ {( k: A% G: Z5 E- L答:错误,str没有正确指向申请的内存地址2 r; T- O6 `5 |+ E: k" C, t
Void GetMemory2(char **p, int num)
' y7 g: h: ^3 h. A3 Y7 V3 S, p{+ ~7 J, x2 ?; r6 v3 k! G
*p = (char *)malloc(num);
z" X6 ~, U/ R; @/ ?1 q- s}* }. A% Q6 y) q* w% C# u9 c
void Test(void)( D6 I( H, y$ i: t# h
{5 J* p! @8 l* N+ M9 x% G' i# t; `
char *str = NULL;
: b- c0 Q0 _/ c( [& e I) qGetMemory(&str, 100);0 S' k0 b3 X# u- f" I9 B2 M% }) \
strcpy(str, "hello");
; L. a! `8 z, a( ?printf(str);
" G: x. c& `8 { N; u" }8 Q}0 f8 w" m9 R$ Q6 B- L
请问运行Test函数会有什么样的结果?
q/ a) A. a/ \( U答:正确执行,打印出“Hello”% Q4 x. Y5 m5 ^! S
char *GetMemory(void), P9 q& O7 d& W+ E9 W
{ / T1 f3 g) D! x( }9 b8 I) b l
char p[] = "hello world";
6 Q5 F- n- X3 t, R g8 V* H3 Kreturn p;2 ]( q2 T* x) ?* ?. G9 B. T7 C
}
) [( C) {- o- R" S: V! Uvoid Test(void)
$ Q1 B$ J l! l8 \4 K{
& {' d* k9 \4 F- hchar *str = NULL;% `9 I. E" E& _3 E( S& P Z7 {
str = GetMemory();
' v/ E' U$ o' j; [- w N3 [4 ~printf(str);
6 p1 v$ \1 U# K7 C* J; [3 u}& p. h8 h0 ?5 d& c/ T$ C
请问运行Test函数会有什么样的结果?) A: H6 |/ }1 _ i* ^; Y: \
答:错误,str指向的内存地址已经被系统释放6 \1 o0 J: r! h! C/ n
void Test(void)
# b. U5 ~1 q" q/ G% r \{
* l, Y' G# b' V6 Y1 x9 R9 M2 \char *str = (char *) malloc(100);8 S. l: Y. `8 S4 h! d7 D# ]4 @, R' Z4 j
strcpy(str, “hello”);
* d- O' S# W: \- e Zfree(str);
% I( x( T& J/ ^% jif(str != NULL) , w+ X* B2 v6 F. [
{
/ M6 L/ n1 ?, l. N2 H0 T5 Istrcpy(str, “world”);
2 R) O* Z& t$ U7 _printf(str);* N; k8 a$ ]* G
}! l' v& P1 Y- t* B( \3 V
}; Z: Y# D- Z- q, m% g
请问运行Test函数会有什么样的结果?. e, O- d8 i$ r: A
答:错误,free函数不负责将str置0,故strcpy无法正确工作& Y3 W" R3 {, N
z0 R3 G5 R. `2 N" x
五、编写strcpy函数(10分)6 W8 G' u: m6 V; d2 A
已知strcpy函数的原型是4 X, [& {- @8 k8 q
char *strcpy(char *strDest, const char *strSrc);
2 k0 R a6 z4 H; j4 D2 T其中strDest是目的字符串,strSrc是源字符串。
# ^; X$ ? n, R* k2 A' h(1)不调用C++/C的字符串库函数,请编写函数 strcpy E) K% Q. e2 {9 }: q7 m
char *strcpy(char *strDest, const char *strSrc)/ g# `2 n2 U" E" Y6 t$ y
{
0 C8 f. Q( d3 r3 r if(strDest == NULL || strSrc == NULL) return 0;$ j1 ^7 Y) e( ^- K+ h8 n
for(int i =0;(strDest[ I] = strSrc[I ]) != 0;i++);& B, r, A6 R" v3 l( U( U
return strDest;1 z; G0 Q9 F ?1 x4 v* S/ K! j
}8 t$ |, T/ P; u! ?
2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?7 W+ e7 S" ~$ ]( m
这个倒真不知道,大概是利于编程; b! d# f; N4 R: w+ p0 d
六、编写类String的构造函数、析构函数和赋值函数(25分)
, m" C- ~0 a K已知类String的原型为:
% |, ?8 l. c+ @5 c" _2 |class String* d; p$ A, G! a+ C
{
! q$ i# `/ ^5 s; | public:
+ d! d) q4 L. u, j String(const char *str = NULL) // 普通构造函数( N4 J' X9 o, `/ w7 V9 B: W
{
8 |8 A( v& z$ f& Z0 f if(str==NULL){. l. y6 ^( P3 {' z' B
m_data = new char[1];
+ _6 @4 R' f) ~- w2 ?8 d2 u m_data[0] = 0;3 q6 s1 X; f' Z* G
}
% `* E5 G2 O5 j. C* ^# g& | else4 ~" U( r; Q" A
{4 i% x: ~* r/ }4 E J# |7 T: @
m_data = new char[strlen(str) + 1];
4 L* b+ G% y# s, F3 ^" }* r$ Y strcpy(m_data,str);
2 U' ^: d) d5 c% {+ z* g }
, v' O1 q* {% c! e, d; ?}: D$ w7 X$ o' z+ t5 R9 X& ~" v9 ^
String(const String &other) // 拷贝构造函数# u* _5 E! _+ z! N) b3 @
{1 O% r( o5 S* g% [) N2 ]; `
*this = other;/ F9 U+ i/ T1 R. S
}
9 c- T6 q, b7 U/ x5 Y6 R ~ String(void) // 析构函数
& g4 O" N# ]1 `) |. ?5 T{# ^) M% K! d8 ]( [0 t6 F1 h, ?
delete [] m_data;
1 J- J% X8 U4 H7 M# [0 u; ]}
* A$ M: k* k3 ?/ I9 R% W& t. K; n3 f String & operate =(const String &other) // 赋值函数2 V* s y. \# }: i z. B0 s
{/ @5 m! X, o! B+ t5 u$ h
m_data = new char[strlen(other.m_data) + 1];. r2 X z# R. ~) {7 j
strcpy(m_data,str);5 D2 B1 e6 z/ W) }
return *this;
% \( X3 @: r7 x( N5 G- I}7 Z- P H/ b. j) o& j
private:7 x4 R6 N# E7 e! h
char *m_data; // 用于保存字符串
- t; T6 N4 s2 I) b% |};
& m* u+ [+ \2 A( a2 d请编写String的上述4个函数。! \) Y. h6 Y1 F6 U9 x: Q
[此贴子已经被作者于2005-6-3 19:23:13编辑过] , ?* u9 n7 l, X* v7 J% F$ I
|
|