|
|
2009爱立信面试题
: N$ S3 V2 c5 G, T; @6 c x$ i/ Q$ m, }! Q: u' o6 |. A2 }
Zz0 U8 u5 p& Y0 Y9 h- ~0 s( u
! G4 P: i7 v9 z3 f' h- Y) Q0 P(1)下面程序运行结果是什么:
5 X/ ]0 p3 [4 z$ O B% g#include "stdio.h"" C. |1 b% `0 x! b/ e
class test
6 O9 @, |0 O4 x9 D{2 N9 }! z' X" U6 t/ o+ f
public:- Q- B5 r. E+ ^+ k1 H
test(){}
* w! o' {' l* L; ^void hello(){ printf("hello\n");}, d- m5 u/ b0 w/ f( y* p# I
};
E& Y3 W% X% G0 @+ @; `% d0 `void main()4 J( b9 D+ b# |7 W
{
( @( K2 E/ D8 G# \- e test* p=new test();4 T9 G! }/ `0 s- A1 C
p=NULL;
o3 D, m$ n1 U' z p->hello();4 W4 O+ a: c- N$ z( \
}
- K+ G- J- i3 ^! ~1 S7 v1 S( P事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:$ U+ h: n6 M7 D# E% V3 G8 R
#include "stdio.h"
! ~" y! L9 f7 Y: T7 s; Wclass test# @7 z, U8 S5 K( k/ }$ ~ f
{; l& @& }% \6 m: w5 y$ n
private:* v1 ~% M% I2 v- v# \
int i;1 O! H/ j/ | j% V# J
public:
+ _7 ~$ C" M+ J3 ~test(){i=1;}" k5 \ C' v% P7 q2 P3 r2 D
void hello(){printf("%d\n",i);}
# Z3 h; C9 J d" J1 g};# s6 `" q2 z7 k
void main()
4 X8 D; b# O7 ?. U; Y0 ]- r{# ^2 C- X9 K+ h& m8 `
test* p=new test();
- W3 R0 T& ]" r% e2 L9 cp=NULL;) h: I/ C7 Z" w
p->hello();4 F+ u" M- y+ [; p
}! y( N; B- A% u. g( K: E
如果将p=NULL注释掉就无误,就会输出1.
/ q' Q s9 F4 M4 Y9 r5 O) i注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。9 x% Z. { v: K. A# r- o2 E
(1)C++的构造以及析构顺序
; X9 k0 _0 f! B#include <iostream>; @* [0 F0 ?+ P1 ?# q0 U8 u
using namespace std;
5 a# e& p3 h' j& F, Vclass A
+ u4 q/ g3 i) w/ x{
8 B7 J! @* ]( tpublic:
; U# i$ H, D* Q, wA(){cout<<"A"<<endl;}% V, ~- B- G1 A7 I# Y: P
~A(){cout<<"~A"<<endl;}
: h' V7 M1 a9 t K# m- G};
0 i7 T ^, O5 X2 Hclass B : public A
, g! z" v" d+ Z1 X7 X- L{
4 _+ y8 x- t: i$ S5 j! I1 H/ ^) |public:8 W" J. @; J: ?+ ?2 e
B(){cout<<"B"<<endl;}
% J( x$ a) b) m$ A) d& l+ Qvirtual ~B(){cout<<"~B"<<endl;}( c7 x( y' z; G- A
};
+ Z; V8 r8 R* H5 Qclass C : public B
# B& a* w3 R6 ~/ m# g{
% k& |0 a- d) p# C0 F( {public:
: T, F* ]' M R2 M/ K1 PC(){cout<<"C"<<endl;}: S3 D* g/ ?* Y+ ~ a7 e9 l
~C(){cout<<"~C"<<endl;}7 o" P) I6 d z, F. e" G8 _
};5 X3 ]* c, J& n4 m) V% V3 U
: s5 h+ i' o* W
void main()
( b& ]6 ^, d6 Y8 x5 v: E, L{
3 |0 _8 D6 O( I! h
5 U: `+ r/ ~. _+ lA *a=new A();, M& X! |; p3 S/ V. A. h. O( [
B *b=new B();
8 b4 I; g/ g# f C *c=new C();
0 k) Q% V: W) b/ @ ~A *d=new B();5 y4 [, E1 w; V1 G& \9 v/ E& \
A *e=new C();4 I3 P# \& {! M& x# X# B
B *f=new C();. X; k8 W0 J4 T
' e7 x6 Q+ F. Z, ]7 B1 F* i4 ]
delete a; cout<<"---------------\n";
0 s" E4 L5 m/ R8 o+ p7 Wdelete b; cout<<"---------------\n";; t' v- B/ I; @
delete c; cout<<"---------------\n";2 V1 k7 d% i& g b
delete d; cout<<"---------------\n";
. R( s6 K" f+ Q7 G8 B5 F; t7 ydelete e; cout<<"---------------\n";
1 \8 r) H9 c1 b' C- edelete f; cout<<"---------------\n";
5 P" v/ D- C, g( ]: v; a}
* l3 [/ a* B! K5 z0 a: o& h这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
5 S, f) `+ E3 N这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。% `& V9 h) U4 d% @) c
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)0 o/ t, e& j8 l+ L
(2)面试的诡异题目8 q. c+ h2 i2 v1 d6 Z
大意就是如果你 test *p=new test[20];7 H2 ?, \ Y: H3 _
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)6 q! I" n7 H& y( a
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
: X5 y0 v3 H/ S3 ^) Q8 B* R
- ~! _* Q5 K$ ]+ N# n( l5 M$ kZz7 ^5 {% v0 m* v0 U0 `
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html" K0 H! g L; V1 E
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html
5 v9 i1 n. ^- B9 ?% n* |爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html) q; }) j6 o, A7 ^2 p) r
——! x) }& G8 K' R4 t* {" S m
百度2011年实习招聘专题
2 x0 d7 D9 Y, t! s- q$ ihttp://www.aftjob.com/portal.php?mod=topic&topicid=22
1 a5 ^% u1 a+ \6 p. } h( E爱立信2011年实习招聘专题
0 S: N( V, o) O9 ^+ Rhttp://www.aftjob.com/portal.php?mod=topic&topicid=23
: j3 d( O0 M4 S8 s4 b; A; Y7 |3 B/ N新浪微博2011年实习生招聘, s6 `* i, @/ q1 N% |+ N2 c( m
http://www.aftjob.com/portal.php?mod=topic&topicid=21
5 d, `1 p1 m2 w3 F阿凡提招聘:http://job.aftjob.com/job3 g) y1 k5 g8 T
阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
8 j# N; i: u/ ~& m5 f阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum( V3 V( x1 |2 u: \
阿凡提职位搜索:/ h9 X* U: d( h4 s5 i0 W8 ?4 B
—— |
|