该用户从未签到
|
三、简答题(25分)
0 j- R& P/ M3 e: }3 \1、头文件中的 ifndef/define/endif 干什么用?
' [) Y6 s# W9 H5 B& `起码加上前缀(#)吧,其中 #ifnedf 就是说如果没有定义什么则……$ z3 B4 k/ t0 ?! l' U
#define xxx yyy 就是把之后出现的yyy用xxx替换
) x4 b+ D7 |5 J1 k6 J! b2 p( `- ~#endif 与#if系列配合使用 J4 k6 K, [0 N1 P8 b# G5 {4 W" P
2、#include 和 #include “filename.h” 有什么区别?
5 i/ Y8 }4 }' Y这个玩笑闹大了…… 估计前是用是指先在系统指定的包含目录中查找文件,""是在当前目录中,当然可以使用绝对路径
$ s/ I: I, i+ E! ^( x# C# J3、const 有什么用途?(请至少说明两种) _% y0 y& b6 X- C* O/ o4 S
限制变量不被修改,保证函数不修改变量/ R8 w; L6 I/ |3 o
4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?7 \" u. ?6 W+ _) i
指编译的时候使用C风格的函数名
9 s% }6 G. P$ }& T
- r1 y) J# \4 ~1 ^; D, K+ M四、有关内存的思考题(20分)- G) j! X+ A- f4 e0 ]) M
void GetMemory(char *p)
7 c3 B3 J! M( J7 S0 q& t( a- \6 |# C{
9 d4 N# L2 ^9 ep = (char *)malloc(100);
. G: [# b5 T9 ], u; X/ T}
) ?5 X2 i1 z# C4 C1 ^void Test(void)
" n% j* E" Y* X7 A6 t{: I* r% z* W Y! ~' H: o4 y% Y
char *str = NULL;
' e0 b$ U# ^( C UGetMemory(str); - q6 ?8 u) o& _$ X- }. v/ _( a
strcpy(str, "hello world");
( r/ `0 }2 g, K3 nprintf(str);
8 ?% R" U# `1 s}
# s( W2 K: i: I$ N- \3 S( ^' G/ m请问运行Test函数会有什么样的结果?
/ R+ m; R6 A) i# c答:错误,str没有正确指向申请的内存地址/ e: R' ^" T! _- ?( z* w' x7 p
Void GetMemory2(char **p, int num)- }8 q: r6 f5 N' D* e' U" ^% Z3 F
{
1 e5 H7 f5 P6 w! J# _) P% @4 O" b*p = (char *)malloc(num);
1 _# m* g8 j. t/ X% E1 K7 k}( y7 P7 N9 E1 |# G, z k( q1 i
void Test(void)& s* q+ }8 |) H- k: |
{
) }* {# ~ S0 T0 Lchar *str = NULL;: t' s/ {( Z/ S' O3 i3 F! V' z
GetMemory(&str, 100);; p, p8 e+ {* X3 v! c
strcpy(str, "hello"); ) o9 s) _9 E$ K' g3 [+ x+ M2 }( S
printf(str);
" F7 G) m) P; c! }}* P# i% K$ m' z3 S9 z6 @1 l
请问运行Test函数会有什么样的结果?, Y+ P- X! v/ {' Z5 N; [
答:正确执行,打印出“Hello”
# @* b1 ], [! c6 n2 hchar *GetMemory(void)+ F, I$ P5 N# T) s
{
! f0 D" | _. |/ U+ v% wchar p[] = "hello world";
( n1 N' W9 D. s* r% J) g! v& lreturn p;; c8 q1 [" D8 u/ \6 U
}
; K( W- X$ Q! c$ Q6 e& `2 b& qvoid Test(void)% P Q- y) t) q5 [7 ?1 j. r4 d
{8 B+ o3 a% A( f3 x, o, n- o% c. e
char *str = NULL;+ b# G; F- G8 m$ ^+ u2 o h' Q ]% ]
str = GetMemory();
& F0 ^5 W: @# k8 I. Pprintf(str);
+ A0 _4 }& ^4 }, B4 H}/ @3 s& ~; m" t& |' `% |$ @, h" v' }: ?
请问运行Test函数会有什么样的结果? _ f9 f5 L, p2 r" g+ l" D+ Q
答:错误,str指向的内存地址已经被系统释放
% {# n' m* |. Q/ Bvoid Test(void)
; Y% u8 X6 u" {{5 q5 p% e8 u- v. D2 W; [5 p6 g+ {
char *str = (char *) malloc(100);* A5 a% L+ U3 g
strcpy(str, “hello”); 3 j/ `; m( g% ^, q& O
free(str);
- {# T& ~/ q0 t6 K" sif(str != NULL) I2 p" }/ q, {: ^3 t
{+ G' f9 j$ v; K
strcpy(str, “world”); 0 z) a+ X! j) K. |. D- l* q
printf(str);
; Q& A! l* x% a1 h}4 O% N$ d/ N# b6 W! Y% _
}9 p6 e4 T" q3 Q! v% A; m7 A
请问运行Test函数会有什么样的结果?, C7 y8 o8 k! k6 k% D/ J- M) X
答:错误,free函数不负责将str置0,故strcpy无法正确工作
, O$ M2 I. h' E2 H3 I5 ^; Y4 O& @) r9 K) y3 j
五、编写strcpy函数(10分): V0 t" Q- ]# Q1 ~! W) D5 O" F) Q
已知strcpy函数的原型是
5 F5 x4 i! r4 Mchar *strcpy(char *strDest, const char *strSrc);* v" Y! r4 G; Y" p" J
其中strDest是目的字符串,strSrc是源字符串。
4 L) t+ q( Z4 x9 U( i3 q(1)不调用C++/C的字符串库函数,请编写函数 strcpy
: b) k; H, w6 g! a/ @char *strcpy(char *strDest, const char *strSrc)
/ M- {2 Y V$ z' p9 Y4 D{8 e/ ?* R7 w" y1 x. [# ~
if(strDest == NULL || strSrc == NULL) return 0;
; e7 k& w w' S6 t for(int i =0;(strDest[ I] = strSrc[I ]) != 0;i++);
9 B$ h# a) n- N7 l, Q* i return strDest;: u6 j7 m4 d# y, [3 e% L r6 q9 p- U
}* O2 w- e* Q, `$ A+ J g
2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
$ X' b" H. B4 g" m2 J) s* _( }3 i这个倒真不知道,大概是利于编程" Y r+ r8 X8 [3 Q+ H5 j
六、编写类String的构造函数、析构函数和赋值函数(25分); w0 K. N1 r3 v" d) @' E2 p
已知类String的原型为:
F" B/ g5 L) n$ y1 O4 O6 mclass String
+ _; J3 j) _& g/ K{
: P8 T$ H8 e# K( T- E public:
7 M, R& J2 F. J! U7 v: x+ A* g% X8 A String(const char *str = NULL) // 普通构造函数5 `, [$ T8 A$ v7 P9 N/ E& j! g
{
0 r& Y4 m' H$ }3 ?9 A if(str==NULL){
' @- A* N/ f$ L- X/ T m_data = new char[1];& m4 b% e# I2 P: f
m_data[0] = 0;; M% E5 a( J0 A# T# p
}. I( X* K* c, Q: l
else
% t- Q$ Y. S- b* b- S$ w% F4 S. C/ f {
, s6 ^9 E' c. e/ ?# ~4 q7 I( o m_data = new char[strlen(str) + 1];7 `7 x& \& \4 U* L
strcpy(m_data,str);# ^! [& p& `5 g; _( t
}
; s1 n1 }$ d% x m8 x3 ^$ l0 ^}
) k; A3 _) I+ X! b r String(const String &other) // 拷贝构造函数) v. p% F& E" Z8 M3 r, N7 c
{: V5 |2 ?' N' X# V5 q y0 z7 M
*this = other;3 ?2 M# Y* r' C: O: Q+ o
}5 E4 ^+ ~$ t1 C1 |
~ String(void) // 析构函数# l% Y6 k! y- t: b3 n6 q; w. y
{- g; P* Z3 @% p# `& ]' k
delete [] m_data;
|4 I2 U) M2 P8 i6 w; ]8 v; R}! Z4 d* h' H5 f, j
String & operate =(const String &other) // 赋值函数3 h, H% p+ H( I z' B8 f: U
{
+ X" z1 B+ e& u m_data = new char[strlen(other.m_data) + 1];8 p, O& P5 P3 q
strcpy(m_data,str);/ B* y- p7 r3 h, w- ?0 k6 g, Y+ N8 f- U
return *this;
) D3 r7 _' {2 j( `; k5 q! ?}
: D% M/ m- A# l! v+ Y# t8 u private:
9 Z7 |; G7 t3 J0 \ char *m_data; // 用于保存字符串- p N% K. ? {7 i
};
; @+ ^$ W, Q& x, d5 K/ P请编写String的上述4个函数。
- B9 P# K1 A7 K- Q8 Z/ P4 Q1 y [此贴子已经被作者于2005-6-3 19:23:13编辑过]
. p/ z3 o& t; [* F) u$ C: E# e |
|