|
|
2009爱立信面试题0 g' x8 j; H. D' L4 z
) T3 O7 {4 q' Z9 v& ^! Q5 kZz
0 b" w4 h, h/ Q7 u4 G$ |& u& G9 D |7 Y1 L& V% H, m; @
(1)下面程序运行结果是什么:
. a- u8 Z! K& @- e3 f. p5 k#include "stdio.h"* c( G) E* S j( G9 J% {/ K) `
class test
0 n0 m; g" `" M, R, M6 y% m{% |; ]7 j5 i1 v, H' o# k- A m
public:
. c. j% _% s4 ~0 s# X0 P; ?! ^& [test(){}
3 @2 r+ Y8 r$ ]& M' w; ^4 _void hello(){ printf("hello\n");}6 j0 |0 U7 Z& b
};6 k" C) K) W! N6 M1 G; |# d
void main()
3 S8 ?4 p7 U5 X$ P/ {{3 o' d8 S& U4 J* D4 d c, E
test* p=new test();* i0 d8 a( {5 @: D% K9 T
p=NULL;( G, ]% }& e$ K% `8 x2 d9 n
p->hello();9 v/ N, }& h; Z5 o
}# U3 {3 n4 i9 {. {$ D! N$ g4 f+ j
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:0 m- V' l) P" t: B3 {0 F+ s
#include "stdio.h"
: n8 }" B' m( j* b. x5 kclass test; Y7 y8 j0 A- E W; A% C4 f' ^
{
9 i( X0 `2 w. [/ Pprivate:
9 j9 a1 j1 }+ `& |( p' P, kint i;
& C+ ]4 L, G2 apublic:
: ~8 b- h) o: Q% Htest(){i=1;}
! x% `! z! K( Q3 W. Jvoid hello(){printf("%d\n",i);}
' S+ V0 h8 {3 [: r$ Q8 ?};0 b$ D/ ]2 R9 S' v/ c
void main()
4 ]( w4 r$ Q' }1 W! k% u2 x{
% A9 u$ O e* [& u/ l/ C test* p=new test();
7 s3 N! G$ s9 ]p=NULL;
# H$ N2 Q+ O0 e& Z; o" b9 v9 p1 y. }p->hello();
) O6 F) ]9 ]8 p0 E$ J+ m; }, G}
0 c+ Q$ U6 K% D: K* s) U如果将p=NULL注释掉就无误,就会输出1.
/ r, S1 v) V3 a0 l G3 q注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
' }& V7 e, P0 h T(1)C++的构造以及析构顺序) o4 { _# q& p( S- f! a# i
#include <iostream># k) d0 y1 M& s. h# E5 V
using namespace std;
0 j2 d: \7 u" nclass A1 r! e' S* r) d7 R
{
. U% w5 w, s0 Q0 I0 ~public:
5 F5 _- d2 G0 D. `3 Z; a8 VA(){cout<<"A"<<endl;}2 _4 T+ o! P/ X; a2 S( z
~A(){cout<<"~A"<<endl;}
2 H) [' T/ |$ F# z( z};
$ p" }9 z: {6 k0 c5 jclass B : public A% \7 x, w2 Y o" [' W4 f8 a) M
{
$ M4 D+ h' w4 s3 Ypublic:
2 N$ b2 L6 i5 ?6 }B(){cout<<"B"<<endl;}- U* ], D4 Z, u2 K" p# U
virtual ~B(){cout<<"~B"<<endl;}
' I* f! Y+ V9 j8 M};8 p* B% u$ Q8 E2 o N# u$ M
class C : public B/ ^( C" g+ T' u7 B/ k
{+ {) U2 e& Z( F( Z/ k
public:
1 \" m% N$ ^4 k* t) V1 t; ^( @' mC(){cout<<"C"<<endl;}& ^' u0 `# W4 b# j' Y0 ^
~C(){cout<<"~C"<<endl;}: F* X8 h6 c5 [
};) f7 k9 O$ z* ]: x; d$ D( F p
, V3 `" [' B% c' bvoid main()* N: W$ a3 A2 M. G
{
! p9 m K2 e: j+ ?
0 s/ C7 h% V( ^) ~2 \7 F0 eA *a=new A();5 _, x/ {0 \$ V6 A2 V
B *b=new B();& u: e) t; L" F5 R0 Z
C *c=new C();+ n$ M1 o0 I5 K! g7 j
A *d=new B();+ f& B' A2 g+ C2 Q" s& L
A *e=new C();
' T1 t6 Q4 q6 [ YB *f=new C();, N, S* k/ B/ S( k
* D) m. W; Z1 c+ F
delete a; cout<<"---------------\n";
" ?! I* |, W8 i1 e. e8 W! Ndelete b; cout<<"---------------\n";: @) K* v5 \! C
delete c; cout<<"---------------\n";# s/ x$ p7 }, G* J
delete d; cout<<"---------------\n";
4 F' V5 Z& ?; l; d$ d0 `3 Ndelete e; cout<<"---------------\n";
; J1 z8 [8 B4 n' D$ o1 P3 Idelete f; cout<<"---------------\n";+ k* A- A7 R/ G
}
( O' o. [: I1 \* d$ M这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
U, l$ @" T3 f( f1 x这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。; ~. I- V1 V) H5 J. j% c
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
% Q4 m( x; ]" _" ?(2)面试的诡异题目% y$ m' g$ V& b" E
大意就是如果你 test *p=new test[20];
) w( W6 v4 E- j5 W9 H然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
" U* y& t+ d" B" j答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
0 [6 L" i# |& F" y4 |
; K9 G& ] _) }( o( XZz/ N% Z* ?* A, G0 {& L
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html; u; u @4 H2 S4 C0 w2 n3 L
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html% o- Y# s1 ~) w m( j u& ]
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html1 g1 ~3 o: u' G+ T. I9 o: u' p8 t
——# o9 r0 [ u1 Y/ y1 T7 d# o
百度2011年实习招聘专题. j2 P$ j5 o/ C' S. T8 }
http://www.aftjob.com/portal.php?mod=topic&topicid=22" M9 R& n! i9 ~; q# x. @
爱立信2011年实习招聘专题3 U; I; H [2 W
http://www.aftjob.com/portal.php?mod=topic&topicid=23
- J4 {$ @# c$ D! A' z# x新浪微博2011年实习生招聘
) M8 a' T+ R+ n9 fhttp://www.aftjob.com/portal.php?mod=topic&topicid=21
8 T2 i3 T; Q$ s; D5 [2 Z. {! F阿凡提招聘:http://job.aftjob.com/job0 ^# G3 K4 o9 [. |+ l, O
阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
7 o( e- l# P5 ~* d: u9 h) l( e阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum' H# @8 u0 \8 @& ~
阿凡提职位搜索:7 }3 L+ `* z7 Q4 s% w) q4 u
—— |
|