|
|
2009爱立信面试题
4 m$ y5 u, j& I) h# V0 [5 H X+ o9 X' c
Zz3 O' n8 P; n( P6 Y6 A
3 H% E. a* V% z2 r2 }5 r3 t(1)下面程序运行结果是什么:
* m" A. G% @: a1 _# g#include "stdio.h" i7 _5 u1 n8 T% M: u( Y N" q/ C
class test
' a: g1 Z9 p1 B+ A" F3 O{
Q1 \% S* V! g. p' gpublic:* T7 A. }8 x& `9 h b
test(){}
4 \, \4 r" y$ w% x0 g, |. L; hvoid hello(){ printf("hello\n");}
0 i2 i$ y: [* G9 D};3 O& N- e$ H Q
void main()
3 @, @' ^: L$ I0 U3 @' [/ l{
4 `4 v0 I1 |, y4 n test* p=new test();
' X5 H! H6 J6 V; f( o/ p0 J' b p=NULL;
, k0 ]' l0 H. f4 R% I: D p->hello();9 r0 V" b) V3 N6 X
}$ B+ J! M6 m/ @" o* g6 o
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
0 j, w9 ^: k3 w7 C" C a#include "stdio.h"
* U7 X x8 U/ y, K5 G/ Bclass test
# c, \- d. z& V{. S1 n. F+ _; u* q6 R5 q7 }* C
private:# w" ~3 y. s8 k7 ?
int i;4 o) g/ J3 r/ A0 G1 J
public:- D9 l- ^1 k- y, S" f& k
test(){i=1;}% M- ~, b- ^6 I+ E! |2 O
void hello(){printf("%d\n",i);}
, j' d: O+ G3 g1 G, W( U! Y# o};8 t B; C) D% i5 Q
void main()% u! g9 K* o8 p1 c" T7 e
{/ K% Q1 n$ f% d6 A" M$ s% `0 k
test* p=new test();
# V- R2 b9 N" n% ^$ J% @# d. @p=NULL;( G6 r% u& t: i; F/ }1 c3 P: A. b [7 g
p->hello();
' |7 @2 ]: O7 h}4 m; f) E" s$ C( S) {
如果将p=NULL注释掉就无误,就会输出1.6 j* X" T3 W$ c. T9 [# Z. n. F
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。9 ^% \, X' Q: R3 _* ]* W
(1)C++的构造以及析构顺序/ Z# {* ]. Q# k) y4 j+ x* k
#include <iostream>
4 R2 k V/ {0 R1 v8 w& p vusing namespace std;
7 t4 D% o) W7 D jclass A
' P/ J' G1 U7 U{
# v `' r) ~: S1 @6 [3 Jpublic:
( h9 S: l. n: L" R9 D" c8 YA(){cout<<"A"<<endl;}# r- S: P0 r' h' E$ H
~A(){cout<<"~A"<<endl;}' H) Q+ }: i. C! o8 i9 S8 f: P
};1 b, v# [& `: S6 v6 B
class B : public A) y7 g+ k. c1 d
{! F ]# {* J7 C
public:5 w l5 ?" R# p$ @9 j5 C2 b5 f
B(){cout<<"B"<<endl;}% U9 _( m: t7 c; h! G% r
virtual ~B(){cout<<"~B"<<endl;}
! u$ d, d' g7 v};- O/ P! b" `! a7 l# Z8 P. Y! o' P
class C : public B- N- B; `# M3 v; l3 I h5 |$ Q+ q
{6 J; \: F$ v* i/ p+ h
public:" F- R. l4 y8 c" k8 G; |! k
C(){cout<<"C"<<endl;}4 L# H+ E" ?7 @0 M1 ^9 T
~C(){cout<<"~C"<<endl;}
; I7 `1 \2 a4 E};
: q# r/ w: R9 X$ H% N" h
& T9 W0 f3 ^$ W! U6 tvoid main()
* N3 Q; f3 ~: a/ }: S$ ~{
Y1 K+ S1 J& o; @' d, h! B, y& x' Z- l5 c
A *a=new A();
1 n# V V: I* A; m9 y$ K$ tB *b=new B();% k5 w/ l4 ~1 |! P1 N
C *c=new C();
; q" W/ Q m* O9 g5 rA *d=new B(); O: X _9 D& q' L1 {' p8 G+ y
A *e=new C();
0 F; ?3 f) I" U, M$ RB *f=new C();
# j4 {' s5 n- S% J7 H6 r& s n* I8 N' [. N! G
delete a; cout<<"---------------\n";% |) v ]/ V7 r8 C9 j
delete b; cout<<"---------------\n";
8 r8 K) v- E% y% Kdelete c; cout<<"---------------\n";; k$ f0 {4 } ~( \* B* U
delete d; cout<<"---------------\n";$ w: x9 J2 g/ T/ |: B( c8 H, ]
delete e; cout<<"---------------\n";/ l2 j8 U/ N k5 O
delete f; cout<<"---------------\n";$ X3 w, M9 P2 r3 |5 X$ M5 f3 Q/ v
}
* r/ \& B$ ?9 M# Q$ N1 k) i这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。' ?3 v6 q& r" l
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。5 H' U+ O* E! _5 [# E0 H
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)" t' Y; w% }# i a) y
(2)面试的诡异题目
8 s: T6 N/ a y% y大意就是如果你 test *p=new test[20];& m3 i9 d% [6 p. S% m9 D% E- g, I
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
0 {) p0 S2 `% k1 b3 c& m0 X答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
! V* V( F- R, {8 c* F p" X3 m$ ]
+ v% D( _" K8 I/ a! F6 _0 f8 iZz
* E M w, N' B1 u0 R# h( j+ q爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
9 `/ k+ I$ {* H4 f5 `. x$ B上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html3 L1 ^+ b) [( }# Z
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html7 V k* [" g+ h. F+ v9 K, J
——
- |8 `' d; h# M$ `5 Z百度2011年实习招聘专题# ?& r! U% Z7 }0 }
http://www.aftjob.com/portal.php?mod=topic&topicid=22& g+ V- V+ U2 W9 E- ?
爱立信2011年实习招聘专题
* `3 c. W/ c0 e5 c2 Z% _ u6 c/ Qhttp://www.aftjob.com/portal.php?mod=topic&topicid=23
/ D+ a4 Y" O% l新浪微博2011年实习生招聘' a4 Z% o+ Q0 O
http://www.aftjob.com/portal.php?mod=topic&topicid=21
2 {% K1 a5 b' I! `阿凡提招聘:http://job.aftjob.com/job
( f5 K7 ^# w. f3 }阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
4 f% E2 X6 l+ x7 h阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum
' F2 _ [8 Q+ I" u9 t, \7 `阿凡提职位搜索:
2 a7 W+ H* O( j3 G—— |
|