|
三、简答题(25分)
- L8 z0 E1 k. j) T( s1、头文件中的 ifndef/define/endif 干什么用?
3 o( U5 u- a& e* M' o5 [起码加上前缀(#)吧,其中 #ifnedf 就是说如果没有定义什么则……: U* }& T* A% N" v
#define xxx yyy 就是把之后出现的yyy用xxx替换3 V1 j2 C- m: a9 G
#endif 与#if系列配合使用: d, `- W j: l. F c& \
2、#include 和 #include “filename.h” 有什么区别?
; j/ g Q% N9 D; \+ Z0 E这个玩笑闹大了…… 估计前是用是指先在系统指定的包含目录中查找文件,""是在当前目录中,当然可以使用绝对路径 ( ]( t4 m) S3 Q* q% p: A7 u/ t3 Q
3、const 有什么用途?(请至少说明两种)
7 ~' \7 T2 `) A# @. {6 u限制变量不被修改,保证函数不修改变量
& E5 B, a: j0 Z( h! l, h. D s4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?3 K& k$ U% ?% f) A. ]3 z
指编译的时候使用C风格的函数名; H1 ~1 b0 @& X9 V1 s9 i
! z. G1 r0 k9 J! ^四、有关内存的思考题(20分)7 @7 [- |7 J6 I+ s0 ]' i. _
void GetMemory(char *p) Z& B2 r# @, k- \9 }3 y0 y
{
]6 z7 K& F: V: `p = (char *)malloc(100);
; p6 Z8 Q! O, D" e$ Q3 h}
$ y' r' ~- c5 K: c7 [void Test(void)
# e# t) m" P, S. z3 \+ K7 ^3 W% e5 Z, {{
( N& Y) W- C/ t9 X9 ~char *str = NULL;
8 |% _# l( k) u+ ?GetMemory(str); 7 p. g2 c. r0 A4 q/ {
strcpy(str, "hello world");# w+ I2 S, h, L! S A# W7 p& {
printf(str);0 k4 S* |1 d6 o `# o
}! |. I" K6 G% w) O
请问运行Test函数会有什么样的结果?
9 |1 V6 D1 p5 Z% K d答:错误,str没有正确指向申请的内存地址- ^8 Y0 o% c/ v4 @, S) O, Y# Q7 ^; a, X" g
Void GetMemory2(char **p, int num)4 U4 ~% d4 i9 y, J+ |
{. ^9 i8 X ?8 u# d& ]; w" M8 K
*p = (char *)malloc(num);( q% B" ^1 g, z; h. Q9 j: I; j
} K4 d; Y9 z) m/ v& x! J
void Test(void)
+ E/ Y+ A9 l5 K5 b/ A{/ Z, I5 c! j0 c& Z
char *str = NULL;
/ a& c, ^( H1 n6 V3 \- eGetMemory(&str, 100);8 P/ R+ H1 j- a7 ~( g
strcpy(str, "hello"); 8 U. O8 @# _/ z+ l
printf(str);
8 v$ A v' [) `# S# t}9 W- Q8 Z9 q) y# O K" ^
请问运行Test函数会有什么样的结果?7 b2 Y- p' {- H
答:正确执行,打印出“Hello”
9 @4 E) j0 a" Fchar *GetMemory(void)
* T' R1 ~+ Y& T. K$ r) C1 Y4 K{ 6 Q% O/ _* j$ X1 Y0 f
char p[] = "hello world";
+ ^6 m+ E, o% R6 treturn p;
$ D1 { F* B, |, }& e, R}
! o' Y1 K" `/ w h& Pvoid Test(void)6 T9 j3 g5 d5 [) R. m
{$ q4 v4 v8 R3 n7 O7 q
char *str = NULL;9 U, E- y7 e6 L& [% D. y
str = GetMemory();
0 d& a" ^& I, C) g. Eprintf(str);
' D& P. y& B, R8 i2 m" ]+ b}
& S M) v* o8 \" I ~请问运行Test函数会有什么样的结果?
2 o/ q, v. @' r, h4 b# O; d答:错误,str指向的内存地址已经被系统释放( O$ E* F- ]# x" m' o+ h* f j( S$ G
void Test(void)
$ R, K7 W1 x e! `+ w- Z" h{4 a/ T0 i; b" R7 ?6 G
char *str = (char *) malloc(100);; b) S5 j. V+ i, {5 L; k
strcpy(str, “hello”);
8 h/ D# h; H* ?- @' S) Z& gfree(str); % F6 s% D$ _9 C6 K
if(str != NULL)
) d% Z& j/ W3 v: U$ b' {{
/ r. m- z6 f* D& Jstrcpy(str, “world”); / Q8 Q/ B7 S- _% H* \
printf(str);, k$ D3 @- n" l5 q+ J( Y9 D
}
- {( F$ }: ?! N- J! y, y}
0 R6 _6 V3 B% R! {& ~请问运行Test函数会有什么样的结果?0 G9 j7 U3 `3 U# x1 \! E9 ?1 L
答:错误,free函数不负责将str置0,故strcpy无法正确工作
' d# s Q1 j/ r* m6 M( L
0 f- D1 k x# D9 d% W+ i( N五、编写strcpy函数(10分)
# [9 [. F. K/ V1 {- ~已知strcpy函数的原型是4 j- u, _ X' [7 f& I+ x1 }0 z
char *strcpy(char *strDest, const char *strSrc);
+ ~, p+ t1 @, b) E& A$ ]. n2 C1 P: N其中strDest是目的字符串,strSrc是源字符串。
1 y6 w+ E2 H5 c! Q( z6 {(1)不调用C++/C的字符串库函数,请编写函数 strcpy
# ]/ G9 b: t$ ~1 w- m2 t" uchar *strcpy(char *strDest, const char *strSrc)
8 ]& `& a6 ?5 \ X, i# p& H8 Y{
8 l6 }4 c: j) b3 o$ N4 e if(strDest == NULL || strSrc == NULL) return 0;5 h- E, ~3 m3 _9 X8 _1 k4 m2 r
for(int i =0;(strDest[ I] = strSrc[I ]) != 0;i++);( l! q! n9 x+ V$ m
return strDest;
3 ?9 f* h' s& S4 w} ^5 O: S+ R ]' M3 {. \, V6 s
2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
2 D, Q: y" m) G' m这个倒真不知道,大概是利于编程
4 k2 @ N8 K& ]$ h, W8 ]% f六、编写类String的构造函数、析构函数和赋值函数(25分)
/ r* ~. ]) H5 U) q已知类String的原型为:
. e( m( B& h4 j+ nclass String
; ^8 _0 e( ^( h, Q, A- t+ Q! [) }{. M: P% R3 M- L- a! H* X. V
public:
% P$ ?! x, G9 [7 { String(const char *str = NULL) // 普通构造函数
q. f) q4 v0 d% S$ i{
# k7 k2 ~5 L9 _3 Y" L5 z" ?2 [* ^ if(str==NULL){
$ X+ c5 W' o# V7 O8 X3 S5 k m_data = new char[1];" Z8 d1 c# {, e+ V! K# ?
m_data[0] = 0;
( l: N/ b& p& E) g0 L0 {1 E& o }
; r+ j4 j' q" u+ ~ else4 X3 K5 n( C# w( I$ l8 O: E
{
7 I1 S, @3 Y" _ m_data = new char[strlen(str) + 1];% G& w6 l, R: J
strcpy(m_data,str);
8 r% D' Q4 q6 v( M3 D/ c9 E8 q }5 j d- [8 @& Z& Z9 z8 U0 O
}: H- K* ~8 ]6 Z3 y
String(const String &other) // 拷贝构造函数
( _8 y: T6 B" [% d4 m9 C{
" b9 p1 F# u4 i *this = other;
9 j0 _ s- e- W- [}2 q" Q( p& X' E! C
~ String(void) // 析构函数; l3 W8 {. K5 a; ?
{
5 Q4 }' c% t: ^' h. Q delete [] m_data;
. ]0 m+ ?" {' X& F6 m) S}: h( s9 f! t9 G* P* Q
String & operate =(const String &other) // 赋值函数6 t4 [# B) f1 }& Y& J% ^7 D$ y
{0 u* D; s$ f( {) f m+ [
m_data = new char[strlen(other.m_data) + 1];
2 s: }3 X% j" [5 n: d2 y strcpy(m_data,str);
6 ]9 j) O- T* m* U( F return *this;$ _0 P+ P2 o- C; G5 E8 N9 k- Q
}+ a0 {! [" }% }3 q+ g' B ]7 F9 A# o
private:
- [+ Q: \4 b0 I. `1 ?( p char *m_data; // 用于保存字符串
, R% g* Y: O/ F' f4 e};
- F8 b+ X8 r& R/ [+ q# V" e请编写String的上述4个函数。2 E' |2 n+ d0 b
[此贴子已经被作者于2005-6-3 19:23:13编辑过]
1 e7 R$ ~! H% k: X0 @1 g! J# s |
|