|
三、简答题(25分)
* t0 a! j1 q) m k1、头文件中的 ifndef/define/endif 干什么用?/ c0 i/ v$ z B5 r `( z
起码加上前缀(#)吧,其中 #ifnedf 就是说如果没有定义什么则……
" R' Z( {. K# B! N#define xxx yyy 就是把之后出现的yyy用xxx替换; c! W- W- t! P% G& F& }
#endif 与#if系列配合使用
_3 D3 |4 ]; A9 o4 g8 z5 [, ^2、#include 和 #include “filename.h” 有什么区别?
t) W! J1 N- E这个玩笑闹大了…… 估计前是用是指先在系统指定的包含目录中查找文件,""是在当前目录中,当然可以使用绝对路径
3 `8 ^0 ?* A0 H9 Y+ U$ S3、const 有什么用途?(请至少说明两种)5 Y/ j. q7 \% I" F1 h' y) G& g6 Z8 |
限制变量不被修改,保证函数不修改变量
3 M6 @ J5 k# W) L4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
# d* F0 C, Z. a指编译的时候使用C风格的函数名
) N1 a7 l' ?% K: V# q
4 \1 I8 s1 b {& U0 I! r四、有关内存的思考题(20分)
! M0 r! f, d. c& N! @! c4 yvoid GetMemory(char *p)6 \' w; ~( a; D' i- e h2 [
{
5 T' M( T9 q/ p/ d1 `# U. }* p, Q! T( Y2 Fp = (char *)malloc(100);
- r$ O5 Q) ^, ~/ @- t}% y, ?' G( b" h1 g% z# ~' s% y
void Test(void) 1 \+ v; N$ p: s6 H1 q S! p
{9 J9 t, q/ I3 R8 X t- g9 h
char *str = NULL;
' e9 F- |4 b! R; nGetMemory(str);
/ I0 X3 v, o4 A! e0 Wstrcpy(str, "hello world");
5 P1 I/ L' ` b- C: e' xprintf(str);# \6 j& e2 ~7 @6 M: F r1 `
}
! [# I! L4 r) T6 l2 `请问运行Test函数会有什么样的结果?# t5 b$ A! g+ J$ [
答:错误,str没有正确指向申请的内存地址
3 @4 \9 D. [7 k2 u6 [5 L/ |+ VVoid GetMemory2(char **p, int num)1 }6 L/ w; [ O
{2 u# \4 Y( H! L4 X: _! K
*p = (char *)malloc(num);
3 z M1 y1 S2 `0 Z) F}
) o6 { z+ J# q$ B$ F2 T+ ^void Test(void)- b0 g4 M) y+ ^% _2 b
{7 Z- Y4 i( i! I& b$ f
char *str = NULL;" T* X/ R. k G @# w9 |1 z/ D9 U
GetMemory(&str, 100);
. g0 P' v* l" hstrcpy(str, "hello");
! L1 B+ [* X) o: i: g3 s/ ^8 vprintf(str);
4 F' G, R. O; r! |* |}
% h$ |+ x" E0 L/ J: W9 e3 Q& n! W请问运行Test函数会有什么样的结果?( n! i7 ?2 T( q
答:正确执行,打印出“Hello”9 M8 H# {% g' P ^/ d* y/ R
char *GetMemory(void)
7 D# I, A- q4 Q) Z6 x: N! `{ 8 W. N/ q3 m3 T5 h
char p[] = "hello world";
, |) \* ]5 U) Creturn p;
$ |/ n. @+ b7 h}
9 B- |6 Z* u3 l3 rvoid Test(void)
8 I i2 s* {8 S* A$ L{) a9 ]! m; G, [- h, E, n4 Y
char *str = NULL;8 }6 {" M `6 A0 W' z
str = GetMemory();
G. E/ F9 F* bprintf(str);
. q4 Y- l- ^6 _# M I6 ?( N1 f}5 L0 P1 f! C, `8 C$ U
请问运行Test函数会有什么样的结果?
E/ h/ @! n5 r, Y0 o% J" X答:错误,str指向的内存地址已经被系统释放
" T' u5 d) ^0 K3 }/ y! r s0 v$ Fvoid Test(void)3 E7 ^; v0 W8 s. M! L/ C. {
{
3 j- p1 L, ~( |( H& uchar *str = (char *) malloc(100);2 x- R( \1 t# d
strcpy(str, “hello”);
: c/ s2 S1 y) }5 F- B: n8 lfree(str);
! \6 l; Y/ d, w1 P7 Tif(str != NULL) 7 r; u6 i5 D6 ]" V1 @
{+ H% M! t: D0 q ?
strcpy(str, “world”);
7 b4 R A8 J j+ X6 H* R- zprintf(str);7 Q1 @2 \, ~9 R- I- \3 t
}7 s6 H/ {; d( z/ }
}4 W3 v& I5 M* L: u; V, b
请问运行Test函数会有什么样的结果?
]+ t/ [" {7 r6 D# ~. \答:错误,free函数不负责将str置0,故strcpy无法正确工作
) _+ O) W& p% y) N0 V( A; U9 W9 k! v" e1 P) A; T& Q L) C) q
五、编写strcpy函数(10分)
D% n! W# T) P! S! n s8 n已知strcpy函数的原型是
/ M& D, f' J4 P J+ {char *strcpy(char *strDest, const char *strSrc);) N7 m6 D4 A2 ~( |; ]
其中strDest是目的字符串,strSrc是源字符串。0 N1 r, _; x' d" i. s$ c% O
(1)不调用C++/C的字符串库函数,请编写函数 strcpy: m5 T+ _* L# X# z
char *strcpy(char *strDest, const char *strSrc)
3 Z+ a2 ~) } f, g+ Q3 N4 R, r{
1 J) O; {4 N4 a0 { if(strDest == NULL || strSrc == NULL) return 0;) T5 w& L$ E7 h( }, Q3 o
for(int i =0;(strDest[ I] = strSrc[I ]) != 0;i++);
4 P( v" O m" ^1 [1 j return strDest;9 U0 Y; a1 k( t, O6 r
}
- D I7 J3 C) q! i) `/ u0 a2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?! A, j7 H# R3 h! b7 o
这个倒真不知道,大概是利于编程
4 q# U' A7 n% K1 X. l六、编写类String的构造函数、析构函数和赋值函数(25分)
2 K; @8 w$ Z/ h( B8 X( e9 Z' |已知类String的原型为:
; C8 [3 \9 a3 E, \; e% Nclass String! w' m$ i7 ~) y* {$ Q2 ~
{' Q9 o& N& C: w1 ?6 G k1 n. t% u( H
public:+ F1 y5 H" y* ~; Y8 i* P
String(const char *str = NULL) // 普通构造函数
0 o2 M) ?1 l- S9 ~; p4 X{
1 y& T: K- f3 _ if(str==NULL){0 E7 g' N9 {- E& g
m_data = new char[1];. h: L2 ^7 J) \% g; R' F' Z
m_data[0] = 0;; D! I1 a1 |6 O, ]# A" X* @
}5 z# I. `* v2 a7 a+ L
else( T) \. y; ^# u& l# m
{
# _9 t7 ]. w$ F' z+ h m_data = new char[strlen(str) + 1];
1 z& y+ w, d7 s& \ strcpy(m_data,str);7 R& b; H" l$ V7 k' y, C# S
}
1 D1 a- r- }5 P7 {6 `$ {}
1 B: @1 X, [# b; n Z String(const String &other) // 拷贝构造函数
# h; b* E% h ]( Y/ |$ }! W, t" n{
2 `: k N2 v6 ]. Z% J2 B9 e *this = other;" e% O, r0 T1 T! t9 d- \
}9 I, U1 O1 t/ F1 E
~ String(void) // 析构函数( e' @' }7 |' p8 X
{
; \+ m, \6 B& e# } delete [] m_data;# K* B3 I1 }! q- g7 J& W+ ^
}
% |/ f0 [! n3 ?4 z* k7 o: { String & operate =(const String &other) // 赋值函数- M/ r! E% o' ~* S) z! _
{
' X# K8 M1 q' b+ X8 m m_data = new char[strlen(other.m_data) + 1];
3 W3 [* m9 P$ ]1 C$ {, E strcpy(m_data,str);
3 O) B9 R# V8 V) X6 L7 b3 \* N return *this;
4 q, x8 q0 d! N% ]}
- l0 r& K1 S- ?2 K v0 I9 n6 X- i private:- ^' W' f! m6 I
char *m_data; // 用于保存字符串
& _+ P* {0 H$ \ x3 {, p};) Q# K: K& z# P& ?
请编写String的上述4个函数。# `# E; h4 d5 X1 p8 m
[此贴子已经被作者于2005-6-3 19:23:13编辑过]
?7 _# _; i# I. I8 X/ A! v* X |
|