找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 1037|回复: 0

[面筋] 2009爱立信面试题

[复制链接]
发表于 2011-10-19 18:17 | 显示全部楼层 |阅读模式
2009爱立信面试题3 ?" y0 K% \1 n) a
  T0 R# j) ~+ T
Zz
+ S4 e' t. V6 P
6 n1 ]  y" Y& F2 D(1)下面程序运行结果是什么:1 e  T2 H$ W) t, R+ ]# i* z
#include "stdio.h"$ Z+ B9 m! V0 N: z
class test
8 q9 q5 |; I/ U- f' j; `$ N{0 K: h. j& v0 y9 e# O
public:$ s+ ^/ _; X5 G6 t. u- D
test(){}4 a- r$ J( s  [+ W7 Z9 V
void hello(){ printf("hello\n");}/ q5 U/ [. j; M6 \
};
6 s2 a/ M4 T3 T6 k; j8 Tvoid main()  \1 v5 R% [: l* J% I& x" T
{- \7 C4 ]: b" Y' s$ W, q
    test* p=new test();
0 P# k+ o2 h) T( I- U. V    p=NULL;
2 E% R7 W. b+ M, r    p->hello();
/ {# g2 `+ O# w$ z& e5 V}; B! r  f7 a0 Z, i2 o9 C
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
) D, m) }# s8 _: m( U#include "stdio.h"% A' I$ F+ e! y" R
class test
+ E. S' `4 i) a& Q& D# d{
- j  D* M, `  S3 rprivate:% N! N# U: Y6 o" u& E) ]7 W
int i;
3 P# Q- Z+ W5 hpublic:: M( {) K/ ^! `2 O& g* v  X6 o& F: p' v
test(){i=1;}/ x  M; S+ M! C* E: N5 K5 {
void hello(){printf("%d\n",i);}
, Q2 K7 f9 ?6 C: U};
! M0 k% L" o0 o0 Xvoid main()
- `- g; P) Y) T" j{
3 ]3 J3 k5 v* J, l: g- u; ]    test* p=new test();& u7 K1 `1 \3 M  K8 G: J: t
p=NULL;
6 Y% q, V* j  L4 @( y2 {' Qp->hello();1 B. q' x: Q/ ~+ N
}
; W' A4 a& b9 S如果将p=NULL注释掉就无误,就会输出1.1 I2 G/ T$ X, c
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。0 K0 e7 O+ |/ P" E1 g
(1)C++的构造以及析构顺序
8 _4 T: B3 t; q; M0 `6 B- F#include <iostream>
" V  d) E- C7 q6 v5 P, O8 A: nusing namespace std;
) Z3 I7 r% d! V7 }2 E4 iclass A" F; O+ z% S  i8 a! r! X
{* \# t; V6 x5 I  _
public:
& s' b* k7 r% MA(){cout<<"A"<<endl;}
2 F' i" @( p7 N+ w7 F% p~A(){cout<<"~A"<<endl;}+ N% ?9 E$ h7 \; D; s* z
};
' v6 b) H. J. B4 ]1 Jclass B : public A1 ]3 V( ]) w& X& }9 m& x
{
1 f6 @7 v# U2 b8 _5 e% i( L3 H3 n4 Apublic:9 {3 {/ A% r) D, D: n+ Z
B(){cout<<"B"<<endl;}
$ R0 t4 `9 f; n. P% Xvirtual ~B(){cout<<"~B"<<endl;}; ^' E/ h, S. d, Y, p
};
% h3 }" g. p: t: \class C : public B* u! q7 V& o  v" m
{
3 N, T3 g1 n" t8 y6 K" ^) d; e1 Bpublic:8 H3 h# k8 n' N) A
C(){cout<<"C"<<endl;}
* }5 l+ s9 }* l. L$ l, A~C(){cout<<"~C"<<endl;}; z1 V' ]# U! Q* q
};/ V0 m3 z7 L0 X- X$ H

' a% s- l$ W$ p0 _void main()
0 C- l4 l8 k  L. F{, U$ }! J, ]# t7 j* D1 a
- ?* A9 u! X* |
A *a=new A();
+ p# {+ Z( Q2 d7 g- H) ~9 h- L, G+ mB *b=new B();: J: k) Y3 d# m0 O2 K( v
  C *c=new C();  H0 c! Q0 P7 q* H
A *d=new B();' r! p2 P+ Q" T3 l; U" w* ?+ V. B
A *e=new C();8 B4 Y* b. e3 v& A; O7 x
B *f=new C();
: a  p5 W6 a- l. _( w$ _
3 G3 r$ g+ ~3 W/ G$ {9 ~delete a; cout<<"---------------\n";
) z# r, `* H: w! n3 b9 Qdelete b;   cout<<"---------------\n";1 I' n6 Z% U% ?* W
delete c;   cout<<"---------------\n";
7 [  W1 {5 _4 R6 d2 Odelete d;   cout<<"---------------\n";
$ L5 K- a9 Q$ hdelete e;   cout<<"---------------\n";
  ^  c/ s; e# K& E: c1 T( z) Ndelete f;   cout<<"---------------\n";+ a* v3 N; `; u* I6 T5 C
}
/ N& T; r/ P# I/ }! |这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
2 p( S; T' r5 i这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。! w3 w- d8 t8 M0 X! ]3 j+ R
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵); T) A/ P3 J8 M" w, C* ^
(2)面试的诡异题目+ a' }& |8 G0 i; T1 @
大意就是如果你 test *p=new test[20];2 d9 @; T* F3 t4 E, _
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
0 I. [; d' U% Z( E3 X答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
4 x* k% z! ]( W' \" |9 V0 H- e; |, n9 B! y8 t
Zz
; R- k5 ~) \7 s' h. Z2 A0 d爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
2 w% P. N. y% X  n" u! b+ i; S  v) F爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html4 E& q9 G2 x  m$ E$ [8 K
——# j3 F; m4 q6 d: r6 @
查看名企2012校园招聘最新进度,请关注阿凡提求职公共日历:http://www.aftjob.com/home.php?mod=space&do=calendar
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2026-11-12 07:48

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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