找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 989|回复: 0

[面筋] 2009爱立信面试题

[复制链接]
发表于 2011-10-19 18:17 | 显示全部楼层 |阅读模式
2009爱立信面试题
" O4 H9 S& p; H: S1 G' \( y$ n2 J: @
Zz
0 J8 g$ Z- |, v
- r4 L0 e; \5 R; w9 j# A(1)下面程序运行结果是什么:
* P+ G7 k# j3 u5 g) e#include "stdio.h"
7 P1 G' h; A1 Qclass test, }8 n+ T/ w$ d- q$ q
{
$ V0 V* K) z3 w4 m1 A+ Lpublic:
' O' f8 E6 e$ x$ @test(){}
9 x; J1 s, ^4 ~: v- n5 x8 uvoid hello(){ printf("hello\n");}
/ d* M1 m: ?$ X0 W};1 E5 c/ l7 t" d
void main()
* e: A1 W2 B% B/ J# q* z{
- d! ]9 D/ O% T    test* p=new test();
' n. w+ q# b* _    p=NULL;* E# W: R" h( v: d7 r* B7 \/ N
    p->hello();
: C* n5 O0 x% ^}
# l3 A# P2 x8 B  q) j) L3 [事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
6 C( X+ }/ K, w/ b3 b. J! e#include "stdio.h": c& ~; v$ q: z9 E  _( t5 j( H
class test
/ z9 V7 y& y2 j; G{
- }7 ]7 J5 X1 Aprivate:
; n2 Q/ @- K+ W% Rint i;/ O6 Q5 @/ R3 r
public:6 w: ^1 O# E' J$ Q% [5 n
test(){i=1;}& F+ I. U3 d9 a# A/ Y0 [4 Y9 N
void hello(){printf("%d\n",i);}3 w6 _, M- S! M7 g& y, |. v
};
9 ]% ?3 M. f5 U* L1 gvoid main()2 b( @- L* U# F; w
{! T. g3 K6 ]5 _8 u8 x4 ^
    test* p=new test();
5 B: d- k% L, r7 jp=NULL;
4 L. y2 q  j5 O; v1 w, Bp->hello();" ]7 j. V* ]5 b3 Y8 [
}
# J: |4 R- A( x7 O% \如果将p=NULL注释掉就无误,就会输出1.  t7 W/ K8 w7 ]  I7 o% H
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。& u7 F, a2 e: Z8 }
(1)C++的构造以及析构顺序
1 Z( P' V. O, B& n#include <iostream>, |! i9 r( M0 e; a0 i8 z
using namespace std;5 t" u! w& G5 V6 s
class A- P' G+ \2 A* c5 E$ `
{) O% P. D# l' U- a7 l
public:8 Z# ^5 H+ v8 Z5 h# ?
A(){cout<<"A"<<endl;}2 p: i6 x: l2 b" |
~A(){cout<<"~A"<<endl;}
9 M6 _$ ?: {/ _7 J; A4 c};
$ d7 c5 q2 @) A) M9 P" ~( _( hclass B : public A) f. d& U. \0 R6 q! n
{6 e' W( o/ H& N3 P. c' c+ f7 S5 A
public:
- Q; b* r* S7 `' L  I6 lB(){cout<<"B"<<endl;}
" v& a- I9 J! ?# C# avirtual ~B(){cout<<"~B"<<endl;}; `9 O, |+ ~3 _0 T& k- q' M; P
};3 N! x  \5 \* o/ F( H$ R4 a
class C : public B2 \6 t7 c! Z- P& c# L
{; O, v8 U* x4 |1 j
public:
) h" ?- S! Y/ `: QC(){cout<<"C"<<endl;}
4 q1 E4 X, Q  z: B9 c  j# m% @~C(){cout<<"~C"<<endl;}
9 t- w- g. q( T$ d! s9 T* l: @/ j- ?};
# S. T" E3 c7 L/ m3 M1 v; R! c2 A
void main()3 a. `+ \+ C$ ^
{
: T" W9 t8 W7 o. y+ x" @
- `7 P2 M- V: R) GA *a=new A();
, J9 a! l- @. e7 O0 N1 VB *b=new B();  b% u( y9 R5 B( h; u. t3 y
  C *c=new C();% D* Y5 n. r" _' v0 L8 V. {" B
A *d=new B();* b, i6 b" E9 Z" d* ^
A *e=new C();. |+ R) S" z/ x5 H1 K; `
B *f=new C();
% g  S9 I" [4 X" u7 F3 j2 x& O3 `6 m( }
delete a; cout<<"---------------\n";
  L; d! w3 S" [2 tdelete b;   cout<<"---------------\n";
  N+ K0 W! W+ T. Q4 cdelete c;   cout<<"---------------\n";
: [: I- N% J* w6 n$ g3 p# |  C6 edelete d;   cout<<"---------------\n";
% j0 P8 R2 A8 ?2 D! [- Qdelete e;   cout<<"---------------\n";: u* G. j! S5 Z1 a8 z6 a
delete f;   cout<<"---------------\n";
! I( `( U& x7 l% W0 o8 W}* N9 a' G5 W4 m+ s' \3 `
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。, @2 g( }) ]" d& a% h% r! S
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
2 y, t' m# o- W8 `- g0 l  ~1 m% a$ x其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
! b2 t! ^1 W4 m6 y" g3 U$ x(2)面试的诡异题目4 i3 ?; A- g6 S/ ~9 T
大意就是如果你 test *p=new test[20];
1 O8 ^9 n+ Y* T- v( @$ O  k然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)) ^, o6 e" Y3 S: j6 j1 ]2 G
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
+ e" n. N* A# e5 V- \
; u6 E: j, |" M+ d0 \( i; D: nZz( Y' [# N! B. y  ]
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
0 x0 Q" X- L/ t* C爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
& F8 d1 f# q# ^+ F: v——
3 ~3 e5 ]" n$ p' v* U6 T0 q查看名企2012校园招聘最新进度,请关注阿凡提求职公共日历:http://www.aftjob.com/home.php?mod=space&do=calendar
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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