|
|
2009爱立信面试题
9 ]/ Q% D" N, @2 Y6 B z
1 ^- c& c: X( ^! ~Zz. U2 [2 m% _% ~. w+ _3 H
4 D! ^: d5 o& L z* ]6 k3 L# o
(1)下面程序运行结果是什么:
8 J2 W" a( {" I+ y( `6 `6 h#include "stdio.h"+ Y! P5 p$ Z+ G5 G
class test
! h b6 V r8 U: \) O' A( s2 W/ S{# j; K7 l) Q; Z2 V) T
public:
/ s& H" j, E; z7 k. T9 @3 A+ n( K8 ]test(){}
, S* Y: X+ F2 L: J, Uvoid hello(){ printf("hello\n");}; T# h8 n8 ~0 h: N3 g; ]& n
}; y6 |* Q0 N( E
void main()
" q0 J: q: x5 h9 ?1 Z. y0 Z/ _{! w* R6 k0 [& u6 H( e* h4 M9 q
test* p=new test();2 b" D2 K$ `0 A$ M
p=NULL;
: v; k$ G0 g" ? p->hello();9 {! \: q8 x+ a0 u1 G0 W, r# F
}- i" P, F5 J" N" D
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
+ k4 r3 E9 d2 O0 E# ?#include "stdio.h"
' v- d! n2 [8 a. ~class test
' J1 a+ [9 q9 x P, n{
9 o, e9 x; ?6 S% B9 D' _5 i: ?" ~private:
+ x% l, J+ C0 A5 T; c$ \' c% _: v; ^int i;- K% ?7 J6 K# d6 a9 p8 w
public:, p9 z9 T; I+ \8 \
test(){i=1;}8 l4 V) n) h2 Y ^4 M: x/ W' R
void hello(){printf("%d\n",i);}% D/ T1 S) u- ~. {5 U& Q' ~" w
};
! u& r9 U; O t; H3 I! f+ |' lvoid main()
) ~" |9 ?4 ]+ F! @, U# O4 ~/ M{5 H) W+ E" ]0 S& x# v2 o( E
test* p=new test();3 d; P/ z& k" b- G& y
p=NULL;
& }2 w/ U- c$ G' f+ e! f5 ^+ kp->hello();
) _5 o5 z% C9 e9 {& O6 f2 @6 Z} z* k5 W$ }7 \2 _/ z
如果将p=NULL注释掉就无误,就会输出1.
) s$ Q9 Y; E1 ^' _- u' R4 s注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。0 x6 k ?/ E: G1 k
(1)C++的构造以及析构顺序
5 I9 ~$ @- ]" \# x3 ?8 U5 @% x: W#include <iostream>; k& L) f8 V6 O# S g7 C
using namespace std;
+ p. E% w' O, y7 j: a B4 Lclass A# x$ D( h, ~# ?0 ~% I# w, u+ V$ L h% ]
{
' w: ^! D+ g: e, mpublic:2 W& c) {, [7 D0 e- O
A(){cout<<"A"<<endl;}
& H; n* P6 K' S! P~A(){cout<<"~A"<<endl;}5 `4 | _' I% x9 a' U6 u
};. Y% b2 b* `6 _
class B : public A: [+ [6 H# ]+ u I8 e6 G( Y2 m
{
! c. x0 L& q* \. |# d8 n! Qpublic:
1 W) |5 }4 M2 j" `B(){cout<<"B"<<endl;}1 R7 ~ z4 h0 a0 ?# T
virtual ~B(){cout<<"~B"<<endl;}
5 @, t: V( o! [2 |+ Z};
: Q) R4 S7 i7 ^! H' y# Yclass C : public B5 E6 m, W( v5 O9 \7 Y2 m: H. m
{
% D1 o* r& @$ t; r. ~public:
- O9 L3 N- s0 Y3 d& ^! cC(){cout<<"C"<<endl;}
6 X7 b( M8 n. Q- f( h; T~C(){cout<<"~C"<<endl;}
1 u# }2 l `# O+ X$ G};5 z% K, v0 `# T) h% o: s1 N
' e. G$ q7 a1 [: } v& Pvoid main(). t- p8 c) `& A0 a
{; \# C4 v/ J$ E2 q" ?
/ `) _5 u/ ~' B7 G+ S# V
A *a=new A();/ B5 m3 k }8 A
B *b=new B();
! c' p* l1 ^- C, K& ~/ ]8 y C *c=new C();
5 T& o. o* z- }- lA *d=new B();( v W0 U4 E$ c4 A( l) p
A *e=new C();
3 W0 k; {9 b8 }5 \B *f=new C();
7 X. ?9 L- ^5 K3 O3 y* p9 B- W8 ?7 T3 J4 ]! R* M$ M) ]6 l/ O
delete a; cout<<"---------------\n";* ~0 T' T1 ^! |
delete b; cout<<"---------------\n";7 E4 c$ F5 B3 c
delete c; cout<<"---------------\n";+ z" N1 s F! e( Y" ^) v# \2 Z
delete d; cout<<"---------------\n";
; n- k8 W7 o0 ~4 {5 n/ E$ _delete e; cout<<"---------------\n";
3 {# C4 I, V" R" H! qdelete f; cout<<"---------------\n";# X9 s* A: f7 o$ Z4 k) O/ k ]$ L
}* V5 y) J1 ?' c
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
% {2 I6 c ~& W Y$ R( R0 C, h这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
. |$ p! ?8 m, C其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
, @ ^7 C7 Q8 G! x# ~( s( l8 v( G(2)面试的诡异题目
6 h8 a* ]1 B0 h: }' f1 c1 R大意就是如果你 test *p=new test[20];
+ Q& O. c: v! s: b, l; W% q然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
% f1 ?" Y2 E" v% A$ u6 J答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
- O9 a# \1 ]/ A7 r( M; p2 N0 l- j. R4 @4 G, [& F8 ~8 Z
Zz6 E r1 h9 x+ |* a0 B
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html7 y3 t. T! ?; C8 |, l) W
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html- ?$ t0 c2 K' _
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html9 `* H& b, R2 x+ D/ l
——
1 z- ?4 a5 y. \1 z- I百度2011年实习招聘专题% E/ A0 b t" N% k; d( e
http://www.aftjob.com/portal.php?mod=topic&topicid=22
5 z @/ r, l( m1 C5 p ?3 ^3 J爱立信2011年实习招聘专题
. ?7 u3 e2 ]1 w; phttp://www.aftjob.com/portal.php?mod=topic&topicid=23' Q5 }1 V! o5 y
新浪微博2011年实习生招聘9 V! A- Q, ^$ A1 q
http://www.aftjob.com/portal.php?mod=topic&topicid=21
9 l/ U7 J$ Q( C5 ~阿凡提招聘:http://job.aftjob.com/job
, R" z, ~: D8 O- h& d% v# I阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag2 n* u. L- v# f0 ~2 t* C0 J7 p- Z
阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum9 ~" A! ~6 U- G: F3 @# v: p
阿凡提职位搜索:2 y; g9 J+ Z4 y
—— |
|