|
|
2009爱立信面试题$ h0 B, i& X5 | p: t9 i
* c9 a3 w* O' \; pZz" g3 E$ J b6 o- m4 B) V' }
, u. f2 ~% q( N7 ?0 d8 ]$ m(1)下面程序运行结果是什么:
+ ?2 i; c/ y& ^+ y; x2 y4 }#include "stdio.h", F' z! z' \; j1 d, L3 x7 W% {
class test
3 D: H$ W9 C0 u( \. w/ X/ d+ y3 L( E{
! M- P- f; m: }3 _" `( Epublic:
% ~$ \- m$ E+ r; Ftest(){}
) ]5 @1 m1 r r* V4 P2 {void hello(){ printf("hello\n");} ?7 X2 S: a. `8 f1 i9 u
};; }& ~7 _* M# f7 y" L- f& O6 J
void main()5 B: q ^0 c$ H2 q
{& u# b8 B; M% n
test* p=new test();
! P# p0 r# J$ m( J* B7 L3 a$ N p=NULL;5 x+ o7 x# ?7 _
p->hello();" V v# v% w) D i
}5 H, W/ |% s, F" T- l l
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:1 q m$ r9 K+ \) ]& Z( }; a E6 Z7 h2 M ~
#include "stdio.h"
( P0 J3 G5 j8 |0 x- S" J* Vclass test$ Q T( y5 O# v# T/ R
{
5 P+ u: x6 |, f1 ~private: ?( E& C0 |" y" _' \; p0 w
int i;6 M& W' j# q6 _
public:
+ N0 d- n' B$ \1 y8 S8 o7 ~0 stest(){i=1;}, T N# D( p C4 C# z' K* K5 H
void hello(){printf("%d\n",i);}
( f/ O& m$ g% l# S};# Q8 ~4 V; I- Y* r: X& u! R2 g
void main() u1 U9 C% S; r% ~
{ [; }: p3 V- e9 }; j
test* p=new test();: A# f5 Q1 `# ^- e5 O5 W8 s
p=NULL;5 E2 N+ k% o) P
p->hello();
/ f) u8 p$ y1 H N# _0 Q) z}
g" D- ~: X0 }. g3 g如果将p=NULL注释掉就无误,就会输出1., y% g* j/ d( I7 Y! \
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
* ?( D1 n- l. T% @/ `(1)C++的构造以及析构顺序
A# Y/ r3 o2 R1 X) \#include <iostream>
7 _; G, q+ ^8 a6 e1 zusing namespace std;- `- ?. q. l' n, u h! |
class A
1 ?$ ], X6 V3 S+ D8 p+ q4 Y{* W9 q9 w/ W- y5 Q% D/ X( x
public:7 S' Z( B+ b+ P8 O2 p
A(){cout<<"A"<<endl;}; q- w4 E$ u6 O: j; ^. j
~A(){cout<<"~A"<<endl;}% C; M- q3 F3 M% t/ G1 s* C
};9 B* d2 W% S' k. Q/ S! x& l: f
class B : public A
6 y% c6 \8 i3 {{$ s% n( b. l: M0 c0 g
public:+ c$ F4 J# [0 d; j& f
B(){cout<<"B"<<endl;}# H" s% L8 ~5 l5 l5 u. x
virtual ~B(){cout<<"~B"<<endl;}
1 O# n3 }& _) T! i};
' V' Z7 D7 `' y8 |3 Lclass C : public B
9 S6 S/ j4 b; U" D/ V5 G/ a{8 Z8 M3 r/ j) n Y
public:/ a% F3 o9 x3 s, \# l% H
C(){cout<<"C"<<endl;}4 c: J2 [ U- A* G5 X
~C(){cout<<"~C"<<endl;}
4 P. Q" @+ F" [) D. T" u/ k};
2 j) r: K P0 j0 Q- E3 J) p( H n/ H3 e
, [7 k- X& Z; `* c uvoid main()+ i% Z$ O- {$ X7 `8 Q, W. z
{ d4 |- l+ V; R3 x
$ Q2 I9 ?# M) C+ WA *a=new A();
2 B4 s: T2 w2 b) F7 N5 w6 UB *b=new B();
2 _+ [4 W b+ m$ d* ^ C *c=new C();+ b; X1 `( c: S; L
A *d=new B();4 r* ]( u2 P& c
A *e=new C();
0 B* F* u3 }& N! z! c7 e: v r) JB *f=new C();$ s0 D; Y0 U# ^6 ]: k8 O
& |2 G8 E$ G3 v6 h7 Z' \3 Odelete a; cout<<"---------------\n";2 j0 R1 O; \( {& d7 z2 n8 X
delete b; cout<<"---------------\n";
* d: w$ d+ q& o4 y2 O2 Sdelete c; cout<<"---------------\n";
* ]2 r/ Z- B+ U, r# {delete d; cout<<"---------------\n";4 [+ g7 s/ }& b8 E1 a
delete e; cout<<"---------------\n";
% t: S% F n4 I7 W$ m' L, Gdelete f; cout<<"---------------\n";2 H A& O/ U) P2 Q* ~2 J: U
}" U ^5 [/ y( q! h% \3 u: s7 {2 z6 o6 P
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。' D- q4 Z s; ~3 W9 Z
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。1 C" {( c4 l& _9 S+ B
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)6 @7 Y- N6 ]. }# R: d
(2)面试的诡异题目
5 C' p. [! b& L+ W4 Y4 D S大意就是如果你 test *p=new test[20];
3 C) q1 [$ ^& o/ x- I然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)5 _" J6 M3 ]5 j
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
9 `. A: \8 b* A4 v) Z7 O! c3 w1 }4 O- B% C* e3 |7 U
Zz+ h, ~: `, w5 s
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html3 D5 [' A4 D8 g0 K. v$ p
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html( X, {! N! x2 z9 y6 F) z$ K0 V
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
5 H, l. @, X1 Q1 X——
/ `- E6 [1 k. K# o/ o6 H" M# K0 V百度2011年实习招聘专题6 S3 y. m& U; `; y S" g3 e
http://www.aftjob.com/portal.php?mod=topic&topicid=22
( d2 W( X: ~! x" N爱立信2011年实习招聘专题: b( H4 Y! c. Q* _% y
http://www.aftjob.com/portal.php?mod=topic&topicid=23& N9 y1 \- j( z( V6 o3 \9 G
新浪微博2011年实习生招聘# b' U, U$ Z7 t* ^( o4 r q W* n
http://www.aftjob.com/portal.php?mod=topic&topicid=21
' R! A% H3 V- a; K' S$ i8 G阿凡提招聘:http://job.aftjob.com/job
3 d) p" e1 z; t5 X0 |7 E阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
! z: h4 ?: f5 |! F4 i. F- u阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum2 h' S5 `, x. |4 u2 H
阿凡提职位搜索:
% d1 Q9 y `2 r" z; G—— |
|