找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 990|回复: 0

[面筋] 2009爱立信面试题

[复制链接]
发表于 2011-10-19 18:17 | 显示全部楼层 |阅读模式
2009爱立信面试题
: E! v* o# P5 E$ W
" B* I1 f5 Z. P) T7 n' i, |( xZz: [8 I# R1 P" f3 W

$ ~& e7 Q; \, B0 l(1)下面程序运行结果是什么:
! A0 M/ b5 {$ d& f. ]/ z  [) c& t#include "stdio.h"# L' t( }' ~, \) {  u
class test
, i) Z* d5 G. E$ D9 m" W{
( s* }& D: k5 Lpublic:$ j; o. Q$ r- H3 P, \* Q
test(){}* V0 r' s, P4 j$ v
void hello(){ printf("hello\n");}
+ m- b5 K1 e6 W4 y2 l7 G};
( D! I7 L% K0 C0 `  Evoid main()
7 R' _+ V; v% E{  Q3 ]" Z& ]0 N) N. T# q
    test* p=new test();0 R5 I2 a: a4 t( Z: R- x! a, u
    p=NULL;1 r' ]* s: T- ~* r, R& V. h
    p->hello();+ S' Y& S# s. k+ C/ E& }
}
! i5 H7 w+ T6 g- S8 y! a) N# Y, D事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
9 _8 g5 \% ^% R4 W& t) f#include "stdio.h"
; V; t; h9 e; y! h. ]; Xclass test. B5 Q0 {2 `, l/ s
{+ c- g% c0 X7 B% A" P0 `
private:/ l# \! G6 {  J+ i* X
int i;9 O  B, q) u& S# V0 }; J
public:
+ p9 b; l4 k& \1 @3 ktest(){i=1;}& M  C& ?: b5 u; n
void hello(){printf("%d\n",i);}  ^. i  P$ w& i+ y9 }- q9 P' E
};
9 d- G  m7 o' r* y5 l! Svoid main()
; u6 f4 b7 M/ q+ m5 e{5 v& g! ?* a# P8 ]+ c) c1 a5 v
    test* p=new test();
) |- |  a# h- P- ~( \/ ip=NULL;0 s) |. R; n& D7 \! \1 b
p->hello();
  Y; s- _4 O' M}0 L& U+ @) e! V( l
如果将p=NULL注释掉就无误,就会输出1.: Y9 e4 j( i% Q( R  N
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。. X9 _+ U/ R9 n# u. z
(1)C++的构造以及析构顺序
; L  A- ~0 B. I8 K1 H8 s#include <iostream>/ F7 k' G) h3 g  ?# k! Z
using namespace std;
+ y/ g0 m% T3 x! ~( e6 U/ H2 hclass A5 f/ o0 Z5 t# c
{
" r. j, |1 d2 o9 u6 U/ c+ [. fpublic:+ |4 ^) O3 }: N6 x7 H: e
A(){cout<<"A"<<endl;}9 H( `$ P& J7 Y9 j
~A(){cout<<"~A"<<endl;}3 E4 ]2 m# _. h
};6 W. e  |8 m! j
class B : public A! ~% E" m: @! }! K6 _$ R
{
/ N/ j' t# k  ]8 t# _public:+ K: q2 p0 B- ^! C0 ~0 J
B(){cout<<"B"<<endl;}" p5 }# B9 n# {# U; n0 }0 X% S
virtual ~B(){cout<<"~B"<<endl;}
, g0 }5 q0 G% q( u- K" P};, r- r/ {& y' G
class C : public B( R" P* ]; i, U/ b2 m
{1 k" A9 \8 n6 v# |
public:
9 O: m1 l" ?6 }. GC(){cout<<"C"<<endl;}
# i; e6 P$ X( X; p~C(){cout<<"~C"<<endl;}* t8 N& f. P* _6 i
};9 S+ k; H+ D8 ^9 r9 G4 R; K3 i

$ N: H6 ]; O6 ]( M% L) Tvoid main()
% ]" S7 U0 G: }3 [; g; z: w5 j{
! n  F, y' r: Y/ P9 S% `( @9 p" D
- E, o; T( V0 k0 o4 O; S& uA *a=new A();' c$ f+ ?% x8 [
B *b=new B();
* X7 k+ I5 ^, n6 {! {" ]  C *c=new C();
+ x1 {% a4 y. X8 x& w7 q# WA *d=new B();& y* u& e# `/ L4 S4 J9 q  T
A *e=new C();$ M: j# ^9 }) L+ l4 h5 e
B *f=new C();. [9 t6 Q4 p- g5 n/ k
6 b) u$ ?( @. V2 P' v
delete a; cout<<"---------------\n";
& p" @1 ]! c! _7 edelete b;   cout<<"---------------\n";
2 R* J4 @8 ^, ~: f# @0 z5 Adelete c;   cout<<"---------------\n";
* C5 e) B/ D: K- ^delete d;   cout<<"---------------\n";* W/ K2 Q2 m7 A/ |/ s8 u' [
delete e;   cout<<"---------------\n";
( m0 x% p* X0 ~2 j: |: e* X: Xdelete f;   cout<<"---------------\n";) \% H4 Q& Y+ t/ }9 S
}  U2 N: a  t# X/ ]0 d: x
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
2 v5 Y' w4 _* E0 [* X" j这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
. B, c% E' I' ^5 @1 T( O其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
( n9 r( {/ f! g2 X- i' l, m% r- D(2)面试的诡异题目; j+ M0 Y' d7 @1 N5 S. s; x- m
大意就是如果你 test *p=new test[20];
9 ]7 c( k0 ?* O6 H: Z$ U3 B然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)* q; x1 u+ f6 X
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……$ b7 ~( y$ f# X$ e; [4 C/ C
& m8 H5 D& L+ t( w1 |
Zz
# Y0 X/ a5 [5 e# J# b4 A爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
/ Z3 e. n3 g  F- X$ r, T爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
' O& r& T& l* p4 @; ~: Y1 t——" Y/ q9 `! ~3 J* ^
查看名企2012校园招聘最新进度,请关注阿凡提求职公共日历:http://www.aftjob.com/home.php?mod=space&do=calendar
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2026-6-10 17:17

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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