找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 1018|回复: 0

[面筋] 2009爱立信面试题

[复制链接]
发表于 2011-10-19 18:17 | 显示全部楼层 |阅读模式
2009爱立信面试题, [% O+ U& i4 g) n2 q6 _& b

) i4 C0 z: c/ O/ y, D, z: fZz
" p7 L1 F$ {+ z. {$ d) E+ D6 E
% C$ p; g* N$ h5 v& F(1)下面程序运行结果是什么:
; h/ K) I8 U9 c- l#include "stdio.h"8 C" \3 R' m* R5 O4 {2 f
class test. f& {8 g5 v4 L& c3 ?% h  o5 }
{
! Q2 _9 f, X" ~" l/ \) R' ?5 upublic:
, }: n/ z3 [# D. ltest(){}7 g, }, c! Q5 H2 Q; C
void hello(){ printf("hello\n");}
0 |& }( F3 c; d# I; _};
6 v- Y2 I5 z! ]2 bvoid main()
& ~9 D' _2 F/ v: j+ R{
5 L* q4 o/ B5 b' q( _' j    test* p=new test();
9 q8 }) U% |% X+ V  P3 r- n( x( e    p=NULL;* r1 o% P; Y& p" G9 x* g/ c( A
    p->hello();
% {. u9 N) o+ B, i! P}' ~) Y' @9 h5 B9 m1 y# Z: I# O) N
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:) g4 @& A" b: P% |7 j7 ?% J" {
#include "stdio.h"; ~0 H( f" n6 C6 I, O9 v3 R3 O: b3 ~
class test+ n8 g  |# g6 Y. r2 M( [# O
{8 C: j3 R7 {- l9 w% X. x
private:
+ h7 O" P+ k. t" H3 D& P( H- q9 Hint i;
9 |$ R! D3 _1 A: }' I* {& Mpublic:
0 ], n6 [7 h' v( ptest(){i=1;}+ x9 k" ]! V( m1 y) {5 P: _- L
void hello(){printf("%d\n",i);}& I" v7 s* n5 w
};
2 _/ x# W7 g* N3 Q* K2 \void main()- q# g- m7 X! o7 j
{1 w/ t# T& X9 N0 Q; G6 s/ S. P
    test* p=new test();0 s& _+ z( i  A% H8 w
p=NULL;
. [6 `, P( f. r8 P5 @5 bp->hello();
/ L8 _7 u# ?8 G8 W; j}
& G" c; ~# Y! _' f如果将p=NULL注释掉就无误,就会输出1.
4 `- m3 u4 P7 L注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。; k5 E4 @, N: d: n
(1)C++的构造以及析构顺序+ I6 A4 m; `9 i2 P5 d3 A) @1 A
#include <iostream>
! T: ~( e( }9 _using namespace std;: T3 `. C0 J' q7 L; L( f
class A; t& ?0 ~/ u" u) [0 W
{5 @* D: ]6 X; L
public:$ K3 J/ Z+ F4 f5 @! i3 L
A(){cout<<"A"<<endl;}) {9 Y3 c2 |3 l
~A(){cout<<"~A"<<endl;}( R2 q, m+ M9 E/ A3 g9 p; n
};' R3 l* a( a' K  O& V% G
class B : public A, ?4 L. X; P! w- t
{
- y" B% z8 Q! T. w  D+ `$ [+ E0 Apublic:
4 P) J7 G0 I- `9 HB(){cout<<"B"<<endl;}
4 i) ~( b% |8 F: [& avirtual ~B(){cout<<"~B"<<endl;}1 A, e8 `) m1 m) E2 `' k
};
$ l0 R4 i0 z' m# h4 l8 o, ?4 p; Pclass C : public B
$ o+ x, Z+ B) C1 ~9 m{  u5 w  K9 |2 A6 j0 G
public:
; u( p& C2 D  {* [( O2 k% zC(){cout<<"C"<<endl;}
- B7 B. n# ?, ?~C(){cout<<"~C"<<endl;}! ]2 z5 a& N/ r. U6 y
};
3 X( I1 r; W* ]* M- E. b9 H
  G. M" R0 q+ _6 Avoid main()" w/ g- k7 B5 c7 C$ A7 q, ?  Y
{& t% e6 t7 W3 a# P1 O& {3 _4 Q
" \  V! g, g' M2 Y7 Y
A *a=new A();
: q& M7 x; \/ o' @/ Q9 Y4 ]  DB *b=new B();
% ~3 M  H5 C7 p4 m  C *c=new C();
4 l. e; J8 e) s; [) ?' T3 nA *d=new B();
6 G4 u" d: G9 N! nA *e=new C();
6 O% c3 G8 `( t! ~: r. |B *f=new C();
* a0 k1 N  x! w. a5 R2 D3 B* P. S3 I4 _0 }3 w4 J7 i7 ]
delete a; cout<<"---------------\n";3 m; [. a; K# @7 s
delete b;   cout<<"---------------\n";( N# l3 |+ o9 }) b9 V4 r6 r; y
delete c;   cout<<"---------------\n";
7 _2 b  d) B2 x6 |7 ^; \! f6 edelete d;   cout<<"---------------\n";
, n: _0 D5 w1 p) n3 F# \/ ^delete e;   cout<<"---------------\n";
) B2 Q; s. K. R, q, z1 ]: v% y9 Ydelete f;   cout<<"---------------\n";
3 D4 H0 a6 b0 x+ c4 T}
, ?) F. M; M7 ^& k( S1 @这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
5 V1 f6 K! N8 u) l1 J2 \7 E这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
# l1 f" R+ |$ q" D2 v, u其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)! J% `9 Z4 k  A9 ^& W. O. s6 x
(2)面试的诡异题目
+ f: ^# Z2 X7 _大意就是如果你 test *p=new test[20];  x7 q" P! r. ^. d
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)1 T8 [; G# x, u
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
  i0 Y. M6 m3 [4 d/ d: J
, H2 ]8 v8 h) ^# TZz
# K4 P! v* Q: f' s$ ~  w爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
0 \; W2 [! O) k, J" P2 \爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
) k2 s$ F2 h! T——
. C5 T- J8 h+ }$ ?" J1 a" P6 K查看名企2012校园招聘最新进度,请关注阿凡提求职公共日历:http://www.aftjob.com/home.php?mod=space&do=calendar
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2026-9-22 17:59

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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