|
|
2009爱立信面试题
: t1 G. Y1 }& G5 R8 O: p9 w( p7 A; G* G$ S" \) u x3 l/ Z' Q
Zz
2 t3 ^* L1 v$ d& w/ j/ b) z: s8 m' F
(1)下面程序运行结果是什么:
" w: z& E E2 e" V( A8 D#include "stdio.h"1 [7 {/ T! W! _" V0 w1 J' R- Y6 B0 p$ w
class test
6 b+ u, [$ }# Y; {{
# k) ~, m: J4 s2 Apublic:, _6 z$ P" A" `2 r+ G, L
test(){}
! w, q* Y& I% G2 t) Pvoid hello(){ printf("hello\n");}
6 @5 y3 U; }" u7 z' a/ Q};
# i, C9 S0 _( }8 gvoid main()* Z& }1 n- M+ h0 p
{
& \4 o y- \" I7 B( w test* p=new test();5 E4 ] T; t% ]+ X
p=NULL;
* l' U. a/ q* ~# a p->hello();
) H! h3 X0 p& }}
+ b. T |9 `2 t' }事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:; o& n$ g9 |! Q4 y
#include "stdio.h"
' ]# O( t- B# o4 y8 E B+ d' pclass test
8 f1 i4 p' [: A# Z+ A- u0 b" X! N{0 z/ @9 Q9 t1 b( q& x
private:
+ y% W3 |# s+ u6 j$ }) w0 ^% g5 V8 Kint i;
' k, o, R% v ` n7 J( I; x9 Ypublic:$ |7 D) a+ z8 k1 ^7 ]
test(){i=1;}
, J3 O. Z s; r& e6 U5 \4 Wvoid hello(){printf("%d\n",i);}
1 p( x7 J, ], b0 z! ?};
8 h6 X' R7 T# J8 t5 s" Q3 N+ Avoid main()3 F8 H) y6 T. P: a
{& M) K. L9 k9 }4 K- W
test* p=new test();
. {" L. C) f$ I$ y4 `p=NULL;
" V6 [! A2 i9 h, ~' j5 n7 op->hello();
{, Z$ b) d6 D( Q9 L( C7 h}
- a8 Y/ B, W5 r5 a如果将p=NULL注释掉就无误,就会输出1.
u7 C6 @4 ~; I! r; y% B注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
. a, ?6 s6 Y8 l9 e5 d2 h7 V(1)C++的构造以及析构顺序$ p) c' {" \* s6 n0 D1 ^* M) O
#include <iostream>
. P& Z3 S1 O$ L8 z" J: C$ N3 |using namespace std;
, a* d9 r* n; |! b8 Aclass A4 }1 A0 Y: ]/ C& @. F' y+ B
{
$ c1 I7 l) ^. g; L7 v9 rpublic:
9 s( Q0 X# {3 J: C& z7 x& r8 dA(){cout<<"A"<<endl;}
! [5 N& Q7 Y2 @. E~A(){cout<<"~A"<<endl;}
/ g, W4 d# C" g! M6 X: w( \};& Q; N$ [' L3 ^0 W$ b2 B
class B : public A! a0 E d1 d9 Z) J
{: `3 u" g% s4 V; ? v, n/ |* ^+ ~
public:; G* `6 a1 a# G1 ?) M: I1 y
B(){cout<<"B"<<endl;}7 Z6 H6 t# ^' U- l2 x8 S
virtual ~B(){cout<<"~B"<<endl;}
7 S! A& p% [3 X0 ?5 r+ F, [}; i; {* t2 O% j
class C : public B O1 D/ y8 h6 M0 S, N: o. m
{ T2 U' E4 E6 n& _6 h3 Y5 r# l
public:2 B" ?) o; ~+ \3 b. y0 O
C(){cout<<"C"<<endl;}
7 C: A M. ]9 U/ n' D9 A" S~C(){cout<<"~C"<<endl;}
/ P0 j! i4 b; l$ ^1 `% o};
% H$ q, I% ~/ ?( w+ \. v* {) F# j* J
void main()9 Q t5 i# u# y T
{$ O/ q& E7 M3 j5 e, G
2 q" p, y( f. n3 F- [# z/ ~
A *a=new A();6 c! p) O: K4 u6 }
B *b=new B();
. p9 s% d2 v5 l" L3 b8 s8 ~9 v, `4 r w6 U C *c=new C();$ \- Q* v) b5 M" z+ c' D9 o
A *d=new B();2 [9 C4 c" b* s# g1 }5 K
A *e=new C();
) [) u) o5 B3 E$ t3 q+ J- H5 PB *f=new C();
5 @" o) E9 B. t# F+ |( q6 }" c5 H5 k" C) U
delete a; cout<<"---------------\n";
+ y# z3 S. |* g$ w* k5 Gdelete b; cout<<"---------------\n";6 k: T/ x1 d! T
delete c; cout<<"---------------\n";6 o h1 N& Z/ G. y- j
delete d; cout<<"---------------\n";' q; f6 Q. @- H# K* F
delete e; cout<<"---------------\n";
$ T) I* q( P' f& Fdelete f; cout<<"---------------\n";
; |4 z- `8 O+ ~: [7 ^; d}
# L/ Y' d x) |6 L% D7 |这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。! h# W+ R) C% Y1 z# b
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。# M; J* d! Q) v) O5 q
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
, _. y5 m9 I8 x9 R$ \, m- H(2)面试的诡异题目0 u; a7 N3 h: y- Q
大意就是如果你 test *p=new test[20];
5 t$ r6 d% ?1 z j& g! \4 S+ S8 A然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
) a. q. U6 j8 `& b: n4 D答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……/ e. a3 ^ Y! ? |
+ x7 R9 L; R1 @8 GZz0 v4 E) l9 l$ z
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html6 k9 @1 x. s$ v1 j
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html! ^1 K9 r P9 q0 U! H: X5 M+ _. [, |/ v
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html; n8 _9 {6 _; f8 X
——
1 m8 B' t* G* G5 t9 J3 Q2 _百度2011年实习招聘专题
0 M o, D2 |2 c1 ghttp://www.aftjob.com/portal.php?mod=topic&topicid=220 Y: Y( K3 Q2 J6 ]5 q' C; M" C
爱立信2011年实习招聘专题2 T/ H# S, Q& h5 I5 x0 Y
http://www.aftjob.com/portal.php?mod=topic&topicid=23
$ H2 {3 X$ Z% A7 I5 Z: I新浪微博2011年实习生招聘; e- a% k) Z: g+ E% e) V" J$ a2 L
http://www.aftjob.com/portal.php?mod=topic&topicid=21, E$ o! y- B. b9 k+ C# p- [
阿凡提招聘:http://job.aftjob.com/job' r' m2 _. p1 A
阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
" Y6 e9 H1 {9 W7 l阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum
' D: y, u8 t- ^+ v# s阿凡提职位搜索:% _3 z9 x8 Q9 @; o# E% i0 w
—— |
|