|
|
2009爱立信面试题9 r$ y3 D8 F3 U& G2 k |
' e/ g+ C1 G# e6 V, VZz" C: ? Q6 b5 F0 e
9 B3 u. U# K+ }: Q5 S4 m
(1)下面程序运行结果是什么:) S+ u6 |' f& f% Q% | _& B
#include "stdio.h"' D# e) e7 t+ D# x3 ?
class test
3 W; b, h0 w& u{5 \5 O8 Z9 v( G7 y0 m% E ^! Z
public:. M' F( q5 K$ r( @5 A& W! l
test(){}% S- x, b$ n" F: q, l; T7 E
void hello(){ printf("hello\n");}$ z) p( w) j% c, B: [0 V% o
};1 H. J0 Y( } d# [# a
void main()
5 I$ e: R7 Z! j{
- Q! r+ b( ~+ U3 a test* p=new test();
2 H5 V0 P8 |5 ` p=NULL;
7 v& t0 F0 u8 R$ M3 L0 _+ F p->hello();
. ~0 X& ]$ L3 D( O}# n0 |6 B6 T! D& | { `
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
8 V+ x8 A2 A( g; b#include "stdio.h"
" _9 L' ^/ ^2 S* M; M, C7 V% bclass test
5 z" ] f( X n/ Y; o{2 g" ~1 ?1 n- C; H% W
private:
& H, l5 t. ]! Kint i;
) x2 q( w3 s. \2 \# K, Dpublic:- k& J. v/ {3 ~( ]' ?8 {" J" j
test(){i=1;}
* m/ l6 \. C8 U! I2 `9 U5 Fvoid hello(){printf("%d\n",i);}! j. m5 g, f7 b& s6 g
};
' k6 q: t0 j) C z J6 Evoid main()
+ w! b! W6 V; I{9 Z+ o$ p6 ~ t+ l1 I) _
test* p=new test();& G9 u! h S; H
p=NULL;! a# y- }- {) f: e1 v% R# Q
p->hello();6 i# J* c6 L( G/ K
}
7 Q' A1 j8 G! e; S X如果将p=NULL注释掉就无误,就会输出1.
8 ]3 k6 \8 k# M8 X/ D注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。; C4 h& N+ X5 k( Z. R
(1)C++的构造以及析构顺序) n% `& h, l0 V/ G6 Y
#include <iostream>
/ ]9 M0 f! b* [* Ausing namespace std;9 z) N* R# G9 j1 d4 L3 H
class A
& T1 p6 h) a) N{1 g' @, {( ^( f: t0 m
public:* @- a1 Y/ ]( @
A(){cout<<"A"<<endl;}
+ J% @" X. d4 P& M) K4 e( X~A(){cout<<"~A"<<endl;}# V$ l$ J% h4 w# F
};* X4 O, ^3 p' U* E# q, [/ h
class B : public A
9 }/ ~' w$ M3 G1 \( `$ I9 N- L3 @/ n' N{
+ H0 l6 b4 j, @public:
9 Z! g" @( Y4 I& pB(){cout<<"B"<<endl;}: v' B! N& [6 ^. y) `' d) ]
virtual ~B(){cout<<"~B"<<endl;}' B6 j% o7 ?/ H c: z
};' M+ p- z/ g! k
class C : public B( R# w- U+ D" x* C
{' G' J* u+ r: X8 v
public:3 R0 }3 Z9 n4 R3 }
C(){cout<<"C"<<endl;}/ F2 t; e: N) g2 _+ c+ `
~C(){cout<<"~C"<<endl;}
+ q2 t- h) h4 h; m& j9 X};
& f' i l! k6 R! {) c: S# s1 s* q! Y( p% m/ Y2 `0 A& j
void main(). i0 }: ^, ?7 T% O; A0 \* |% N+ G' z
{
2 A& J" P+ e4 ?$ Y' @+ r, S' ~" ~. ^( a3 O1 A
A *a=new A();
/ U' I% ?, D. {4 PB *b=new B();+ @/ e- s$ m1 s. }# D
C *c=new C();& I2 `( G9 o" _9 a3 F! U7 L% r
A *d=new B();
* r8 L- i+ e& M2 ZA *e=new C();
8 R$ _3 F# ~ TB *f=new C();
& w5 z+ s {( ?! t
! Z2 A: b/ V* v Hdelete a; cout<<"---------------\n";% K/ K/ e4 o# L6 B M# E
delete b; cout<<"---------------\n";
$ k2 j0 G6 K _: Z% s4 Mdelete c; cout<<"---------------\n";
; A( l m6 [! w- R9 v& F" Hdelete d; cout<<"---------------\n";4 s4 B9 B+ J0 t0 r* v
delete e; cout<<"---------------\n";
% \& T8 C# e) F) Cdelete f; cout<<"---------------\n";' B/ p- U( m8 |& l# n- V
}8 j4 `: O7 H3 V4 k: ~6 \
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
! c! c$ _7 ^: a. b9 [& g这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
9 d$ G! Q3 P, n" q5 E% H9 \7 H其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
7 x) n7 m5 M; Q" R/ `(2)面试的诡异题目
. A% ?0 |- i! N& s9 J大意就是如果你 test *p=new test[20];
5 q- b4 B) u% x I+ G然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
% S- w" C* l1 J答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……# t6 z% \: n6 w- l! M
; r% Z. X$ }+ h" |+ `2 P# vZz: Q5 O5 I0 f W5 Z1 S
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html/ |! x4 a. v) Z% W3 ?6 d
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html
1 K' z0 E9 i- T( i, l3 e& a爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
7 C# ] I. U6 \7 M' C$ D——
$ N4 Y; L4 b g ^( u百度2011年实习招聘专题
! N" q. u! J5 ?% J( Yhttp://www.aftjob.com/portal.php?mod=topic&topicid=22
! G# l4 u' W! R, O; i5 E, X爱立信2011年实习招聘专题3 w1 j+ k, b" n _5 R" u" P/ }* X; |
http://www.aftjob.com/portal.php?mod=topic&topicid=23) e. L' H2 f- r% f; [
新浪微博2011年实习生招聘) S" y: o/ h* z
http://www.aftjob.com/portal.php?mod=topic&topicid=21
9 a. ^+ b6 P; k- U! j$ b+ I: N2 x# {阿凡提招聘:http://job.aftjob.com/job
$ ^5 Q8 z& O( P, a( m. O2 n* B阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
# D+ g! V- g" T# A1 K: r阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum3 [* ]( E0 m5 H. b6 H
阿凡提职位搜索:5 W* o% x6 P; h4 v D; F
—— |
|