找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 977|回复: 0

[面筋] 2009爱立信面试题

[复制链接]
发表于 2011-10-19 18:17 | 显示全部楼层 |阅读模式
2009爱立信面试题
; a7 `# M: c2 c8 K8 p1 y5 M, l
3 Z7 \7 r0 r. d2 o( {Zz2 @( c" m$ |3 ~; }/ ^
7 @( K# A! V, A! B0 X. r) A1 _
(1)下面程序运行结果是什么:% @1 ^7 G3 U) B
#include "stdio.h"
. p1 H+ M- z7 pclass test6 [. k2 |& I) \
{
  ]+ R1 l* b( T8 hpublic:; v  I: \+ h8 d$ R
test(){}
9 u+ Y  J' B3 ^' R: |. Lvoid hello(){ printf("hello\n");}8 @* @- ]9 O# Q+ c
};
6 D# _( f6 Y1 N& e. n6 L9 Hvoid main()1 p' w/ t2 D. u8 K
{& F" w  F0 d& X/ v  B3 U
    test* p=new test();
+ @' y# y; Y3 H    p=NULL;
, S% Q7 g, k7 l* s: M1 _* T    p->hello();* U. Z% F  l8 a. S- F3 T
}
1 i- J, s' |" J( T9 \事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:/ ^$ m" w7 z3 ?0 |* W2 |$ W: U+ r) P
#include "stdio.h": N3 r! J& h# b
class test
$ M! ]$ q6 p$ t  j/ k; X% U{
. \7 ?+ Q1 o2 u$ t' sprivate:
; q: E: s/ Z7 R3 g! uint i;7 t: N9 i! I' R/ j) v- T
public:1 k# H$ B9 K: R3 V, L! E# @3 U
test(){i=1;}
  w. Z) K  s5 L1 h0 \  x% S* kvoid hello(){printf("%d\n",i);}0 C& y) s- M% [, N- Y0 ^
};% O$ f; ~5 T6 f+ L5 n
void main()/ R! s8 s  l  b* I- k
{
: x5 P1 T& y  R    test* p=new test();
8 a& K2 Z: n; v7 {1 `1 Tp=NULL;
% g; D6 x5 v. Pp->hello();
% d& R5 y: u2 q0 J. u}
+ g* N  V1 k1 e9 c* K, t: K如果将p=NULL注释掉就无误,就会输出1.
6 b# s0 g! w) U: @. ?注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。" R2 T  C- @: e, n' h
(1)C++的构造以及析构顺序
, P4 H# k$ I* P1 I& G8 I8 f6 d  C. I#include <iostream>. a; K6 g- C2 i
using namespace std;
- N" N8 t1 d/ F4 p6 c  z2 I2 tclass A( v1 f$ Z5 v8 f( j/ @
{
/ I& p% Q" S: t  upublic:4 p( }  D2 q+ X6 G
A(){cout<<"A"<<endl;}
5 j: m8 Q  A, C: A) X2 O) Y  p~A(){cout<<"~A"<<endl;}
, W# e) i. r- I& D' \};
- a  X, s0 D5 y0 h, U) H, n/ Gclass B : public A
5 _- ~  [6 O8 t. W; z, y{
1 G5 l4 j, b0 a0 m! n/ N9 F5 E: Hpublic:
8 \9 Q* F2 p' WB(){cout<<"B"<<endl;}# G3 f; v5 S8 M+ \. m" F0 h3 v
virtual ~B(){cout<<"~B"<<endl;}
, \8 T0 M4 c4 q# g8 y- Q' W  N};
7 I0 l7 S- h3 c$ |& Eclass C : public B7 R& C$ P0 F- f; V
{
% H$ n: c4 @1 p, d* C3 _- bpublic:0 Z" W/ V" v/ k
C(){cout<<"C"<<endl;}" A6 y. x% h/ [( n( B# c
~C(){cout<<"~C"<<endl;}
" h4 c" Y' R! C7 [4 u- I/ m};# y) Q: r, Q+ N9 h
( }" O' h' O, f) `9 l6 J/ W
void main(); Q7 j  [& h7 r1 O* ^9 l
{! T- e* t0 I8 b" a2 N

+ r& c1 _7 \5 t! d& p2 ^- XA *a=new A();3 k2 N+ r8 m6 |6 I  M' O  u; E
B *b=new B();
7 C+ W) A( G8 }/ @9 x, |  C *c=new C();
' k) @3 k1 d4 KA *d=new B();+ R" T, Q7 `8 \
A *e=new C();5 e& S3 P, m0 V: x* J- M& N0 [; E
B *f=new C();) [& W* A/ _4 ~; I# d! o# o; r' o

- R: t. e6 e$ C3 A! zdelete a; cout<<"---------------\n";% R9 ]# T  c7 k6 _- y
delete b;   cout<<"---------------\n";- S; x# K/ r2 U1 e& ^3 }* L4 w
delete c;   cout<<"---------------\n";  D' n2 M/ s5 x
delete d;   cout<<"---------------\n";" s0 f! ]/ B# T" d
delete e;   cout<<"---------------\n";! ^1 G0 |# T/ Q& D
delete f;   cout<<"---------------\n";
  q4 Z. {4 K9 c7 T2 d}) z9 d1 o9 {8 y- u; S3 y
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。; B9 Z$ m! P: @0 ?2 X% n8 C4 A
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。$ J* ?# f: e0 U3 f2 `% I' M! r7 Q
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)+ e+ N$ l6 V: b* Z- f
(2)面试的诡异题目# `! n+ z* e! l! c5 h0 E
大意就是如果你 test *p=new test[20];
1 l. B' {7 ?( d) Z$ J; Z: c然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)& ~  @+ ]- f4 v% F- _8 `: P
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
7 B( u+ N/ g$ J) f
7 }: D, i. P8 sZz% C! j% D9 e' b1 X
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
6 m; S+ W( ~. U1 a$ T$ _5 I6 h& m爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html4 S  ]. F/ ?, ~; a0 p/ Z' B% t
——
; D8 }9 H" e: u: }3 Q查看名企2012校园招聘最新进度,请关注阿凡提求职公共日历:http://www.aftjob.com/home.php?mod=space&do=calendar
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2026-4-2 23:26

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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