找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 1172|回复: 0

[面筋] 2009爱立信面试题

[复制链接]
发表于 2011-7-5 10:42 | 显示全部楼层 |阅读模式
2009爱立信面试题
+ c3 @* [: L. O- j
7 L: b9 {9 }6 u+ Z- G; l7 v- yZz0 o0 v) @! R1 {3 L6 T( Z3 C

9 P  V  W* k3 |7 K: V(1)下面程序运行结果是什么:8 y6 \3 j5 m2 o3 {8 `- c' h/ e3 U% b
#include "stdio.h"
( t9 W$ p2 x6 tclass test- @) i4 `0 o1 k+ b, G
{' ?( n5 ~3 ^5 j" H, M2 T
public:- B% @. {' K- A# p
test(){}
: ~( u' R+ A' kvoid hello(){ printf("hello\n");}, M5 a+ a; g8 z' s; W  I  G7 g
};
2 U: C1 U: j& ?6 I6 @2 Zvoid main()
# d5 m# c8 f! s% H9 [5 P: t/ e  b) V) {{) f5 L# G. p/ |4 P
    test* p=new test();
6 B+ \- J2 T0 H6 v    p=NULL;; J3 i% i1 G4 z5 H
    p->hello();
7 C& }6 s' H/ q+ t! I' `}) Z/ D+ L4 G* q5 X
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:- q( b% z. Y1 M; f
#include "stdio.h"
, {3 v9 y( e; M7 N) q3 v, D: r& Rclass test
1 ^: Y* z+ n- W5 ^: M, ^{
0 x% W" K5 z# ?4 r7 E9 p! n  }private:
0 X1 l, Z( k: K9 m& j  k: cint i;* k" e* P) R& p. `3 ?
public:% k: E% u" }0 {9 v3 T
test(){i=1;}3 J6 _" [/ \) z) h. r, \
void hello(){printf("%d\n",i);}5 C5 L2 [! M9 K- k
};1 ?+ Q6 z" j9 x( y) Q( j
void main()
/ q: @9 c# F4 q. V1 i{
2 ?- F  ?# u5 s! `( C* h  E, x* b) f    test* p=new test();
3 r& U1 ^- L( A  c1 c: ~( tp=NULL;
- j3 R5 I, z4 l, @5 z. pp->hello();6 t: Y0 K2 U8 G5 d2 u
}
6 {) l. y. q; B$ S+ Q6 Z如果将p=NULL注释掉就无误,就会输出1.% E# k4 `  g% h% t
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
1 O9 n" {/ |( u0 a. Q(1)C++的构造以及析构顺序1 _% @( z  r# @' q+ p
#include <iostream>4 F3 U- x: C/ A% K) V" @8 E
using namespace std;
; j$ q" k1 M& e% T+ b" uclass A" g0 W' r+ m5 X" j0 w3 r
{
4 ~- E: v& q: n% ^: \' R% wpublic:8 m& b2 H# ?9 u7 y# L
A(){cout<<"A"<<endl;}( O  z5 r& N3 z  E) I
~A(){cout<<"~A"<<endl;}0 {# [  |8 ^; x/ a3 a# C7 Y
};
1 f0 ?+ T5 |, |, I5 y" x+ D* z4 rclass B : public A
/ F1 y7 N- J3 T, s{5 V0 T/ W! J+ y8 [
public:
% A4 V; q/ [+ m1 Z# ^B(){cout<<"B"<<endl;}' p" e' v- F& G/ Q! z3 z3 f
virtual ~B(){cout<<"~B"<<endl;}
7 h+ ^" n! F, z" T$ H2 x};
& q6 [. {- n7 G  g/ T5 Pclass C : public B
  S0 @4 ?! m8 F4 @; |; y' b{
, \$ B8 f2 E0 }+ m8 ]: spublic:
6 q+ p- ~6 I# [C(){cout<<"C"<<endl;}
2 D0 i1 o! y8 p: p0 r~C(){cout<<"~C"<<endl;}. R  G) {6 m6 L' n. z% g' D
};
* T; \- g5 t" k! `+ b, E. Q# ]! Z+ u* f, I1 p: M! C# ?
void main(), l1 e- ?! t) t) c
{/ D) x2 a+ i3 }+ U. J+ _
! W% R% e) K' t6 _; q
A *a=new A();
% c" I" ?7 Y; v4 a  SB *b=new B();3 k$ }& f' a- D; c0 n( i
  C *c=new C();0 S  i: r1 I( V. n
A *d=new B();3 J1 V5 j# d0 a  A/ x6 H
A *e=new C();# ?* r8 ~2 I) E! k6 I$ N0 z
B *f=new C();' P" b, L: d% J" P
' z4 R  |1 D: z
delete a; cout<<"---------------\n";& x% M5 b& R% L5 o+ v4 E6 m
delete b;   cout<<"---------------\n";1 U* h3 M% Y" k, M# T' j
delete c;   cout<<"---------------\n";
! h8 ]5 H2 S% k4 t9 M" \delete d;   cout<<"---------------\n";" j3 m9 `8 {9 H
delete e;   cout<<"---------------\n";
) p" G4 a' [1 b* `- ^8 n* H$ kdelete f;   cout<<"---------------\n";1 d9 l: O) W- t, |
}( w8 n  H- b5 y1 D2 X: {
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。& j" c1 a/ B" T# i9 i
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
" \* F! j( i1 K其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)8 l  ?4 O1 I# K5 e  |
(2)面试的诡异题目, g6 `, F6 t' a! F" C2 c
大意就是如果你 test *p=new test[20];( A) n+ E1 r% |7 U# @' ~
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)0 r/ s" P+ t4 F  R% |; Y. I
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……3 j7 u. Z4 l0 N* r9 W. w- r

" w1 Q- l6 _4 c. YZz
7 ?5 m) h$ v. T0 F( l/ P爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
  B6 H+ Q! V$ v0 j+ B5 i- S* }4 c上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html
; A! o, ?& }5 h9 w. R) C2 U7 s2 w+ K2 n爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
" ^' y4 f0 n/ _- N* ]——
4 {) a# z; n& T: e- R" d# t, O+ {百度2011年实习招聘专题/ s$ @$ W) g# ]4 m& |
http://www.aftjob.com/portal.php?mod=topic&topicid=22
7 f4 q2 Z2 l2 G" Q3 I9 d, E爱立信2011年实习招聘专题
$ v. E! j7 k+ e2 Yhttp://www.aftjob.com/portal.php?mod=topic&topicid=23
9 c0 x" M7 J/ T" s% ?新浪微博2011年实习生招聘
. C! |# \+ l0 ^4 {  G; L( lhttp://www.aftjob.com/portal.php?mod=topic&topicid=21
. n- O" C, }+ P! V! f) b! \" h阿凡提招聘http://job.aftjob.com/job
$ G) d8 F8 g* R2 S# {阿凡提热门关键字http://bbs.aftjob.com/misc.php?mod=tag
' v8 P  f/ P$ P- P. k$ P9 N2 n) h" N阿凡提内容搜索http://www.aftjob.com/search.php?mod=forum& \* T5 E/ _! Q1 |# D
阿凡提职位搜索( D+ v$ h% t- L' }% }
——
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2026-4-12 17:40

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表