|
|
2009爱立信面试题
2 @* D$ O+ h A; K
2 L7 Z: Y, n+ y, \Zz
" V. x, [, \: R; p6 q+ U/ [# ]5 Y8 Y9 [2 P4 O- [
(1)下面程序运行结果是什么:- Y/ G: C5 g/ i7 k( n7 T9 M) ~
#include "stdio.h"
- {% r, _/ ^) E0 ]- |class test
' g7 f% s0 ]! X' m/ D{( o1 K1 r8 w2 l: T
public:
/ j) q6 Q0 L; r" V; _( e# U- }test(){}
1 o& |. `* e2 ?9 q# K0 svoid hello(){ printf("hello\n");}
$ S, H+ Z2 h _( i7 J};* L6 z) Q1 T4 q: U$ `# X9 c
void main(); j; d) u/ j) b8 r
{
9 X% H8 w3 X4 y; a test* p=new test();
4 t- y3 ^4 s$ y( o( ` p=NULL;
) {: y9 P7 P) c* W; N0 e' X p->hello();
8 W9 h, q9 H) X" w- P) U* O4 f}
7 v, Y0 R# c4 @- J% o3 Q% L事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
( U# a# X# Q, a% R4 R#include "stdio.h"6 N& j6 D& B& I, A' K+ p
class test+ R8 @' r5 h! c! q4 E2 f
{
( X: b A3 T- d9 [( Qprivate:9 w+ H3 ?& Z6 O8 ~
int i;/ Y4 {, T2 j. d
public:4 h- M3 E' G5 j) U* s
test(){i=1;}
4 x! j$ O5 a, L2 @8 Ovoid hello(){printf("%d\n",i);}9 Z! y" X) K: g# i
};
( J! o; q9 R2 Q8 R6 i5 E$ pvoid main()
$ f$ A; W% ? R& N, Z{
# e, f3 @- `" G! R7 P test* p=new test();6 m. V( B |$ @' [! H# m. Q
p=NULL;4 m: b4 P' V& G' c; z+ t4 W
p->hello();
7 ^ f. L3 r1 M! G& q3 [# ?}
+ m* Y6 ~( I' N# U3 N& ~' u如果将p=NULL注释掉就无误,就会输出1.- n- A7 E7 K, j* }: N7 N q+ m
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。$ O# q) X6 ~( e' s- v5 M5 _) _$ q: v
(1)C++的构造以及析构顺序! Y5 l b; L6 ~' K
#include <iostream>
. {- c* t% O* a. J+ U0 Susing namespace std;: [) A) \ w' l5 \; M/ l
class A
, z' [- |* D5 g n, ]! p{; w% M" s# c. P+ }/ H5 h
public:0 K$ d1 \ C. ~" K# D5 P% k
A(){cout<<"A"<<endl;}. K( b; H$ `- {. ?! I6 Y1 M
~A(){cout<<"~A"<<endl;}/ r5 z9 @7 G0 B1 Q
};
$ B. K4 h5 D% [6 Z- F' Z* Jclass B : public A& r$ M8 j3 n, \: v
{
! p d0 M: j+ i3 K6 Ipublic:
6 |8 f! ^% y, t% k: tB(){cout<<"B"<<endl;}
- x( c* D- A; T5 `virtual ~B(){cout<<"~B"<<endl;}
, U4 Z+ K4 y; r U7 e8 P};2 F |- n6 C, p' L$ B- s4 ?& T
class C : public B0 |( e5 n1 x% n' E
{6 k+ A+ J: @8 z- g2 F
public:. U. Q. X/ {2 _& t* ]+ F$ p$ ~' V
C(){cout<<"C"<<endl;}5 F5 A. p$ l( Z* l- H
~C(){cout<<"~C"<<endl;}
4 M: C& c+ b# B( w' t};
8 Q" W" F. I8 R' o4 |: y! T; q$ A7 w3 v8 R' D$ ]7 l, E
void main()
9 i# v+ z& y i1 C) T{5 {6 d, R, p" g; |
6 y& H$ Z3 F, L$ `9 f) t( x3 K) v1 RA *a=new A();# `& }: g. Y0 z1 w. e& K6 x
B *b=new B(); _% I2 N9 Z% r) x2 ~. `; m
C *c=new C();
0 d" z- V' b' e; a* B% }A *d=new B();
, @0 t8 c& D& ], OA *e=new C();
; }, X( g5 ^+ IB *f=new C();( n- m! ?9 A( Y% s3 G
: Z4 a. j% t7 G; E/ T. wdelete a; cout<<"---------------\n";
- C, a1 f0 B, E! g; }) U* Sdelete b; cout<<"---------------\n";- x9 m+ N/ n) d' S
delete c; cout<<"---------------\n";
) }0 F' N( I0 j \+ x* h: D. [9 L. Vdelete d; cout<<"---------------\n";5 S( [% e9 q1 E6 U2 Y1 c
delete e; cout<<"---------------\n";
# ~) H6 B; C; G% M5 hdelete f; cout<<"---------------\n";
- a& v4 M7 ~7 w# r5 z7 Z( w. d: i5 t}* A) F- L* ]* h) L# v& | m
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。" n3 H/ }3 I8 s* a6 ~. W9 J% [
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
/ l: ?9 B, K1 z' D. _* Y6 V4 N其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵); M& {2 |/ O9 x! |
(2)面试的诡异题目
8 f$ w o" r8 H0 r" G, ^$ c大意就是如果你 test *p=new test[20];
6 k" z$ H( Z$ f, G: p2 Y然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
. G, Z& m0 `6 W& e; e8 a答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
: W3 }# _! C4 A1 r5 R
# L. q! Z6 b6 M0 nZz
5 t- M* B1 w$ J$ ?8 S- S8 T( R爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html* k5 k$ j; D. z; W% L
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html0 b& R2 }; ~2 P8 _( ?# C
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
) a2 J) P* e6 r2 j0 {——
1 \; F; v" {; k! {% e& B百度2011年实习招聘专题
& j; ?( b/ u9 j6 L; y: C% uhttp://www.aftjob.com/portal.php?mod=topic&topicid=22
7 n% x% ?6 A1 e* d8 r爱立信2011年实习招聘专题5 B2 W t/ J7 R. N6 n
http://www.aftjob.com/portal.php?mod=topic&topicid=23
, R6 Y! b7 [7 v1 W; s9 T新浪微博2011年实习生招聘. C+ t# s( p0 w" z! V2 z
http://www.aftjob.com/portal.php?mod=topic&topicid=21
% k; r( ?- e, v% G( K/ w' u* C阿凡提招聘:http://job.aftjob.com/job
o4 r! s# `' ], P$ B# V' H% d$ J阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag5 e+ M' G; F$ W+ ~$ i6 f! e" x
阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum
- ?2 S! |! Q+ p, q阿凡提职位搜索:& b0 O9 d( u. ^% Y) F" z* u
—— |
|