|
|
2009爱立信面试题
! f& C/ O- k, ~4 W* o: T! E H+ p v" B: R" y0 c" C$ Q
Zz5 K# l. t1 Z! H
% d# J# p9 _& n! F
(1)下面程序运行结果是什么:3 }8 [+ S- w; n$ z* L
#include "stdio.h"; v1 S2 ~* {- H' q5 {
class test# S1 n0 i1 P% C% g
{7 b1 E7 O, W* _$ ~& y
public:. K# O- Y8 O6 \! U! p3 B4 O# o; U
test(){}4 O6 P; w! J+ n) i% y; `" |4 @
void hello(){ printf("hello\n");}
5 c9 f3 A* _4 a$ A# z n3 P8 s};' z8 d4 @ N9 ~; ^2 a$ ?
void main()) C8 ^ d2 ~8 w- k2 _: S$ L
{
& S, \4 w% p2 E& Z test* p=new test();: @6 M* X! R+ y
p=NULL;
4 A0 x; \" ~; M# M( Q: M# f/ ~& I1 i p->hello();
1 a3 H! V! m3 t" z0 I0 H9 m}& I/ O: B- [6 W& S7 W
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
* h9 ^7 u5 o& ~- b#include "stdio.h"
$ F, l( e; L5 w0 K8 Yclass test
@9 p8 o) q8 l{# Z% a# O }* K7 P. `
private:
2 P% I% I/ }, d; x! ?9 rint i;
8 e d1 f# ^* g" Tpublic:) }5 g+ p" d1 N) Q9 u
test(){i=1;}
7 x* |: n1 R! _8 j$ n' H+ {7 @void hello(){printf("%d\n",i);}
# w2 B, |& F4 g( ?2 o};
6 k) x7 r- ]; F! b avoid main()
F A. X; H3 V( T{; `8 |* n* d7 G+ k' O
test* p=new test();
8 c3 R. v: @. r+ [, r/ h9 np=NULL;
; {+ `( S8 v N8 }( ~" g6 Xp->hello();
% j: Z/ j' p. a}
+ n5 ?6 l' T& z$ |% m如果将p=NULL注释掉就无误,就会输出1.
" i2 J! |0 ^$ K. k注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。& S, D0 Z+ L9 T% H
(1)C++的构造以及析构顺序
% q P' y8 l' u* F1 }* w6 w#include <iostream>
* I3 i6 g7 P. X# V# ]using namespace std;9 Z; ?. s! `) L$ O% Y6 w! `2 g
class A1 T" e* u6 s4 j; r5 G+ o. M2 g
{
2 F3 }& O2 C2 ipublic:7 ~& N& b- ?$ y
A(){cout<<"A"<<endl;}5 A2 g9 d/ z L/ R* `
~A(){cout<<"~A"<<endl;}$ v7 v& P- L* c. G# M
};* B5 W, Y+ n! {
class B : public A0 ~0 k* Z& d5 I
{
+ [! ], T: b v# t6 b: s# Wpublic:/ N! D; g- a5 ~! @: [, s6 x
B(){cout<<"B"<<endl;}0 f1 t% b& X; z- X$ Z, S% F
virtual ~B(){cout<<"~B"<<endl;}- D; s3 r( l4 g P, \
};
" @ `6 W# g9 T ^class C : public B# g1 x. C+ u/ X. P
{
# u" W. h6 h! {4 \* I* N. jpublic:
n$ g) |+ R1 t# K8 ?: CC(){cout<<"C"<<endl;}2 C6 e5 h9 o9 \$ x; |, J, j- w
~C(){cout<<"~C"<<endl;}
6 t* ?* N# v6 ]4 G8 P. p};
% h- }$ @8 G! ~5 B& A6 i2 b. R# G
void main()! J0 m; o; G7 c0 q$ D* p& n
{
. Z; Z: e! q$ C) f4 ^1 N
5 Z) x; r7 O |$ \0 P- wA *a=new A();
6 E' K3 e5 Q* A! T7 k" l; cB *b=new B();
. R: L# X% Q* `+ Q% T, W7 F C *c=new C();
+ ^4 U9 B; ^& D1 qA *d=new B();
A- K0 p6 u8 V! B. }( jA *e=new C();
& m: K- X; L) F% n" ]" V. UB *f=new C();
* ^- z5 l( ], B1 f9 c
9 ^! p+ S& M8 Zdelete a; cout<<"---------------\n";" d; I, m! v. J" _& m
delete b; cout<<"---------------\n";. L- Z' p9 |. T# p! b0 A% _. D
delete c; cout<<"---------------\n";
: }2 S1 m. Z+ w, Z4 z odelete d; cout<<"---------------\n";
; @1 C' g4 `2 F$ b, v5 Vdelete e; cout<<"---------------\n";
* w# L- E2 Q- U) s1 U* Kdelete f; cout<<"---------------\n";, P1 Q7 I0 C9 I N& Z' o, r1 ^
}
& f; X! f1 p s" N. d+ J! Y$ u6 T: i这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。. s G5 T" c% |7 C2 v& L
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
- X; H# @) G3 u/ V# o: g+ o4 |其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)% b, P& [9 Q1 h5 W
(2)面试的诡异题目
9 f ]5 O3 |" Z. A3 `. ?# z大意就是如果你 test *p=new test[20];. K/ b2 }( P+ K4 Y# G
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……). P0 w- S" y5 n w2 W
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
, c9 _- Q; b+ Q# |! x4 I$ g/ g2 U. V2 @. q5 p- q3 u, [- d& n/ x, s8 u
Zz
# W0 R+ ]7 ~# ?1 f; ?爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
5 ?" b4 u5 X3 m; I5 B. x0 Q7 l上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html. L( p. ~7 `: r) E$ {
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html! m6 L& Q% q- @
——# F e) Y1 ^8 z: p! I
百度2011年实习招聘专题: [2 _6 x1 W) q
http://www.aftjob.com/portal.php?mod=topic&topicid=22
+ Y2 ?4 m; \0 T. B; X爱立信2011年实习招聘专题1 L2 y; K( v0 T% {+ Q4 a- v2 H
http://www.aftjob.com/portal.php?mod=topic&topicid=23! L3 Q3 {9 @! k$ C
新浪微博2011年实习生招聘$ d" h' T% R! l6 A
http://www.aftjob.com/portal.php?mod=topic&topicid=21
4 f/ I; E8 q% d3 e- n& }* G8 |; l) q阿凡提招聘:http://job.aftjob.com/job
; T( q2 [9 T1 `- g* z: Q1 }( @阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag5 u' s8 V% s) J7 d& o
阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum! S" V2 e5 A) V! p2 i
阿凡提职位搜索:) E+ ^$ |# Q* ]) P! G8 V
—— |
|