|
|
2009爱立信面试题
# l: D1 k( @1 u; n+ ^6 ^$ s7 ?# n1 \: j @. s
Zz2 J4 ~8 q- E# @
* R9 b0 I, c) |
(1)下面程序运行结果是什么:2 o% c4 z7 @/ j0 N) J0 k8 i
#include "stdio.h"& I; X6 ]4 `+ j5 @4 v& i" \
class test5 ?; ]8 i+ f, R( u% [7 G) G6 `
{2 X9 Q! ?' N1 @
public:- @' @- X& ^% ]6 A1 |$ X
test(){}
o# t' w' d8 T! A; _. Rvoid hello(){ printf("hello\n");}
; `% @: ]' K1 ^' o2 N1 r};* @ o& k* P# W, u
void main()
' }' r$ M; z$ t! r8 h{; h7 b, T$ { V
test* p=new test();9 Y7 ?5 N' ]( Z% M8 N
p=NULL;
% N* M2 G9 s; @' }6 X p->hello();/ t9 x/ k, r# T8 L, U
}
, C% a5 }( o. K) H9 W事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
- _$ p! Z# H, x/ l! A#include "stdio.h"# p7 F R1 g$ @, C: M9 f" C/ x
class test
4 Y% I. t2 |" t{: S7 \. ^$ s" A0 g# {3 `, g
private:
2 ?# H0 F8 K5 Q8 a8 Kint i;
f2 k3 D9 _4 m9 c, Ipublic:/ I) u. W. p* J$ I
test(){i=1;}
- W& o3 p2 r& ^6 U. j+ Vvoid hello(){printf("%d\n",i);}" M. g1 ^7 @# j r# V
};
: L5 P) Y# G: X5 a) ^6 @void main(). f/ }2 |* q* v' M: U! A9 _
{
" I: e- R! {3 H$ ` test* p=new test();
' ?; E" [( h$ |- Z% Cp=NULL;( V) p9 q, A) H9 H
p->hello();
1 w: c" L: i, Z+ r}2 p/ V% Q( L4 C8 r& U
如果将p=NULL注释掉就无误,就会输出1.
9 s7 i1 F) e- D* h) h9 s1 t7 J注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
1 \# |% M" B0 ?% ]" [; J! F(1)C++的构造以及析构顺序& `) r8 M5 H1 J- Q
#include <iostream>
: [! Z; L( w( vusing namespace std;
& K- ^ g% C& X( tclass A% i" s: [0 I, R& N8 D
{- [& S$ P3 c6 t- |
public:. d# P% G0 l% \! T3 Y3 Y, e: I9 w
A(){cout<<"A"<<endl;}$ G) @9 [! M% H" X/ `: P
~A(){cout<<"~A"<<endl;}
0 H5 M# b) d1 p1 [" M- j};( p/ F0 q; |( A) v
class B : public A
5 b- k& p! l, D6 @{& d$ c/ d" m) G( ]3 C( Q
public:
& U( D8 o# q pB(){cout<<"B"<<endl;}
3 y# d& S+ ~, x: I& |virtual ~B(){cout<<"~B"<<endl;}
: I' y& k$ W( [# o% |};" T+ x; ?' o. s$ ^: e# v
class C : public B% f" }0 r) }' Z% [0 F' O% |
{
! A* `! W/ z% r+ B# W2 X Epublic:
5 S( _ r# S2 n% n JC(){cout<<"C"<<endl;}! o, ], _; D+ z0 L( z
~C(){cout<<"~C"<<endl;}
- j' ^/ U, ~8 v};
2 F$ p7 t# W Q' O, S
4 X. ]. B8 w$ U- B& `% L9 `void main()
6 j5 D7 }, m p* w3 F( P' _ }+ g( p{( q# U9 s/ r. {9 U3 g
- H2 p% N7 L' Z" Y+ z
A *a=new A();6 L$ \& W1 F$ l- s5 j+ K
B *b=new B();% i% I& A W3 \! W! P4 z
C *c=new C();
8 L: W1 g4 r8 t8 c7 \. b3 uA *d=new B();
`: \' c, N6 }. ]# p- B8 n8 ?A *e=new C();
6 W: C. _* s% h- E6 a3 i: }, J+ B! B3 fB *f=new C();
" ?4 W7 _* ^- S; P
1 t8 W, R0 a6 e* F0 Idelete a; cout<<"---------------\n";5 B* K4 K I. h5 Z! u8 l
delete b; cout<<"---------------\n";
; Q- P- t' }; H5 _% }) Bdelete c; cout<<"---------------\n";9 g4 n- {9 }6 S; h+ I8 M" r" [' J% B+ m( [
delete d; cout<<"---------------\n";5 W7 O8 {' ?* h% J
delete e; cout<<"---------------\n";
2 @; b9 U' |" K- Cdelete f; cout<<"---------------\n";2 \5 q% q3 Z% B$ z0 W- N
}
d" J$ ]8 U) Z) G$ P) q这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
$ P: H8 G, J. c+ W9 B' z- @- V" [这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
7 F. u4 `' o6 z其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
8 ^! f/ Z! y6 d(2)面试的诡异题目
0 y( Z% ?3 z% O大意就是如果你 test *p=new test[20];8 `1 t/ ~% v# r, k2 P4 S
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……). C2 L3 G' B# C: G7 K- A3 m; E
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
" V+ j# j2 m' @1 I4 B/ j# v) p. @. l% Q
Zz) ]5 T, c1 ]6 G7 B
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html9 G, m8 p. m4 h) U/ Y) M/ ]
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html
, z# X3 G" ^! l( m: U+ F爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
" X. }9 K- o, @3 C4 {# h——% O" j8 }4 C: l# T# C/ a
百度2011年实习招聘专题5 }! D! E+ j K z$ W
http://www.aftjob.com/portal.php?mod=topic&topicid=22
$ h, y( L% G0 W: X" d3 W7 F% e爱立信2011年实习招聘专题
- a( \* I/ d+ H- K( Q- Yhttp://www.aftjob.com/portal.php?mod=topic&topicid=23
, m2 J2 ~) p4 N: R新浪微博2011年实习生招聘
2 T: w% m8 \' R& {http://www.aftjob.com/portal.php?mod=topic&topicid=21( E9 L& ]4 M; v5 ^3 t1 @
阿凡提招聘:http://job.aftjob.com/job
4 a1 v9 z; n$ Z阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag; I$ z7 ?) F" T7 a+ l- @
阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum
6 s' e1 p- G" |! L# l1 Z# M阿凡提职位搜索:5 {: J+ B) f. N
—— |
|