|
三、简答题(25分)+ d* ]" H0 p( H% t) |1 [5 y" r5 I
1、头文件中的 ifndef/define/endif 干什么用?* d8 q% O3 k% V' L, p
起码加上前缀(#)吧,其中 #ifnedf 就是说如果没有定义什么则……
2 _/ l* t1 ~, \" D#define xxx yyy 就是把之后出现的yyy用xxx替换
) Z) u+ V( [( E1 K+ B/ P#endif 与#if系列配合使用' R+ {- s# @& ~. F
2、#include 和 #include “filename.h” 有什么区别?
; W# C) s' J1 g: h2 F这个玩笑闹大了…… 估计前是用是指先在系统指定的包含目录中查找文件,""是在当前目录中,当然可以使用绝对路径
' G0 s v% o* t0 O3、const 有什么用途?(请至少说明两种)
4 ?7 r, ^; N* ?& C! R限制变量不被修改,保证函数不修改变量- X# D$ m: [ M7 a! g, r5 J/ `% E
4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
. ]8 u/ H7 Y* h指编译的时候使用C风格的函数名
" [, e) c% U2 a9 T4 s( Y
9 y& b* \" a1 N7 F9 D四、有关内存的思考题(20分)- }) x9 i( R! Z7 ^
void GetMemory(char *p)
; H0 _' w x( R% {" e/ k{
9 z) r# Y: y6 P4 C% j# W2 x. Ip = (char *)malloc(100);
1 U% \3 Y+ s9 \' D1 i, a) p}
! m; i: B3 s; V3 M7 w( N/ u. Tvoid Test(void)
0 l! A7 s0 C0 m0 }5 J{$ G2 Y$ D8 m) B5 J
char *str = NULL;' U, Q; B0 ^$ M
GetMemory(str); . \" q' l4 Q; H4 m1 A6 e
strcpy(str, "hello world");) ^( g' q/ e, u( O4 H
printf(str);
6 r3 ?7 [' K9 v1 f5 T! P* G}
' i; h" G2 ?( ^3 A: l: c! E2 D请问运行Test函数会有什么样的结果?
, X& A4 ?: l* X& Y$ f3 D; V1 B答:错误,str没有正确指向申请的内存地址
9 T ^* `0 y. z# l9 f& {+ m" ]Void GetMemory2(char **p, int num)
# g% o5 l) r! L! @& ^{
+ S# P" N i4 E8 A/ X*p = (char *)malloc(num);
$ d9 w9 D' V) n5 ] _}
% k/ t5 z" `8 U1 B" z, z! vvoid Test(void)
& ~3 M1 R7 Q& z% k, x2 k% V{
4 }; ^5 ^% `1 O' Lchar *str = NULL;
& Q' U ]3 f0 i1 t0 B9 P! EGetMemory(&str, 100);
/ i) s# {" A$ Gstrcpy(str, "hello"); # e1 z" B0 E! N0 e1 C# Y
printf(str);
. E; r0 R6 M7 K9 k s+ W}
5 R0 ?; B" m/ B) V请问运行Test函数会有什么样的结果?# v0 y4 N5 g9 D0 C/ C3 B2 ?
答:正确执行,打印出“Hello”# H; ?3 n# [+ n! W Q) {4 F' x
char *GetMemory(void)
' Q. M H ^4 Y% P{
6 h S5 K0 L5 d/ P- B* l: _1 S/ }char p[] = "hello world";0 n3 b" Q% q# q5 ^. {, ? _' |
return p;$ U4 ^, ?# P ^& s3 n5 f! G
}
4 q" h9 d2 i+ f4 A, o- @% Lvoid Test(void)
/ z) _& Q4 x8 P8 [/ E6 O{
3 X% n: I3 e# U: Z8 q# f, ]char *str = NULL;
2 a$ G( d/ s, {+ ^4 W" C6 O5 q, kstr = GetMemory();
, a( ?2 B9 e: L' qprintf(str);
! v8 |0 }+ p% s2 U+ K}7 Z( P" A# X a& M0 k
请问运行Test函数会有什么样的结果?3 S" P3 m) Z4 @
答:错误,str指向的内存地址已经被系统释放
* V U2 Z( L) u, e d! s0 P; uvoid Test(void)
) l! W5 i2 I* g: V3 x{" ]. e, Y8 C W
char *str = (char *) malloc(100);3 c- O5 W& v. z( ]6 g0 h5 W
strcpy(str, “hello”);
5 ], o, M; h) L7 P; x$ u8 gfree(str); 4 a% G! `% P. ^) A' Q/ H
if(str != NULL) . l" C( i/ }% L. i# T
{
# s2 k' R8 d0 w) ~- Ustrcpy(str, “world”);
* a7 u) U$ _- M9 I7 e2 R! T$ y5 oprintf(str);" |3 [4 n! R" S' o" ]# w% _- H
}/ u* i% F7 }( O/ K9 r
} H, [5 L7 `1 ^: F
请问运行Test函数会有什么样的结果?
6 i8 ^, D9 S; t6 a7 l3 m6 f答:错误,free函数不负责将str置0,故strcpy无法正确工作
) i9 Y) D P- z6 H
? L/ {* Z; n5 u五、编写strcpy函数(10分)
8 y6 M; W1 x/ C% j4 Q, a6 c. M已知strcpy函数的原型是, W8 h$ Q: u1 Q- D3 i! D
char *strcpy(char *strDest, const char *strSrc);
& ~6 T2 ?/ k3 W6 V. ]其中strDest是目的字符串,strSrc是源字符串。
+ f4 o2 i& q% b% i+ u" K(1)不调用C++/C的字符串库函数,请编写函数 strcpy
: y3 W" @& v4 {! Xchar *strcpy(char *strDest, const char *strSrc)' L7 b5 q/ b; R G1 z8 m+ f/ B
{
. q( O- K+ @' `. Y# V. ^- Y" w( V if(strDest == NULL || strSrc == NULL) return 0;! F8 K# l% X$ ?8 \
for(int i =0;(strDest[ I] = strSrc[I ]) != 0;i++);# d" j& B. K. X$ v
return strDest;
. }6 n9 j2 H+ b1 U( z/ ~ N}# L m6 k7 r; Z1 y
2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?& @- d7 e. H, `3 u& P5 |
这个倒真不知道,大概是利于编程
4 U4 ^( Y. d3 k- B六、编写类String的构造函数、析构函数和赋值函数(25分) i9 \, Y( x' {
已知类String的原型为:
% M4 d' A/ K; n% B: Bclass String7 N$ C J& ?9 D) v
{$ t- I. \2 Q4 L) M5 a8 M; G
public:- R* w v8 Z. t, e( l
String(const char *str = NULL) // 普通构造函数+ F! I- M& c; V( z
{
% d! o: r8 y; P if(str==NULL){8 C' X `+ M4 k% a
m_data = new char[1];3 s. d9 p/ F: a* W# g, i/ T
m_data[0] = 0;" r4 g. @8 N" q5 f* X7 Q
}& {5 [0 t# n% U6 m8 n) b
else
& F3 u9 l) L" f4 n3 G# M) @ {: b4 D4 C& Y4 ?$ K+ b
m_data = new char[strlen(str) + 1];
1 X# B/ C4 M7 W0 u3 ]4 a strcpy(m_data,str);
! Q% a4 ?; A. l* n3 W) P# X9 H }
- c6 u. s' t8 r6 {8 M5 L) Z6 x6 ^" X}
K. z4 B$ o5 n, A String(const String &other) // 拷贝构造函数0 ~6 e6 e! R4 b+ x N
{
- m) z0 W+ w! R6 R; C9 l *this = other;
6 _4 ?- Z" x8 e/ q}$ F) x" |* o( A' Q
~ String(void) // 析构函数& P% T4 w; {2 a
{
# t& b0 ]4 I9 i delete [] m_data;
) ~. x. W( m( I8 W9 p4 G+ ?}8 ?) t) }$ O1 V8 B; D' l
String & operate =(const String &other) // 赋值函数
% j, X0 o2 H1 u. M# @, L: h{
) P) n, b8 x! }4 m/ F9 o# g# |+ L m_data = new char[strlen(other.m_data) + 1];
2 a$ K7 p" G5 c+ u9 O strcpy(m_data,str);
0 f+ k& w U: U( |/ Y2 ] return *this;
& S/ V: ^ a% g}- ? {$ K$ ?9 m% B! O, b' u
private:
4 \" F" X; x7 r1 F char *m_data; // 用于保存字符串5 w$ s# b2 B: n$ Y4 ?! r C
};
/ }; J2 ~1 T0 \& b( z0 R请编写String的上述4个函数。7 u3 @& L, ?" w9 K* t+ X
[此贴子已经被作者于2005-6-3 19:23:13编辑过] # R" v7 [+ g/ k& |! ~, H& H
|
|