|
|
2009爱立信面试题
$ l. R! R/ H/ b/ s* r- N M7 ]- e% Y- F
Zz
. ~5 ]1 n! ~. g% u
+ z8 k+ {' I" [; ?. O1 L; E8 r( C(1)下面程序运行结果是什么:% D( B: n: \ q
#include "stdio.h": p- ^! W& N- y, i: C
class test3 y3 U c3 m- t, v- Y7 j% [! r5 @
{
8 P2 J6 I: m+ x. h* w7 k e* Z3 ?public:& g: p( I- ?5 [; a" m
test(){}
" a% u3 a+ A8 q& H) Svoid hello(){ printf("hello\n");}
. W9 F0 N& u! o6 y3 T8 r. G k};
$ z4 o3 l, j2 t' Z# Q. I6 Qvoid main()5 z) o7 \0 E2 j0 H+ ]
{; v* K" m! }9 @$ I" R, h
test* p=new test();0 E2 q* s, M" _
p=NULL;
3 Z2 D; W5 U( e. o0 { p->hello();( i; L( K. K/ \% S" h/ ^
}
0 | m8 Z `# z/ `事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:0 E* Z7 X. _; Q! i* K h& E" ]
#include "stdio.h"
) e" |- v7 t5 _4 C; i" F9 ]class test# p/ p5 j! C9 O0 ~6 Q5 Z
{
* C; s! L, Y5 f) ]$ K3 I2 _private:
9 T: @. K( K5 _! s/ ]; }int i;
7 i0 H* A8 U0 d ypublic:
' H* m; S) V: T! b. r" wtest(){i=1;}
* ^8 C+ |. N/ _( Z6 ]void hello(){printf("%d\n",i);}8 R2 }* O8 N* \/ `7 @
};8 c" w S% K% R* K# f; R! }. J' \
void main(), P8 E/ `. w5 i8 b1 @, L
{- e" M; Q5 x# ?! w, L* i9 c
test* p=new test();+ ^/ H g" [( a: c
p=NULL;
0 h1 l& Q8 `! t5 V9 { Dp->hello();
$ G7 n3 Q5 U4 ?7 U! r/ j3 N- x}
1 Y- X* Q. ?3 N7 |- a如果将p=NULL注释掉就无误,就会输出1.
! d8 L' l7 v; Z注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。, E9 W! _1 Q& Z7 X9 O* c3 A
(1)C++的构造以及析构顺序
o. ~' F2 y9 a r1 O7 `#include <iostream>0 l I x G( K$ V- @
using namespace std;! ?5 D+ v+ L% ?% x
class A
, T! Y5 N2 l8 C7 J; u{9 Q6 b w' J6 N; A' J9 Z3 \
public:7 j `; G0 y& V/ M# m+ ~
A(){cout<<"A"<<endl;}
( Q" z& \) D# A. a~A(){cout<<"~A"<<endl;}! I; Y& j& ]7 W( E- _, b
};
4 ]$ y, q0 ]: P2 @6 vclass B : public A
) T. j9 D4 S5 f' L{
8 Q* B, ?( E. }public:
0 {- S# \! C+ E* x5 Q! j: w- {B(){cout<<"B"<<endl;}: ^. O: [( b/ b+ Z' W% S) R
virtual ~B(){cout<<"~B"<<endl;}5 F5 m6 }! d) W5 B' y' g
};: k* T* e% F$ c/ C0 {& M
class C : public B' F a# I* r( Y! [$ `3 Q2 a: t7 K
{4 u P, P: m, `4 t7 c5 \: z9 ?4 g
public:. [4 T3 K2 x; b, |* L+ b
C(){cout<<"C"<<endl;}
9 b4 |. P% a2 s1 Z9 K~C(){cout<<"~C"<<endl;}
4 p) V" _2 I1 V3 e};- D/ \4 w4 j% p% F" [/ Y( Y
/ v5 P1 }4 b; q1 \: A8 `
void main()4 c& a5 I: N( j7 C
{( p) Z/ M* y, R' {* g0 u3 ]. W
" O9 x2 R( x1 h
A *a=new A();
) ?3 o2 _- H3 @3 m5 o( U0 pB *b=new B();
6 I* }& m4 R) B. f6 B7 N C *c=new C();/ k8 X" C4 ~) [3 j" r: b% q
A *d=new B();2 k) Q4 }' d# [& k! C
A *e=new C();
; W" _6 d& Z% k$ [) qB *f=new C();. c0 L8 y: D8 V7 {" _* Z" {3 T
; {" i. ]+ b+ x2 g9 M; {: ?
delete a; cout<<"---------------\n";1 A# h c% G7 Q0 z' Y# Y
delete b; cout<<"---------------\n";
: o0 \: m" O% u! R/ p0 q& v0 D7 ^& ^delete c; cout<<"---------------\n";8 a3 d' q0 }7 x
delete d; cout<<"---------------\n";
' a; N7 _0 l3 H6 v5 Pdelete e; cout<<"---------------\n";8 H+ g7 q$ u$ y6 @: G4 n2 s
delete f; cout<<"---------------\n";. G' d. g) K0 W+ W
}
; l4 S a8 E0 L* v9 R- U$ T这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
& {; \4 r5 m/ X1 e( l+ S这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
: i7 _3 q ~6 T7 j5 l' m3 p- S! f* O其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
; K! u0 Y. E y5 p9 F, o5 \(2)面试的诡异题目 f j8 v5 q. z# R% r& b6 k( |$ f% L
大意就是如果你 test *p=new test[20];
1 o% {' d v7 t; g" A" O然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
2 X2 i$ D) m% P- Y0 G/ R答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
( D6 y1 v) E% s
" h+ S! F) {$ QZz
4 _5 s9 w; P) e4 `' D. a爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
9 p K, F( c8 z. p上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html- O& [/ d7 x d7 O$ H2 J9 D
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html$ ]5 f5 s9 x2 D! Q: H
——
+ ^& a7 b1 F$ i: W# K; \+ P百度2011年实习招聘专题5 P2 c8 H" c) L
http://www.aftjob.com/portal.php?mod=topic&topicid=22
/ C& D6 X9 ]2 b0 p) h9 `( c/ Y8 R7 F爱立信2011年实习招聘专题+ J: P# T/ M$ ?3 Y# ~$ Y
http://www.aftjob.com/portal.php?mod=topic&topicid=23
3 e4 B3 k" q- @( a2 X5 y8 H" _新浪微博2011年实习生招聘
+ z) ]. l0 e, z3 A, U3 nhttp://www.aftjob.com/portal.php?mod=topic&topicid=210 F. v7 l1 c( Q/ P/ H) }# C1 C
阿凡提招聘:http://job.aftjob.com/job4 s9 ?" S9 p/ c
阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag# ?+ R& e! _) N: s5 o$ F; T( g
阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum5 E T# I. d* c8 }/ V
阿凡提职位搜索:% ?/ y5 z, B5 S$ ]4 Q! Z( q
—— |
|