|
|
2009爱立信面试题( p# R$ P6 Y( }- \3 Q
+ y/ n. [7 n! l- R0 c4 r
Zz
0 z, s* H" D7 u H
; @- \" |0 e# O" J" h. f1 b(1)下面程序运行结果是什么:
/ t; n% ^/ o9 U* k" h. o1 V#include "stdio.h"
& m( S8 i( { K1 tclass test4 L& Y& A4 ?# ]; B8 H: N. F
{9 \2 ~) r! k3 R+ R
public:
, d: z3 p8 M# }4 J% y8 y# m" T% Gtest(){}
) G" a7 T m0 `& I% D |7 dvoid hello(){ printf("hello\n");}$ z2 L. E( s' ]' }* x: {& O4 l
};: Q2 z( `, E( ?8 R" _: d- [* d4 S
void main()
; P# P- i. E4 N% }{
" k4 Z: r4 v8 k$ }: a test* p=new test();' P1 \3 B9 l9 ]6 u: m% Q: R
p=NULL;) F4 Z: I8 k6 A7 \+ C% f
p->hello();! s% B7 h# G5 r2 e6 g3 R7 e# Q
}$ q9 A4 ?' w" ~% l+ n3 u7 L5 L
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:5 q6 X4 A' g, Q
#include "stdio.h"
. W: g- g! O8 p* q" [' [/ c4 sclass test8 O; X" E0 P: l
{
y5 b9 i9 r6 u" v1 w7 fprivate:! B' J0 m* q( T( m5 e
int i;# H; n6 Q# a' Q
public:2 `, C: e! W* n* Z
test(){i=1;}6 {0 K: ^! |* o* l
void hello(){printf("%d\n",i);}# `7 g! { m' S$ j
};! }, W. z+ c) f, U- ?1 k
void main()
) X- y* F$ H9 n/ R% o; s. @* j{' p$ S' P' |- {) z
test* p=new test();
0 ]8 h) x' a& h# Rp=NULL;
8 a: c$ v4 t6 M6 E0 B! V' Dp->hello();( ?4 c9 b" N6 {2 B& y& C3 c9 r* ^
}
6 N+ Y+ [5 b' O8 p! C; K( g& p- a, `如果将p=NULL注释掉就无误,就会输出1.
& j4 o/ D$ ^9 [ h+ A注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
1 o+ I) p! F+ q; x# Z(1)C++的构造以及析构顺序
$ U) F, m! @% g' ]#include <iostream>( c, _, S: U. a
using namespace std;/ Q5 o+ y& |( y5 U, B' Q: u. T
class A
( A% j d& ?2 e0 l/ j: m{' ~4 a5 S5 s: e" B2 n& p6 u& t
public:3 H8 c4 T- S Z. D, M7 r: z
A(){cout<<"A"<<endl;}
1 ?9 i% N$ m- t( X# ]5 @8 a# g~A(){cout<<"~A"<<endl;} c1 w, l1 A3 F9 r
};3 U& J( e; k$ `+ W& X& I
class B : public A
; W& [0 O* r+ o/ D/ s8 K" e{/ q3 j: d7 \$ i
public:
9 ?' H- j! ], `( C; ?5 EB(){cout<<"B"<<endl;}* V7 u+ {0 P* S
virtual ~B(){cout<<"~B"<<endl;}
( X$ x; i5 N% i! r% j};
7 X# h1 `3 H8 A; o8 \9 Jclass C : public B2 W- @1 t1 |& f- \. j
{! \; f/ K$ p+ C) P9 H9 _- q3 _$ U
public:
! F. M6 T3 @3 E( b- ^5 JC(){cout<<"C"<<endl;}
/ M3 V% V8 P& f8 }$ L! G~C(){cout<<"~C"<<endl;}
, [: G/ ^3 j- {( T. h7 U$ t};/ W; G: Z" e3 @6 K# U
$ b, ]& T/ F6 V2 }: }void main()
3 \, y' N6 ]- W* N- b4 G w{
* M4 d% U9 y: C1 P/ h
2 x) @2 u1 T* x" E3 Y% @- AA *a=new A();; @0 M! w- J( f" _# h- X
B *b=new B();' \6 |, ?* h* E @9 O* G, C. W
C *c=new C();* ]' C+ I/ g1 c7 Q
A *d=new B();
' e- C! r7 m6 kA *e=new C(); }; }8 X$ j' c/ x# w
B *f=new C();
/ b0 _" p: r( T% R" m% e: g9 w& P g
delete a; cout<<"---------------\n";
1 b! b# }$ p3 l$ S* adelete b; cout<<"---------------\n";
1 N* t! Q( S& _2 }0 _9 \1 |" [delete c; cout<<"---------------\n";9 v( m7 R/ i! G' Z
delete d; cout<<"---------------\n";
; ^% }/ b( q4 W! a7 x N3 mdelete e; cout<<"---------------\n";" k4 i9 Z* K4 P. k7 W; y4 W6 c6 L6 N
delete f; cout<<"---------------\n";# O7 X$ g$ e1 l& w9 E" F+ d$ c
}
3 r9 k+ t4 H; l( e: {这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。0 E3 k$ _1 n* Y3 f0 N
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。6 w+ O- o# ~! z0 ?. Q
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
0 S+ s+ y& T$ X3 m- T(2)面试的诡异题目
8 ^, W" M, o/ ?0 a# o大意就是如果你 test *p=new test[20];6 H/ j, d' n& n4 P# F: I0 B
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)8 b/ a; }7 Q, `5 ]2 U
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……: t: ?4 j8 z0 \
+ c* _: a" `# R# @ i
Zz$ Y/ ?. F! B) i, o* v3 B. ~
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
2 V8 N" y4 h( n$ Y4 [上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html
) ]1 ]7 L U# o2 ]& T8 P爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
& K" h. Y1 S& I- C* Q/ t——
( K8 T( t9 Y5 z! f; @: a! I% M) g百度2011年实习招聘专题. _& S+ q" N" [1 u) W1 w) t4 ^9 u
http://www.aftjob.com/portal.php?mod=topic&topicid=22. |/ r; O1 h" J7 u- U$ }
爱立信2011年实习招聘专题$ k( `* Q; P- | U% h
http://www.aftjob.com/portal.php?mod=topic&topicid=236 b# C+ \! a9 S! T/ F
新浪微博2011年实习生招聘
7 a9 [! X* x6 O6 K" {6 R8 ^+ Ehttp://www.aftjob.com/portal.php?mod=topic&topicid=217 n& E8 b7 m2 q; T1 q5 T9 u
阿凡提招聘:http://job.aftjob.com/job
$ x& d2 o1 z# ]. V% @. _9 K阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
. _- ]6 m4 i0 Y- o- h阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum: T, R3 ]" v6 h) @. _
阿凡提职位搜索:
( Z# h5 [4 m( x* b9 W—— |
|