|
|
2009爱立信面试题7 l2 m: T, q3 }( ^6 k1 g
( T2 \; q2 J; I- `0 b* i9 X
Zz$ S- c( i; l0 v5 ]9 T
& o/ g- ?) F% r! f(1)下面程序运行结果是什么:3 w4 p: q2 }# Y+ Z
#include "stdio.h"# ^, U. L2 Q7 r0 L1 k( r- V
class test
2 l% N2 ^. r; K4 `- s8 ~0 W {{0 X4 F) @+ N. Q+ o) i; j0 ^
public:' a' [( @7 y% } B7 B
test(){}4 z$ f' u1 I8 o# t
void hello(){ printf("hello\n");}$ H- x W7 |$ u }% I7 h
};
/ z0 H# [/ |% m W) r. fvoid main()' ^ q/ m% Q# w$ e+ H J
{3 N+ A2 [: ?& p8 g" V* o1 f7 P! O
test* p=new test();
$ E/ n* u0 o! u p=NULL;
& y; F8 D9 m) N1 h3 J p->hello();
. Q" J& p4 D$ S7 O}1 E/ o$ Z2 |# z. _+ f9 E
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:* z$ m/ `. M$ ` [& n: D* P
#include "stdio.h"
5 T1 O1 F1 g/ N; xclass test
" }. k- @/ ~, s; L4 W{3 I6 c3 P0 A' A4 }1 [/ }' z
private:
7 D) c6 Y2 r/ B! q6 |# A1 Tint i;6 I2 e- p0 [7 w0 a! I
public:
! C$ C: x3 K# i9 I% _+ T" X# vtest(){i=1;}8 [+ f2 u. Y" w9 G! u
void hello(){printf("%d\n",i);}& \6 ?1 P* J- R5 @1 H; i
};9 _' Q. o6 F4 b) e6 u) Y( U% P
void main()1 K+ |. w. Z; b# R- D+ J
{
* B+ D2 ~% }/ O J) w6 `) j6 Y test* p=new test();+ C1 E) |( r1 u) ^
p=NULL;
3 T( g" V3 `2 R, j, X( x: C9 }p->hello();
) N$ p; S9 K8 d' x1 k3 f$ e$ G}1 {+ d: `) D$ g+ U: h
如果将p=NULL注释掉就无误,就会输出1.* A* I$ x. t# ^* D
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
- |- b& ?8 d3 S! k(1)C++的构造以及析构顺序8 v J( G) V! |% W. _
#include <iostream>
0 t Z$ H8 n9 B0 Y& z/ husing namespace std;! ]; _6 L0 ]7 R$ |# a
class A
! i* D! o) t( W, }: C& z{/ l+ h- d( @7 ^2 U2 w
public:' B' z8 ^ Q1 e
A(){cout<<"A"<<endl;}
7 \: H! [* ~1 S+ x~A(){cout<<"~A"<<endl;}
# ]/ f/ N# D1 @7 }6 A};* }. _6 ~% H! @7 x
class B : public A5 X( p5 J& g& u
{
7 T$ n% J: \6 [+ Z: wpublic:2 n A) p2 @/ w9 V
B(){cout<<"B"<<endl;}, N* m( V: k) M7 k; D! A
virtual ~B(){cout<<"~B"<<endl;}( |! \9 p/ c& C( U- ^2 Z/ B$ `
};
) J( k" ?' I! h" P; r9 cclass C : public B8 b' n9 v) J0 v+ c& v
{/ P. B# H0 `+ N
public:+ b' C- Z* t ? T/ t3 c
C(){cout<<"C"<<endl;}
# K% ?0 F2 @( T6 E, ]) x, _% _6 j~C(){cout<<"~C"<<endl;}+ K+ F- }, ?: V
}; a+ r! J, Q7 w' b% F0 B" @4 s5 i
/ M+ q h# @! f" Y# t1 avoid main()
( f/ u6 m' D m& s( R{- @* ~4 ~! F$ j3 ~
8 p; @- u- M- C0 R
A *a=new A();
' }' x; b# g% v$ a3 q" oB *b=new B();
3 M- Q2 n6 H$ P/ p1 T C *c=new C();
6 O/ }9 _' h( H# G9 }8 L) J+ kA *d=new B();+ v; P7 ?+ T' R6 l9 I+ Q
A *e=new C();) \3 x1 y% D; x! [: Z
B *f=new C();; Z& N3 E' Z1 f
+ v Z1 t* J- F5 v& Edelete a; cout<<"---------------\n";
2 ~# I0 P. z* z; b* D1 Adelete b; cout<<"---------------\n";" ~* n4 K& u+ }
delete c; cout<<"---------------\n";
2 r7 I6 ^- {# y% ldelete d; cout<<"---------------\n";7 P$ m! P! u: a* A) w: a3 W# R6 G% d
delete e; cout<<"---------------\n";
( L: ?* _1 r: Ndelete f; cout<<"---------------\n";2 \7 s8 ?, B! _7 U- l; O
}
$ e! I. ^+ m8 r% Z这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
9 ]7 X! R$ ~) Y/ U; ]; l这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
; g8 F7 ?2 S8 x7 m0 }4 W# y. n0 V) m" r1 A其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)" t" _$ s% S% Q" N* M$ |6 C
(2)面试的诡异题目$ [2 W6 ^" X3 N5 X: o; o
大意就是如果你 test *p=new test[20];
3 r) t: g o' C4 R然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)9 F; U6 G( U1 J- v% |) F6 O$ X
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
1 D+ s# w4 H9 S. J2 U( s9 ], c1 J; B7 U/ k& J; n9 N- P/ v2 V
Zz1 j! ~, h9 S! S$ a# M
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html7 K$ @, g; I/ t3 u
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html
( h8 L! \2 t# g1 u爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
# u' D. P% L% j u! e: r) W4 r: x——/ f- \( W/ z5 @
百度2011年实习招聘专题7 C. l6 w3 u1 [4 }9 a
http://www.aftjob.com/portal.php?mod=topic&topicid=22
/ ~; c2 S; C( ?* w$ @爱立信2011年实习招聘专题
" s8 Q& t: x( ohttp://www.aftjob.com/portal.php?mod=topic&topicid=23
2 j4 ?( k6 w- J" c; e3 F1 X新浪微博2011年实习生招聘
" o* q, U( G0 G# }: c! Mhttp://www.aftjob.com/portal.php?mod=topic&topicid=21
. q3 Y; a5 {& ~9 d* F阿凡提招聘:http://job.aftjob.com/job
7 {$ L% f! `3 o/ d阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
5 I `3 O1 Q& q& A阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum1 U( @1 m8 B# ^
阿凡提职位搜索:5 s, e5 b! t' H5 B5 F, A# R
—— |
|