|
|
2009爱立信面试题
* [3 ` d P: [9 X# N9 e1 W! J2 q0 }9 ]- x C! m* q8 ^
Zz
i/ ?; l, }9 J! m, m' Y# r8 p' j2 ^
(1)下面程序运行结果是什么:
/ ?; K8 Q" C. U/ I F$ l, X#include "stdio.h"& j7 _* q) m5 e1 k. a7 `+ F: [
class test2 V3 J0 y3 F& l+ t0 u& @: p% |
{
* B/ W9 L% ]* G8 npublic:% a) B* Q6 V% L& V
test(){} m6 H8 d9 i3 u
void hello(){ printf("hello\n");}
" r W8 ^% B2 ~};0 N6 l7 f; T1 c3 r+ D
void main()7 L! J# ]: a6 |9 e
{
) u" k/ p r$ E7 ?1 [* t test* p=new test();1 e# b. Z# G' r& y8 Z) W( S0 I
p=NULL;, q/ F% c. P" a/ k6 _1 l. o) p0 e
p->hello();
4 p' Z% Y7 y, a, G}" O3 H1 s3 K9 `
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
7 Q; l- p- c C/ h0 C b: J#include "stdio.h"
8 R3 n6 n( t- B3 W- d& Vclass test
3 w+ [ A% c9 w) Z{
0 s6 U+ c" Q& q( r+ B/ d' l/ g7 Pprivate:9 W$ X$ _8 d: e8 S) u) N
int i;
# `( n4 N7 j: k4 I9 Y: Qpublic:
3 Z- O1 c/ e# j# D& J* dtest(){i=1;}* t& D4 v7 o! ^( f" m
void hello(){printf("%d\n",i);}1 G5 Y$ {7 ?% ~0 Y4 ~
};9 t+ \. }: I2 l2 \ M; J
void main()
& ]' h, O/ P6 r3 L$ Q$ D{
# n9 Y' x- [+ b2 W a$ }) B test* p=new test();4 \" x& r% j* B# b; ?$ Q7 b1 {
p=NULL;
: r6 U& N% d( a% C1 y$ h$ op->hello();9 |; u2 x ^ y; P/ i/ z% Q
}4 k7 h. A5 I4 J" s! J3 {
如果将p=NULL注释掉就无误,就会输出1.
# a! H" k& a- G2 Q注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
O) Z5 R: V* H+ l(1)C++的构造以及析构顺序8 b0 Y/ {' w5 S+ Y8 U* i
#include <iostream>" U6 ?, U9 F. Y; C/ N
using namespace std;
1 f2 f Q* a8 P, v: e1 zclass A5 \! R+ x0 i7 M7 x. F
{6 I6 N1 s' f, V$ L* W4 s9 E
public:% |# L* E( R. P
A(){cout<<"A"<<endl;}& l2 D& S" G3 K- P7 E t
~A(){cout<<"~A"<<endl;}3 s P2 ]6 A- I! U3 Q' Q
};0 Z: U, z; L* K/ X
class B : public A
) ^: @3 l+ O* g8 N5 l, Y{
: X! Q- ]% ~+ c2 B2 y! Jpublic:. I1 V8 k: T) O; n$ x+ m: a- F8 A
B(){cout<<"B"<<endl;}
3 H8 m" g9 v+ l' l. [ \virtual ~B(){cout<<"~B"<<endl;}$ `* x$ F4 w% u3 t! m
};
y$ o" }! ~. iclass C : public B1 n1 V" `* X. Z7 u3 _; z" \
{
& N0 y2 C0 b: L; u% s' `public:% f" b* }! J" U/ M$ `
C(){cout<<"C"<<endl;}
5 F0 f$ i* i. `( H7 B~C(){cout<<"~C"<<endl;}
" C6 @$ B, t3 O};7 F3 M& U0 b8 z) ]
0 `% I6 {0 w9 d+ y7 b' r' zvoid main()2 t3 j3 {* K$ J: ]
{
# _+ t$ G7 ^/ y2 r; a* W4 h/ b' F# R; I
A *a=new A(); |" v, |; }% M. e( k/ z$ S. Z! l
B *b=new B();
! W. X8 `1 ^2 c, i1 ~ C *c=new C();
) X0 W: k# l* v3 w: i' EA *d=new B();; e% m4 r8 H$ K- A$ n" v* l
A *e=new C();" n2 F) T; e) E; e( X$ S9 ^
B *f=new C();9 r8 g6 N' U/ R4 D ^8 s" z
6 v: U1 p9 d; x# ^
delete a; cout<<"---------------\n";
& e4 B3 t4 X' ^" mdelete b; cout<<"---------------\n";
7 U1 U: p d; [& D! F9 U5 ?! o$ Edelete c; cout<<"---------------\n";
5 V- R. z$ a/ q* R3 N5 Wdelete d; cout<<"---------------\n";1 c6 P; f1 U4 z2 }9 e/ _
delete e; cout<<"---------------\n";: X' z S* J! c/ u3 w
delete f; cout<<"---------------\n";2 J; E1 |0 x- J, K. ^$ w
}7 P3 i* q/ V, _" R
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。% K( v: m }5 h
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
* o( k( y6 U; f9 U Z) u2 [其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵): z! I6 M t3 M
(2)面试的诡异题目
; D1 G& {5 G4 B; Z( Z: t8 \6 Q5 X大意就是如果你 test *p=new test[20];8 X) J# Y& e' S- ~ Y7 a6 g
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)- ]/ r8 L, [- p! z7 C
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……: D2 i8 c$ c; G t% F* h/ p
- s) P- q, W. G3 c! J+ D' n2 JZz
( ?+ l4 Y9 g# }7 d+ Y爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
+ u% F4 W: Z! \0 E2 S% S1 b" l( J上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html: C* s W3 f$ y- M7 \
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html; e, m3 k0 T+ w) s# ]4 a6 a5 s% A
——6 y# V& o; R3 i
百度2011年实习招聘专题/ R5 l# p4 b3 P+ y$ H
http://www.aftjob.com/portal.php?mod=topic&topicid=22. g% i5 t6 F2 t; Y0 K1 I; \9 g
爱立信2011年实习招聘专题5 G& @* U0 E+ I: {
http://www.aftjob.com/portal.php?mod=topic&topicid=23
2 X8 W; x/ ^! @ H% P* ~8 l* [1 D新浪微博2011年实习生招聘3 R/ s B4 W3 L3 [7 o' ?$ |
http://www.aftjob.com/portal.php?mod=topic&topicid=21+ R+ w# d9 H7 `3 m1 s8 Z$ p- m4 o" I. Z
阿凡提招聘:http://job.aftjob.com/job
( e" h" s" E! `' Z8 Y' g阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag+ {% r0 S6 Q3 ~) Q- i
阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum
: H2 w, x7 `" M+ W$ J9 a1 U阿凡提职位搜索:/ D" i& r, t$ h! d4 r) b
—— |
|