|
三、简答题(25分)
1 [, t& r) {( v: ^ ?7 Q1、头文件中的 ifndef/define/endif 干什么用?
' x' b2 d" t5 L7 s7 g, W: D- J起码加上前缀(#)吧,其中 #ifnedf 就是说如果没有定义什么则…… I! d7 ?* f7 N
#define xxx yyy 就是把之后出现的yyy用xxx替换
0 v. R+ d& F. x8 Q/ [3 f#endif 与#if系列配合使用
" P; h; r8 X5 `4 B: g7 f2、#include 和 #include “filename.h” 有什么区别?
5 M6 F) p' k$ ^' q) Z; U这个玩笑闹大了…… 估计前是用是指先在系统指定的包含目录中查找文件,""是在当前目录中,当然可以使用绝对路径
5 }+ k: Q1 j1 b/ l3、const 有什么用途?(请至少说明两种)
9 d# p5 k% p; ^+ p限制变量不被修改,保证函数不修改变量9 Z1 b9 f C+ I% ~
4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?- \) Q$ b+ f( X
指编译的时候使用C风格的函数名
% _' ]2 j6 F$ {% b1 b3 }1 g+ t
x! F- k' f% A: `四、有关内存的思考题(20分)0 J# w0 P% v+ a, l3 a
void GetMemory(char *p) o7 ^. M5 T& \9 i: a. X \/ `
{
; |, m$ P; z. I, B! [6 ~5 pp = (char *)malloc(100); A( \2 q8 [: @9 O: z
}
' s6 m# T7 P4 s& ivoid Test(void) # m, m+ |) t) R7 f9 y0 U* g
{
' ]/ m5 M& ?# k Mchar *str = NULL;/ g1 n) L9 U x/ ?1 G
GetMemory(str); ) `0 G( P" T8 K: s9 ?0 ^
strcpy(str, "hello world");
+ Y2 R' a" h5 z( h7 vprintf(str);( g3 R* O* u5 C( f, O# f
}7 _" z. Q' ~$ B1 H3 Q- R3 a
请问运行Test函数会有什么样的结果?
5 _6 j9 @* x0 X# C答:错误,str没有正确指向申请的内存地址
8 ^* D, Z. M, k; @( ~/ W- WVoid GetMemory2(char **p, int num)
. l; `6 P* c3 p2 h# ]+ o6 ]{
3 W( L! M3 x/ n0 t# y5 D, R*p = (char *)malloc(num);0 [" Z8 I, f/ V: ~6 i+ u
}2 q' P; i$ P- ?: O8 S% Y, O) n
void Test(void)1 Y* F, d: A) P2 z- N0 E4 `8 T
{
$ Q% q1 F! q; C9 T+ k7 k0 vchar *str = NULL;
# x5 q n! I- P, D+ LGetMemory(&str, 100);
* q8 p0 u' L& |6 _; b4 U* [$ {4 [* q/ Estrcpy(str, "hello");
: o, ?4 t7 o, s! w% _5 m# e/ Gprintf(str); . x' X& I" x- y1 a p; F5 f- ~9 B
}
6 N! r5 S1 m3 b/ b6 X' q/ P请问运行Test函数会有什么样的结果?0 O: g, Q$ o, K( ]( k/ r
答:正确执行,打印出“Hello”4 W3 |) }) }1 ?( a" G! F6 d. _
char *GetMemory(void)
! f2 N3 Z: O% ^8 c2 U{ ) F j3 U' D8 B D! B9 s0 W
char p[] = "hello world";
{1 P# z0 H' breturn p;3 y4 m- D" e/ j' J! k' w
}# r- B# ^+ p3 n2 u2 E5 N; {
void Test(void) Y/ U7 A, O1 t7 Q- s5 s/ l
{. A+ m. V+ Z4 H+ C% S; @' c
char *str = NULL;
0 e" V1 t9 t- u3 e8 z, H; astr = GetMemory();* O) U6 |( b- j: |% V' _+ z
printf(str);
3 Y. n' m2 \( L9 c% I6 C0 G6 Z}
; N$ r( u v8 e. y/ q ?% p9 y请问运行Test函数会有什么样的结果?
o, [: n: |/ w2 M6 U+ }+ S' P答:错误,str指向的内存地址已经被系统释放
" l- t0 i$ f2 } d# Qvoid Test(void)
4 C& T% I( m9 \( o6 R w; \! s{
2 p4 g; O& L7 g& zchar *str = (char *) malloc(100);
! Q5 t7 t" [/ Z' L" ]strcpy(str, “hello”);
7 Y7 n S# w1 S2 W. G5 Qfree(str); * W! v% B ~# m4 M
if(str != NULL)
9 J' W. ?( d d( Y{1 d: C/ K$ }0 m/ f* b0 ]
strcpy(str, “world”);
4 y% c% d8 p$ H2 X/ j* c7 Wprintf(str);( K* h4 G$ z, c5 L4 M0 P
}! w7 |, U! U( K- F" ^' m1 Z! Y" r
}
4 L, G% S: n Q' i6 S请问运行Test函数会有什么样的结果?
7 g# B0 y6 `! _9 P答:错误,free函数不负责将str置0,故strcpy无法正确工作
4 ?& A, A r) X* [0 M8 V
- M' s& p* A8 i( Q五、编写strcpy函数(10分), R! ~; ?) K3 H; ^/ @+ X$ T
已知strcpy函数的原型是
3 D& a. L# q: W1 l1 vchar *strcpy(char *strDest, const char *strSrc);! M$ _' \1 z3 c3 q$ C& G$ \, a
其中strDest是目的字符串,strSrc是源字符串。/ E+ M7 e* J; ]* T+ H- E
(1)不调用C++/C的字符串库函数,请编写函数 strcpy
' J, Z7 I- b/ j2 }- L. fchar *strcpy(char *strDest, const char *strSrc)
5 R3 a# S* l; S T, A. E7 A{8 I6 ^4 V! B( v0 @& l+ `$ Y
if(strDest == NULL || strSrc == NULL) return 0;, n0 M* p c* I# u" m
for(int i =0;(strDest[ I] = strSrc[I ]) != 0;i++);, ?2 W' r ?4 u9 E% _
return strDest;( k0 o$ u/ V* U3 l
}
% y; H( q8 S9 j8 o2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?9 ?. b1 W1 T2 s# z& N- w
这个倒真不知道,大概是利于编程
# `! Z" s: i/ M( J ]5 Q六、编写类String的构造函数、析构函数和赋值函数(25分)) S3 G& o- L% D6 C9 n2 p
已知类String的原型为:
) I D- ]! o. vclass String
6 U L0 U# n4 H, K3 ^0 m& k) O; d7 C{
n+ ~6 q9 r& ~6 _8 A E8 c" M public:
' {$ e( S( T4 K# y" [) M' K6 { String(const char *str = NULL) // 普通构造函数 j. r% L: U% @
{
* E5 W4 x' [/ W& P( Y& P: J" n if(str==NULL){
1 H) H0 y) m9 L0 f, c m_data = new char[1];
* |( |1 z7 ]6 R% |( [4 x& l m_data[0] = 0;9 n* j1 x' v' E! \- @) g! j
}. `3 ]2 R5 y" u
else" Q4 H' V5 d& g" S! }. ]7 x
{# `5 B8 o7 T+ b7 w( d1 Q7 ]( k3 b
m_data = new char[strlen(str) + 1];
3 A1 R7 D( p$ \5 q, e7 ^ strcpy(m_data,str);4 u4 K9 C# I1 c [
}
( g# O4 R# s1 j5 d3 a, D! w}/ w4 t0 @, B0 b1 J! Z ^" B
String(const String &other) // 拷贝构造函数# E! b# a9 d% n" g- x5 `, Z
{7 t6 A6 K5 E# y
*this = other;+ \# L7 a2 `" n4 D& E
}
% H: D: [+ u# i @4 N ~ String(void) // 析构函数
% F9 O; E) j) D; _: ]- Y0 c4 C{& i' r' s& K; V: l ^) x5 Z' }
delete [] m_data;" U1 `: |0 B. @, l9 b( _6 @
}: k- }9 x9 C+ \# x( ?1 K# l
String & operate =(const String &other) // 赋值函数
. Q6 R7 D; c8 d/ P. s/ j, P% {{! M/ b9 [0 a9 ]/ R
m_data = new char[strlen(other.m_data) + 1];
0 U, J% N4 w! ?' @& R j! N strcpy(m_data,str);
4 {$ A! l3 v4 Z5 B" a$ J/ E+ }0 G( \ return *this;: ^1 ]/ G+ V0 s( }
}
$ ~0 i1 H$ q6 w) G$ ^$ A private:; J8 X9 |- ~6 H- n8 {; v* N
char *m_data; // 用于保存字符串5 V3 l6 x) G, V0 I2 p
};& }3 L8 N- K# d; ~) U0 e
请编写String的上述4个函数。
) r' A$ M& z& S: ?0 v* [ [此贴子已经被作者于2005-6-3 19:23:13编辑过] : D; W$ ~: Z- O2 g! y2 l/ B
|
|