|
|
2009爱立信面试题
! Q& g9 ~$ v3 v' q7 @! V2 E
# I2 n4 I& x' a+ |Zz8 D' t1 G" Q1 P% O, N
5 t, R& n+ _ R- \6 q) l(1)下面程序运行结果是什么:
' ?( D1 B1 O, S9 m8 L#include "stdio.h"; W7 y. t. R2 n b
class test* m9 t1 H6 T6 d' R8 ^3 w
{
: Q2 g" P7 n- f9 gpublic:
& V; D, E$ v: L M xtest(){}4 |8 a0 N4 @+ l4 g
void hello(){ printf("hello\n");}! f0 E! a! M* B+ c8 \% t
};# W1 c: m5 w; [* F3 E
void main()
1 {( v0 a r, D# c{
; k1 M l! e( V* { test* p=new test();
4 m0 I9 j) m$ O1 M# Y p=NULL;( d. X2 h$ E% [. d0 D+ M
p->hello();" a' S! y# R1 T
}
0 e5 I H3 c3 x6 e/ K- I. X* \事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
) `! X$ Y. V# e" |1 u( X: S#include "stdio.h". c O& e5 Z; R* G0 B+ Q/ f
class test2 j" P& z6 W" z; j7 Q5 Y1 n
{! X+ u( G8 ~) C6 r
private:
& ? z$ m, e8 _9 ^! n+ Fint i;+ B& ^2 v. x+ i1 s9 O5 V
public:
; ^$ G7 u& f, {3 u0 `' \& c( Mtest(){i=1;}
9 U2 r9 v: u5 A# W2 d/ ~. rvoid hello(){printf("%d\n",i);}7 v0 d% k [5 A4 C1 z. N' I
};
; B( O4 C3 I3 b7 y$ ivoid main()+ |1 V0 j1 ^: V3 v+ C
{; A- |* X, u) y* _$ F1 D
test* p=new test();
7 z6 }5 J, n1 H4 w+ @$ `( c. |p=NULL;( R7 ?: g3 Z6 L/ U/ K9 ^
p->hello();
% D- [6 p5 O$ `3 M! X}2 P' ^4 a$ k5 }( I7 F
如果将p=NULL注释掉就无误,就会输出1.$ p( U* h! z/ [2 F( [' q
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
, a1 G% N6 {# _* C6 {( K5 G+ A(1)C++的构造以及析构顺序4 y* q7 z6 c" x) u$ _" O: `# R
#include <iostream>, b; |. i( V- B" W; v' ?' u9 |
using namespace std;
2 D' J' G* ~' I4 U4 Gclass A
( i6 G6 d! E: X6 _6 Y, H{3 F/ |7 a* R: k7 L& U. p; W
public:, V$ H& q9 q" ]+ n! i
A(){cout<<"A"<<endl;}+ ~# _" U$ a" a) E
~A(){cout<<"~A"<<endl;}" R# a1 q+ V: s& }5 ^0 l' Q
};
" V$ H- h. l- [! e4 k5 wclass B : public A
* n* h% p$ O; C8 ^! P% t2 J% {{
, q3 W. ?" v' w! k3 E9 m( mpublic:
# T# C' @3 L/ cB(){cout<<"B"<<endl;}7 m' e9 C. B. A7 ^/ A7 q
virtual ~B(){cout<<"~B"<<endl;}0 M0 Y8 t5 |* ~4 q# j% Q
};
/ _ |; w: u) \2 v; Z; N% D Hclass C : public B
3 E5 c5 ^0 U# y3 O: a4 Q{5 `( H9 {3 ?. Z4 b6 U1 a r( G1 a+ ?; b
public:- Q+ p. p$ |2 y; w
C(){cout<<"C"<<endl;}6 m8 u, A/ a6 U/ [4 u" Y2 ]( T
~C(){cout<<"~C"<<endl;}+ ?9 M0 V! E, _# \, ~. P
};' _! C5 n% p! n0 a
! q8 X K: B* J% d/ `; e- dvoid main() t4 Y# Q$ O6 d% _0 u8 i
{
k1 D \0 r( V$ e N' J( R/ l8 Y0 v. q, T7 a" J
A *a=new A();
+ O) r5 D1 d0 c U$ pB *b=new B();
, B& [$ O. x s! _ C *c=new C();
' T& w' X. p, R# f/ Z! E1 N# FA *d=new B();
$ Z0 U F3 l8 x2 YA *e=new C();
9 y6 j( }$ F" R4 ?& S8 DB *f=new C();
9 B6 |/ O# D- h4 D- C* w Y. s& @) _& S7 f
delete a; cout<<"---------------\n";% C% g) u0 o" m6 [8 Z
delete b; cout<<"---------------\n";
C$ Q- ]: J) `( r% _delete c; cout<<"---------------\n";; @) F, [, u. ^/ z9 s1 s- b
delete d; cout<<"---------------\n";9 I8 b; M% b( J8 [: t; L# d
delete e; cout<<"---------------\n";8 p M, P0 q c2 E/ M) i- a
delete f; cout<<"---------------\n";
+ M/ `) o2 j) Y}
! X1 K1 K) h1 Y( {6 s7 \7 a这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
) y/ A, g/ y8 j- |+ D1 e这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。, f& c; n; S, X4 ?4 g* l3 z/ o
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)6 N. e1 u. d0 Z# b8 ]! d* l2 l
(2)面试的诡异题目
" [7 I" A/ A4 e5 V' i6 z( w/ X大意就是如果你 test *p=new test[20];
, r1 g0 W9 [. O( r) W. K5 C3 |/ D然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)+ D* a) t2 o$ U0 |: c
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……. W* O! y# c9 X* I1 f; q) n
/ z' W/ A+ @' w( N# c$ X) H! b/ ?Zz1 i* ]0 m/ o( _7 z. O; \8 j0 A
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html0 O& I; t4 k+ N/ k
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html
+ i# W' n" o; y1 J1 }4 g爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html5 E# x. `& v- y4 ^. c
——
' G. L: P: ^) X百度2011年实习招聘专题7 M1 r( K* P+ e; _7 W
http://www.aftjob.com/portal.php?mod=topic&topicid=22
2 A" P* H5 p2 _* G( F爱立信2011年实习招聘专题% g( a" n7 F6 o6 X4 u' e2 k
http://www.aftjob.com/portal.php?mod=topic&topicid=237 R1 v) o3 [( P# m9 B& {* m9 n, q1 U
新浪微博2011年实习生招聘% i- O/ N; h; Y8 M
http://www.aftjob.com/portal.php?mod=topic&topicid=211 u5 z! {, r" |6 q
阿凡提招聘:http://job.aftjob.com/job
J! A5 j9 z" |5 O) o阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag* ^, y7 a0 v: b; C0 b
阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum7 D7 U+ C1 {; C( S; S
阿凡提职位搜索:1 g0 t6 E& A* _% \/ q2 t) Y- _
—— |
|