工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 806|回复: 0

[面筋] 2009爱立信面试题

[复制链接]
发表于 2011-10-19 18:17 | 显示全部楼层 |阅读模式
2009爱立信面试题
& T! s1 A2 I( e6 B: U* e  L3 v' Z' _7 g7 k) D: ~; i
Zz: i0 y3 t2 S* Y- N3 @/ r8 Z/ X! I5 B

* a) @- ^4 s1 y; i# Z) r4 R(1)下面程序运行结果是什么:
/ h* H' g2 Y- Z8 A5 V' A#include "stdio.h") U& c' ]- _  B2 \3 u
class test* E: _; q4 \' i5 Z5 r$ p
{
' x/ r% d5 q9 f6 m& {2 `$ U% V3 gpublic:, {3 Q2 m- L" \3 e  I2 t
test(){}
6 p( _# v; \; `- F2 ovoid hello(){ printf("hello\n");}
. E* u" W( }3 U};
! a. p3 V, @' `! i& zvoid main()
4 }: b7 K* F: C: J$ R{! ~8 t# @9 J( L. c+ _4 e
    test* p=new test();/ b% X+ R$ I, j# T& b
    p=NULL;; v( u! f( m2 e$ c
    p->hello();
5 P, O+ L( G3 ~) S}
. J1 m2 ]! u  r) {2 p' Y# Z事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:  c# z6 g" u2 \0 M
#include "stdio.h"
. v1 h# z" r, |) l- B- t4 gclass test
9 e# ^5 T" L: c2 B{; y# e# |+ Q* @( s4 C
private:0 v# _: X3 \% q" K% S5 ~
int i;! a1 Q5 z2 s8 C, e7 n) h8 }6 Q* S
public:5 h3 W2 p: w) p- I5 C, m/ z
test(){i=1;}
/ j, O5 `  h! v" R9 M( H  ivoid hello(){printf("%d\n",i);}& a! G/ B2 u. P3 \: o
};+ w8 x! A! c" J( T4 i( f, ~, ?8 C- d
void main()( i; z' |3 M2 B0 m) W/ P3 f0 r
{
+ w4 S" c/ f! i& s    test* p=new test();
1 G5 |2 g. @7 Z/ \1 pp=NULL;1 N8 w# Z% L) W1 ^7 ~9 [
p->hello();
+ {7 U' j. g# M' U8 t}
9 S! G+ o" y) U) R% k8 T! |如果将p=NULL注释掉就无误,就会输出1.* h( M3 }' s9 n
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
+ ^; ~: v' _7 G# w(1)C++的构造以及析构顺序
& S9 b1 l5 u7 X6 A#include <iostream>2 k8 \! z: S* p* `- q/ ^
using namespace std;# A# ?+ y2 l* c5 @7 a. N6 X
class A
9 a5 y' D! q$ n1 e/ ?{
7 |" E3 G' ^0 e7 O9 Tpublic:3 S! z$ P/ |1 ]& K! j( Z- V
A(){cout<<"A"<<endl;}
; J! h5 ^% Q+ b3 n5 g. c% ^1 }; h8 ~~A(){cout<<"~A"<<endl;}
6 n' f; o8 q7 i- I& K};
  v8 A4 r7 P4 M$ \( v6 d2 I% |& Kclass B : public A, u5 [3 W% D6 m
{
% P0 [) v7 {0 l# V/ _/ g. b( Epublic:
  j0 q! h" x2 y6 ~- vB(){cout<<"B"<<endl;}( N' r+ @5 d; P" W
virtual ~B(){cout<<"~B"<<endl;}4 i" S: N4 a" c  Q
};6 T, p9 y4 t3 N' k+ f' n4 i4 g" n
class C : public B
# t: |1 l$ S1 q{
; a6 t; C2 i- {6 x: `public:! ?, d5 h, k+ q$ ~% f( v
C(){cout<<"C"<<endl;}
4 i) `- Y' U7 H' a3 E~C(){cout<<"~C"<<endl;}
- t0 A/ ]( H8 r& |5 C  t};' S  m1 O& V; p, b

( h8 d$ o' k; E# U, ovoid main()* Z+ W& l+ S; c; A: {1 \) g
{; [5 m5 l5 y1 [7 W
* y+ ?4 v" \% J  ]8 I5 M/ [; q8 y, Y
A *a=new A();9 p9 G* K$ r& U- V7 g4 A( C9 _
B *b=new B();
" I( u, ]. w4 m1 D! G) |  C *c=new C();) U: G- u8 x$ Y- E* Y
A *d=new B();* J+ M5 t3 e& m( q' \( s# V
A *e=new C();
" b4 t& p( W* S: W3 w6 IB *f=new C();
: T( z; O- G3 U( A# p5 G
$ p0 {* z" c: B5 H7 \delete a; cout<<"---------------\n";! O& T( E7 F  g: P+ `9 K
delete b;   cout<<"---------------\n";
5 f# s. S& \3 O! g: Zdelete c;   cout<<"---------------\n";" K0 D6 Q6 X# J5 w8 Q2 D
delete d;   cout<<"---------------\n";
# k+ K3 o2 e4 r0 x3 M- Udelete e;   cout<<"---------------\n";2 D$ }. s/ p# o5 |
delete f;   cout<<"---------------\n";( x" e" k! t6 [
}
% L# p  d9 N- J, E% s* Y1 m这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
# ?- X$ q! {) v8 Y5 Y$ L这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。$ `& }) B1 _! i/ b; h, X
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
1 F+ v1 I. Q) i* ^( {4 M1 C+ {(2)面试的诡异题目
5 H. N* ~. j- v" i& _, k大意就是如果你 test *p=new test[20];
3 n6 S0 Y, p& z8 b! S+ M然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
  x2 U+ T. b- p+ z答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
  j3 W& a  q/ F! e! e1 x9 E3 N/ R2 U. N
Zz
7 C) }' R4 f$ i  ~$ @/ |( ?爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html3 }8 N- P' }0 g
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
) |7 c+ `& U+ e8 s——
6 z% U6 ]9 e; _查看名企2012校园招聘最新进度,请关注阿凡提求职公共日历:http://www.aftjob.com/home.php?mod=space&do=calendar
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2024-5-17 07:08

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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