|
|
2009爱立信面试题
, Q5 n1 n% C2 G0 H4 s$ r5 Z; I5 \0 _, @
Zz
9 i3 M9 z' w- Y9 I
9 X& L9 b% v+ d. \; I: F. _# w8 e9 `(1)下面程序运行结果是什么:( P1 b6 N* g) L0 h
#include "stdio.h"
* X( {! b0 ~" j: F, R6 P) \5 Oclass test
' m9 \0 ]1 E0 _* d1 V, v/ b; h3 h{7 m7 {7 `+ u b8 X: T
public:( ?9 c# z$ y+ p4 C! G2 P
test(){}
1 h+ S7 d1 \0 Ivoid hello(){ printf("hello\n");}9 D w7 p3 O& J6 `
};
+ ^' g N) ]- R6 C/ J O% }4 Rvoid main()
, C* C7 V# S5 j{% _* U% i, w, Y9 |% l6 i8 l1 k9 F
test* p=new test();: S0 }4 F8 }" b2 ~0 E1 I
p=NULL;; _' s) h4 V/ \2 {* n- O! [0 J" d
p->hello();: l+ q* j3 [6 m) [/ J7 s( f4 d( I
}$ H4 d @$ R& Q6 M
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
! j2 y+ K0 x o9 p Q4 w- a#include "stdio.h"
3 N; O; o" J) C, c$ E% K) f8 pclass test3 ]# W. w( m2 y9 s5 n! N9 @
{' B1 p& Z% @+ i5 o# X9 o
private:8 j, \% e' Z) P- T' ^8 ]$ f" D
int i;# @) K' V) h& t7 t2 \
public:
9 C% Q; u# \: ntest(){i=1;}
; v0 |8 @9 b1 j0 V4 ?/ ?+ zvoid hello(){printf("%d\n",i);}
& t1 R6 G4 H, Y% H};
) S( b) H- E* I% Qvoid main()
" g9 X% q* N" C+ y* r( t{5 \* P- D' L; K# c
test* p=new test();" o5 Q% S1 S9 e* x' }9 v# _0 u
p=NULL;
! o* P3 w8 f1 f5 H0 ?7 F* ~( Gp->hello();: d3 U' Z! W& Q6 o. d
}' k& d- [$ b9 ~( G- v8 y: w
如果将p=NULL注释掉就无误,就会输出1.
3 p+ M8 T1 W3 W2 B* s+ b注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。* J* P( j0 b( x/ `" L# Z( [( a
(1)C++的构造以及析构顺序/ V( X* u& y/ t, s) f
#include <iostream>
/ ^6 t( g: K* x% N/ v% Yusing namespace std;6 g. j* n3 f: X' ]) k
class A6 j0 c" _& E, Z8 P3 j5 [
{( i+ `7 U/ U" }6 K+ [
public:& I$ I5 h7 T4 V
A(){cout<<"A"<<endl;}! F" l0 n8 v5 S: j7 I* \
~A(){cout<<"~A"<<endl;}
$ F. G+ f3 b- K};" G- \5 m" B( p$ U
class B : public A) ^! N# r: r0 B8 q' l# @
{
8 k1 W" H1 G% @" }) S6 Q, |public:
; G, x. J2 h7 O, gB(){cout<<"B"<<endl;}
W8 `' ?5 I4 a+ Z/ Uvirtual ~B(){cout<<"~B"<<endl;}
6 ?+ p0 N# n5 h3 V m- H};
$ E7 k% W; V' Vclass C : public B
g4 ?& r$ q# [+ ]6 y{
/ O- Y E" d9 P; _2 |( a, i8 x/ {public:
* s0 J5 A3 H9 m" @8 y5 IC(){cout<<"C"<<endl;}
3 l' j O0 }/ o# X! S~C(){cout<<"~C"<<endl;}
$ a% K! Y/ v9 @' v; z* [};
- \* H5 P5 s6 k9 }* x* J1 v) _3 s" ^- ^' I8 x: g: {* \
void main()
8 J/ T4 _) N3 Y' e' l8 |: _{- ]# C9 P# r- ^4 f2 L2 Q
3 [5 M) x3 ]( z4 F' YA *a=new A();
; |4 I& j! f# y! k. z, S, F" k' o! ~B *b=new B();
# e/ a9 c. t! j' v" p. E7 L C *c=new C();
" j$ Y' x! v4 C( B2 ZA *d=new B();
3 S2 _8 ~0 v; Y) PA *e=new C();; T9 u" p7 a* E% B5 u9 p
B *f=new C();
) P5 q/ H2 b7 z" }7 w3 t4 D
. t( H0 C( _" o# V- n: }delete a; cout<<"---------------\n";6 d( {' `3 W+ h$ Q7 ~
delete b; cout<<"---------------\n";
0 @) @/ C' N( Ddelete c; cout<<"---------------\n";* H' ]3 s( [# |: d! J
delete d; cout<<"---------------\n";% d5 M( f7 l; @) D6 n& i1 x
delete e; cout<<"---------------\n";
( Q1 ?( S% S H% H5 ?6 idelete f; cout<<"---------------\n";! E4 `8 d' G, T0 p
}0 D6 H7 L% z1 ~# c% m# N5 f3 |
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
2 a( t" B$ I W* }# Z% F6 s这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。8 u# e! F% w/ M' S: P9 O
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
2 l2 }4 Q& ]' X$ I# t2 b3 I(2)面试的诡异题目5 f! y/ y2 e2 @ n
大意就是如果你 test *p=new test[20];
+ y2 D! y9 u1 j$ t, `$ U然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
& }6 S3 ?7 N6 _- k8 X; n* O7 w0 X2 P答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
* |* E1 ]' C% L: ^. O7 ]. T
- `4 l, F( ^7 W; ~+ sZz
3 M( g4 w- o8 o# Y2 v% X爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html( m" A1 y9 Y& k
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html
- s6 a3 `3 ^8 @5 _* O爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
8 w) j+ j* t2 M$ K0 x0 `——
! B8 n6 T% R0 `, n* b百度2011年实习招聘专题
3 R( {. Y8 w N3 Q7 h2 Vhttp://www.aftjob.com/portal.php?mod=topic&topicid=22( l9 G! P T2 G# }( m: ]: }8 k& ]8 W
爱立信2011年实习招聘专题; l# R7 Y0 t! H
http://www.aftjob.com/portal.php?mod=topic&topicid=23
8 I. I8 @2 M* w5 k( B新浪微博2011年实习生招聘& o! ^- {2 k% m$ d. R
http://www.aftjob.com/portal.php?mod=topic&topicid=21
9 S. J- e0 B! o# ?阿凡提招聘:http://job.aftjob.com/job
! g8 ~, r+ h1 ~3 I阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag& P( a* h5 S0 B$ C8 ?; S+ F8 J w
阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum; h- E! B5 ~- j% Q
阿凡提职位搜索:& u8 t$ j% g2 g5 \: a" W- b+ Q1 `
—— |
|