|
三、简答题(25分): [# ?% t+ F# Y8 S! m
1、头文件中的 ifndef/define/endif 干什么用?
$ v) R+ X4 B8 @" }/ F0 D起码加上前缀(#)吧,其中 #ifnedf 就是说如果没有定义什么则……
3 y4 g! P' |: u S. m1 R# W) u#define xxx yyy 就是把之后出现的yyy用xxx替换/ o3 O m7 F$ z' ^) V& S7 F, @* X% ?* K
#endif 与#if系列配合使用: y. K! G+ t5 J% G1 l3 [
2、#include 和 #include “filename.h” 有什么区别?
7 e; Z1 I5 g; ?; N( Q1 G/ R这个玩笑闹大了…… 估计前是用是指先在系统指定的包含目录中查找文件,""是在当前目录中,当然可以使用绝对路径 ! j7 s) ?' X/ K7 l# G/ l
3、const 有什么用途?(请至少说明两种) W' V0 ~* l- h1 L( M6 Q- g
限制变量不被修改,保证函数不修改变量9 Z7 b# n# k* O# x+ g+ c7 \1 [% y
4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?( S" n& V1 ~* n. h! H) ^
指编译的时候使用C风格的函数名4 U( L7 R1 Q) H
- V# Y }6 _0 N2 @9 T0 n5 q6 G% U
四、有关内存的思考题(20分)
4 H3 F3 h, Q% ~0 c& I6 ?void GetMemory(char *p)* X& F5 w9 W- f7 T9 }9 a
{
) T& T1 c& N- B5 l8 Jp = (char *)malloc(100);
' n& ?4 h* k( p' a. T}8 N- h2 h! m7 `% b# Z
void Test(void)
& `6 ~6 ]0 r+ m) k- w. @{
% L; u; T8 q4 }( g0 _, q1 G& Zchar *str = NULL;
% i+ M, Q9 d8 O W1 yGetMemory(str); 3 i4 d% f- V5 U3 L5 D0 H
strcpy(str, "hello world");
9 w0 `$ `8 o$ J4 mprintf(str);
l; ^" g2 F+ A% C U$ ]0 ^% y* ]; R+ \}( s8 v( a$ C! g6 R* i
请问运行Test函数会有什么样的结果?
- o4 V7 t/ [4 g# V* }9 I& A( N5 |答:错误,str没有正确指向申请的内存地址
6 Y' ^+ c" c$ r1 SVoid GetMemory2(char **p, int num)
* y* L d' D0 | Y+ u+ P& d{: Z9 \" }% ^3 P' L
*p = (char *)malloc(num);( q# q7 ?% c* P; x3 h5 B* l; [
}: Z z2 N* c, [' K, t( M
void Test(void)
" P: L1 ?9 E1 h6 R; V! N{2 U' P& J( ~& t
char *str = NULL;0 W4 \! J9 u2 T& H6 s5 n2 t( K
GetMemory(&str, 100);! n) y0 `: W( n7 A9 b
strcpy(str, "hello");
, i0 E3 N4 {) `% s1 x7 O/ A7 ~5 A! Kprintf(str);
8 ^0 I A& x% e% z}; L% h2 H2 N* C1 J, q3 w. t. R7 ?. f- |
请问运行Test函数会有什么样的结果?! W. j2 f( z4 G$ k& b( e" c! x
答:正确执行,打印出“Hello”
5 p# N V" Y% `* A) Qchar *GetMemory(void)! X& \7 F3 {" B! J' T% d. {$ i5 ?
{ ; ^4 K m" g6 T# I6 T8 r' P6 j, Z
char p[] = "hello world";9 _; l; _( b3 x; P
return p; [9 t, S* |# R
}# W+ x; D1 a4 ]; S- \9 Z" _9 Y/ {
void Test(void)& p5 S9 e$ l. [9 d, ~
{
$ t# w' C9 L, j" X, Q& ochar *str = NULL;! \& A |! `6 G8 I
str = GetMemory();# u& B3 p$ { t' \
printf(str);$ J; E, W; U3 }& L- F: }6 V# [
}/ H; C8 X8 r5 ` A. N- S9 F0 T
请问运行Test函数会有什么样的结果?# z3 M8 R+ l' {" |
答:错误,str指向的内存地址已经被系统释放5 u+ Z. R: B+ b4 M7 p" m
void Test(void)
' ~. M. R! l0 |+ z6 ?- @{9 {, E5 E+ B4 {( O$ ?
char *str = (char *) malloc(100);
5 Z+ l9 O" z1 W. P9 r# \; ~9 ostrcpy(str, “hello”); , X F) E1 \% t. k2 E; @) R g
free(str);
5 r' e2 K0 c& K V9 hif(str != NULL) . B& X" s% p) @- s& }% m% B3 x- l
{! R' X) z6 a1 u
strcpy(str, “world”);
# V# z& m: e0 M) I# }printf(str);
3 K6 b/ C1 \; Q+ Q, E" y' P8 I}; z/ I& @4 B- ?
}
0 V, A. s0 T' N; J6 C请问运行Test函数会有什么样的结果?
, G5 E- A, \; Y5 k- h# f% T, e答:错误,free函数不负责将str置0,故strcpy无法正确工作
- I' ~: b5 i5 h! a% `
5 _2 _' s& e5 s五、编写strcpy函数(10分)
1 Z6 m% C) ^$ F已知strcpy函数的原型是: a5 |% e0 y& t7 I
char *strcpy(char *strDest, const char *strSrc);, ^2 R- H/ ]2 h( `& G- R
其中strDest是目的字符串,strSrc是源字符串。/ x: \6 x' S7 e9 A+ t( C) T
(1)不调用C++/C的字符串库函数,请编写函数 strcpy
( Y4 {/ l1 f6 }5 Schar *strcpy(char *strDest, const char *strSrc)
. q- D; m7 ~3 C{5 c/ ]# f. c- K. t6 @7 v }
if(strDest == NULL || strSrc == NULL) return 0;3 p: W$ k7 F$ L, h0 g5 ?; j
for(int i =0;(strDest[ I] = strSrc[I ]) != 0;i++);
6 d( K3 n# C* q4 o' Y) j2 a return strDest;9 E& H$ w" I8 c" L* {5 \! n. l
}
' \* i4 @8 s: g5 i9 M0 I2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?3 s4 d5 X5 ^. t6 `
这个倒真不知道,大概是利于编程- c' p2 {0 W# C6 a
六、编写类String的构造函数、析构函数和赋值函数(25分)
$ r6 X' ~+ U+ R$ U! c; [已知类String的原型为:
$ V0 \1 @' M8 H1 y Wclass String: F" E+ P2 o' f4 R. m
{
9 C0 z8 ^; k8 f! D) T& g) v public:
2 o. x5 z' b, O7 z& P1 G String(const char *str = NULL) // 普通构造函数
. i) B& {: g8 G" P2 @, ?2 m{: S9 A& @4 \1 c9 U1 s6 a( h
if(str==NULL){
, i, ?6 t; \. g. e9 U0 |% B m_data = new char[1];8 B- D+ R% f- s! b& q4 B
m_data[0] = 0;
- b% K3 _! [6 {' O0 P! L/ D& B }
[/ Z9 m3 L3 Z1 q else
9 q( z4 v6 t3 y+ A' b7 X$ ~* ~ {( I; Z* X# ?: m. v
m_data = new char[strlen(str) + 1];
* B. A/ }6 N, O* S! D7 S strcpy(m_data,str);
" ]7 p7 ^" k: C, O$ N2 S' G8 ~ }, r# N6 f, B9 M1 V* W0 @& [
}
" }* f: u& v9 C: A% c String(const String &other) // 拷贝构造函数
3 l" p; G/ ]0 x5 }{# h7 [# n6 O, N8 P$ r8 v. d
*this = other;
; Q1 Q9 X- e ~1 @}: Q+ Z$ g$ e3 V/ d! g
~ String(void) // 析构函数
, H3 d5 D; q4 O5 D{
2 ]+ _0 K/ p2 B) E5 y+ { delete [] m_data;+ D7 b* {2 g5 r u* G% X1 w
}
4 _4 k U+ f0 Y: H+ h# ]! T String & operate =(const String &other) // 赋值函数
( M# T1 ~5 o. f5 e0 c Z4 J{2 H; s$ U) C# k8 ]
m_data = new char[strlen(other.m_data) + 1];- n; U- Z, U. o. h' L; e
strcpy(m_data,str);
1 L* y% O+ [4 ]" Z0 L return *this;$ j' j4 z6 A% `' ?3 X8 ? s
}
3 J- c8 }# \# e8 s+ @* r private:
, ~/ ?) o! g0 g* @# u char *m_data; // 用于保存字符串
5 X! u3 w H" z# r& I$ _};
1 k) T0 ]2 g _请编写String的上述4个函数。
* z2 l) I6 k0 c, [ [此贴子已经被作者于2005-6-3 19:23:13编辑过]
4 l1 s# C/ b: g |
|