该用户从未签到
|
三、简答题(25分)' O6 f, N) |1 u/ B2 S. |2 A
1、头文件中的 ifndef/define/endif 干什么用?
% D8 z! l/ e8 D& C, Z# @! `起码加上前缀(#)吧,其中 #ifnedf 就是说如果没有定义什么则……
. V1 B8 a5 `# T, { P2 ?#define xxx yyy 就是把之后出现的yyy用xxx替换 e- M! f4 ^% r
#endif 与#if系列配合使用, S7 R3 ]! O% ^9 B) p: G
2、#include 和 #include “filename.h” 有什么区别?. Z& A+ G5 W& P6 A! g
这个玩笑闹大了…… 估计前是用是指先在系统指定的包含目录中查找文件,""是在当前目录中,当然可以使用绝对路径 / N0 V0 V) a3 f: M# b0 m% I, D. V
3、const 有什么用途?(请至少说明两种)
1 {& m' w+ D7 \/ T: a4 ~限制变量不被修改,保证函数不修改变量
7 n+ R O. u; P* l$ [4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
+ g1 S6 F7 t |指编译的时候使用C风格的函数名
$ U0 p; D3 I+ ?+ H g& Y8 i2 ?7 b% A- H$ {
四、有关内存的思考题(20分): n/ V+ c8 _4 C( h7 W
void GetMemory(char *p)$ D9 g$ n9 T; m9 N
{
* n1 Z, I0 W' h( I" ap = (char *)malloc(100);
4 p. E$ I6 Q* r9 L}5 y2 ~( c# [4 b% J% K
void Test(void) 0 e" K! Y4 _6 e- b% h0 R6 w
{% d" I% Q1 B" r6 c0 Z5 R
char *str = NULL;+ y9 }1 k" ?' W/ N/ t" Z9 t! K
GetMemory(str); % s. F& T/ {' d9 i; V' p/ `; q
strcpy(str, "hello world");; o" A$ p6 W! |/ F% Q- U" d2 `2 r6 K0 G
printf(str);
1 F7 ]0 R8 |2 b4 d) w& z}
* H& Q5 \ @# S. E' s1 @/ Q, S请问运行Test函数会有什么样的结果?/ j' t u8 f# P9 V" w# j2 P
答:错误,str没有正确指向申请的内存地址% I- y# t: p( u) i* J2 D5 g0 V: Y% Y
Void GetMemory2(char **p, int num)+ V+ W j' k. K/ f+ s
{
5 f& s3 e' f8 K2 c8 r( l/ [$ ^*p = (char *)malloc(num);- k2 b5 B- @6 u/ Q, j$ p3 U
}, U" |1 x7 [% u s2 W
void Test(void)
! u" B. e. f* K3 l, b- Z% s{, E; ~; V9 ?9 q/ m( K9 r/ y( E
char *str = NULL;
6 e) P0 `( B; EGetMemory(&str, 100);# E8 n$ L) @$ Q% ^: h
strcpy(str, "hello");
$ N5 d* x# c; p7 F3 o: {printf(str);
, R! X/ ]$ w9 Z% w0 P/ C}
, ]: B, y& i( z2 d$ A请问运行Test函数会有什么样的结果?3 z" ?0 Y" [( W, p: y1 d
答:正确执行,打印出“Hello” _8 _4 k- f0 x) ~/ q# S+ l
char *GetMemory(void)# ~# ]& |, o8 ?4 Y
{ - N3 G9 V; O( b. g+ N! D! }
char p[] = "hello world";4 I# D6 p- M$ b% M
return p;
" o0 B' s' `- N! b}% U* [1 o* u) [1 q) g
void Test(void)
# l: F& Y& N- _' w{
/ A) Z& v: Q: }/ p5 wchar *str = NULL;4 j) U/ Q" C2 l6 `! {
str = GetMemory();
8 m% |$ K- i2 q, h& x& mprintf(str);
1 E# ]2 ^6 l/ z$ \}. V7 h, w" g$ n; m; y/ O
请问运行Test函数会有什么样的结果?
! ]5 z* g3 C; P答:错误,str指向的内存地址已经被系统释放% x x7 e: W, w7 E' ^, U# T
void Test(void)2 u! k* ^" X* ]; L1 G0 s- I
{9 c. o: J# i& t1 v! j
char *str = (char *) malloc(100);
6 n3 D' m6 c3 w- `3 Y" T) Cstrcpy(str, “hello”); 5 Q" X/ \6 a9 k2 e: V
free(str);
% V( ^* }9 l# ~+ Z& `' E$ }if(str != NULL)
5 n3 l% M7 D5 @- _% S! e$ E% s+ _{4 c' n- J) z( g( {, ` U$ b
strcpy(str, “world”); - ~/ L$ a8 b! D* K
printf(str);2 ]4 O, z3 G7 M8 k5 d; S' o% _
} ?5 J$ K1 q7 E8 P1 X; b, `
}( f2 x U C+ g7 m
请问运行Test函数会有什么样的结果?
' Z' K+ E' N5 ~( S答:错误,free函数不负责将str置0,故strcpy无法正确工作7 K3 ~, Q9 }7 A. M: }
" ~! a( Q, A2 J' g' L五、编写strcpy函数(10分)) h! b# U- q! g
已知strcpy函数的原型是
1 Q, X: T, ~0 M) A+ [( Z, U! Achar *strcpy(char *strDest, const char *strSrc);: l- _$ L4 E W& a* }6 _/ y
其中strDest是目的字符串,strSrc是源字符串。+ Y" Z( n2 S/ q" w% H7 p
(1)不调用C++/C的字符串库函数,请编写函数 strcpy
+ x( [( b1 H, _ Y; ~char *strcpy(char *strDest, const char *strSrc)8 K$ |* d" \% W
{
0 s K* f' c3 W H4 Z c, H if(strDest == NULL || strSrc == NULL) return 0;( b S+ T7 J( W* H+ T- ?- @
for(int i =0;(strDest[ I] = strSrc[I ]) != 0;i++);
9 }/ R! u2 @% s! V$ L" [ return strDest;
* `+ H/ t4 f" J5 B7 w}
$ @* v7 R* H+ l$ i4 Q* H4 M. \2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?+ d& N2 r- r1 u6 S9 \' v+ [
这个倒真不知道,大概是利于编程+ U1 L; J. e) X. h+ ]5 F
六、编写类String的构造函数、析构函数和赋值函数(25分)
- x4 V" c% c! h% [+ Q已知类String的原型为:
' e$ K7 Q* L5 q# a1 m% Hclass String
0 @) R+ s- M) h1 T{
$ C6 `4 G# C2 a public:
% o( o6 D0 H7 J; x4 H- f String(const char *str = NULL) // 普通构造函数! M9 A( G3 X9 f# ~/ v7 ^* d1 |
{
2 b+ o/ l8 [# S if(str==NULL){
( K3 ~6 i2 M; w5 R& L- C8 n( b, s m_data = new char[1];
1 M4 [) R6 q* Q: U' t( c& d m_data[0] = 0;
4 n B3 }! y/ ~- F4 R1 L" H: N }" }. u: a7 A4 J" `9 ~1 k
else. ]& ^+ A9 c I$ q0 ?- e
{$ n4 o) {1 M8 n( [
m_data = new char[strlen(str) + 1];
: Q7 I. B- n( u* C1 H strcpy(m_data,str);
2 ^5 t$ W, c: p: m }; z% R; u2 h& `" S( X# t
}
* A! c9 Z4 s# h( a; x0 t) f, W String(const String &other) // 拷贝构造函数
: F7 G! `7 R- ]- a; G4 k4 f* x{
M) [+ E O' N- H4 w! f8 G2 V3 I5 _ *this = other;
9 M# F Q; o+ F+ \, t}6 K* p X& v; b: g, T( N& n6 j
~ String(void) // 析构函数$ X: V9 ^7 A# D! u5 Z3 @
{
# a7 y9 T- Y3 o, _" G _ delete [] m_data;
0 q( K/ D {. B) U% w% B! {}* j8 F! r. o. L; [
String & operate =(const String &other) // 赋值函数6 V) a( i3 \! _$ c) a: n1 @' T
{, B; ~* A# z8 Z5 q4 F6 U
m_data = new char[strlen(other.m_data) + 1];
$ _7 X* ?( Q0 W, g( J strcpy(m_data,str);% L4 V* B1 F7 h; ]7 |
return *this;
1 V' ?' b2 v$ F. g/ b5 ~}
# b7 b+ ?$ t4 |3 R* D private:
+ o4 B# d B( Y' f5 _+ u$ r; [# o char *m_data; // 用于保存字符串4 N/ p$ ?5 z) o; |! U% m' n j: ~% @, a
};
" a4 T4 W' o5 b" _: j6 a# {请编写String的上述4个函数。
/ m v8 R! A7 \ ] [此贴子已经被作者于2005-6-3 19:23:13编辑过] . ^; A) u( H! q5 t
|
|