|
|
2009爱立信面试题
% J+ D& M' Y& C; q# F$ v D* q [
Zz
) H. N' a, I3 [8 K3 t9 z" E+ x; H
(1)下面程序运行结果是什么:8 x) y, c9 t% b) h1 m8 o/ I" g+ p
#include "stdio.h"
1 T) O- O* o) T2 w* h4 t* jclass test, W1 w6 i% ^% E F/ c2 V" `
{
! J0 q7 Y! }' A9 u! Bpublic:. z1 Q" i$ @ h; D6 B4 [
test(){}
3 H# J& O; T9 ^4 \2 `1 avoid hello(){ printf("hello\n");}
1 b; V' k0 h, ~# r! W: d' M5 q};% X0 z/ t2 @$ e+ X% k$ u
void main()
2 P, f6 Z, K! _. c7 r; u{
1 H7 Z, _: z3 h/ I* n! j* x test* p=new test();
; Y/ @( u% u' s: H# Q2 T p=NULL;
F2 r& L# [+ u% C3 K$ p p->hello();# M( [' d# ?: `: E1 t2 k: v, j
}$ |4 ~# o% j- K2 S- j: n
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
4 q' O. F& b7 f- u+ c) L! M#include "stdio.h". V, Q) b: | O( O& ` t* X+ v
class test! j" b: \$ N& ]5 R4 l
{
j8 ^7 |; f) v8 @9 dprivate:
/ m; i; {8 l7 p; R9 z- j7 {1 P* w( Oint i;
& m6 _% {4 Y& A+ e0 O8 R t, e, jpublic:
. P `$ a5 p% I6 h* Qtest(){i=1;}* m6 X9 I9 A7 y0 ]
void hello(){printf("%d\n",i);}6 i3 l1 O f# Q8 O. L- a7 B q+ o
};
3 l) R3 C) o# `void main()
/ @: E8 O, C7 @6 P/ N2 T{8 k3 k# F% \/ ^9 s6 S5 \. a
test* p=new test();
& d2 n% A/ P, L& W* R1 b6 Zp=NULL;7 w* }7 k- Q6 n1 R" `
p->hello();; v, {3 L/ B- q( e2 W" [
}
3 _. G/ O1 `8 ] _3 L {2 F: ^如果将p=NULL注释掉就无误,就会输出1.
6 _0 l( P% P! d注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。2 `' E' d1 H/ `" j, I+ r# B& W
(1)C++的构造以及析构顺序
8 I* V* H) i$ _1 k* M) W( {/ R( j#include <iostream>
. I; Y' D# A. f% d1 M) H- Pusing namespace std;
% ]0 @' c! o" q x lclass A
# B. |; F; [( n6 \0 |7 @{+ ]5 K4 Z6 ]3 p) c
public:. y2 r) V8 e/ p& \% C
A(){cout<<"A"<<endl;}
. G5 ]0 k% l: a/ f) S/ J~A(){cout<<"~A"<<endl;}
' T7 e: W7 \# m! H: Z9 q7 Y! H};! h: ]0 E+ Y) x! s! _; x" o
class B : public A
8 L9 f- U' k( U* e$ M) N# _{
D7 d/ ?5 S4 B' Dpublic:
9 p! ]/ T ]* _) P& KB(){cout<<"B"<<endl;}4 A, d: I- ~# I$ o
virtual ~B(){cout<<"~B"<<endl;}
* y+ t5 s: C4 x: H0 ]! `2 e};% y D# a3 u3 W% s7 a7 U3 s: F
class C : public B4 j/ H& \4 v, |$ `& P) ?5 c4 H
{' H8 U1 D/ M. D8 k& V
public:
( D/ i1 `% i( ~( XC(){cout<<"C"<<endl;}* H0 p N$ v9 K
~C(){cout<<"~C"<<endl;}
' B1 l. L5 F0 J* I! J: t};/ A5 Q5 K7 B4 m
. {/ ], T p- i+ E) V1 r- L9 T8 k) d+ Z
void main()
4 f1 p) r: K/ X3 v{ O$ K5 Z; C0 Q
+ e4 a; z: p, P8 _" V& n* @A *a=new A();. ^! `; ?; F" q. ~& E9 r
B *b=new B();
" G$ K8 @0 R! G% C: V8 u" { C *c=new C();
! Y( b5 l& Z3 r7 j! ], g2 ~A *d=new B();1 t% t6 ?1 P) y9 } J
A *e=new C();
3 C ?9 {4 K$ o" `/ g# yB *f=new C();+ h9 l! p/ Z: B. p9 ^7 R0 D- k1 H
* V8 s6 { q m+ M/ f& wdelete a; cout<<"---------------\n";% g, y$ {4 z' E) o4 i
delete b; cout<<"---------------\n";
* p* k- p9 k$ F9 r) c6 gdelete c; cout<<"---------------\n";
4 D* G; Y- W# y- o2 H# D) ~5 adelete d; cout<<"---------------\n";. m) A( p4 Q1 Q t+ B$ X
delete e; cout<<"---------------\n";4 l, o) F; F' v7 ]
delete f; cout<<"---------------\n";
; G% K5 I- v x7 ~, }9 M: E}4 z: z! d! X O4 B6 }! X
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。2 ^6 Q# d& ^7 |+ u# V* r
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。: Q: Z" T1 B' V1 U8 g: p1 j
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
1 M) W0 {4 B3 o3 d2 c3 L/ V7 Z; a. @(2)面试的诡异题目
/ b1 U; x9 }( l大意就是如果你 test *p=new test[20];- t9 M; h! w! y/ n% F4 {
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)/ k& L0 W6 A8 U
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
7 F t0 x7 i; I' F* M
" i R: v0 |8 |( s1 j0 L {Zz
% I$ e4 @& e* E爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
, Y' b2 Y; T, u9 P7 x0 E" q3 N上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html5 i6 L& p: [" J$ S
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html$ g3 V: f1 R" w! W' j% I
——
. _& O$ e+ G' c' Y百度2011年实习招聘专题
8 a- Z# L* K. x" e; Hhttp://www.aftjob.com/portal.php?mod=topic&topicid=22
5 ^! }, h# x- g* I! q, |8 O% n2 _2 S爱立信2011年实习招聘专题3 }2 \' v8 N, g; R5 I* n: B
http://www.aftjob.com/portal.php?mod=topic&topicid=23
. q" r( _9 n0 x% x# n" K新浪微博2011年实习生招聘5 n, Q; J& N. R$ ^
http://www.aftjob.com/portal.php?mod=topic&topicid=21, e: u# k. s' i/ j
阿凡提招聘:http://job.aftjob.com/job0 X& I! f8 e! D/ X3 v9 H3 R8 J
阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
+ d2 R9 P* x2 e: h _5 J w阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum9 H- }" e" I$ d! ^
阿凡提职位搜索:' |! J1 ?9 ?. a0 t f: a
—— |
|