|
|
2009爱立信面试题
" N7 Y6 n6 X! o" S/ Y
' ?% Q/ g- o6 C8 n) ?8 DZz# G& j1 h& q! Y5 |) O: ^! N; B
1 G6 A* j, T) @2 h0 y! n& M9 H(1)下面程序运行结果是什么:
2 I* E2 t" |% c8 V* Y: j+ B#include "stdio.h"
" w) G' ? U) ]6 ]1 fclass test
; e4 C0 M$ A4 I2 v* |2 k/ T{ @ R2 M9 b- i0 J$ y& e b5 }0 M
public:* b4 s" L7 |0 N- c% m
test(){}: p. k6 E, i5 y1 I! U
void hello(){ printf("hello\n");}
: \2 \: Q/ t m};+ r. Y( {- \( C4 }# {
void main()8 D6 G; l4 W$ y* b
{
( z3 B; o8 b0 `) o6 ^ test* p=new test();
+ ]( w8 S. v! p) I' u0 v p=NULL;0 U7 I3 F7 }6 |0 u0 R1 C4 R, o
p->hello();
4 k* W: p }4 R" b% Z1 V}
& W4 ]# a7 O( @0 W6 d7 q9 Y+ @- E5 O事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:# W: K. h$ s5 ]
#include "stdio.h"
9 z- h; ?5 Y- {class test5 C! I2 d8 M& W
{) U: k5 J- _9 v. e# P, {$ C) \
private: A" `% W' }: H0 m! [3 \
int i;
7 e0 U' k- |* w: n" m$ I5 Mpublic:
, \4 k. O/ B/ k) N2 l& N2 v5 |& wtest(){i=1;}
; M$ J1 p) K, @% H' H/ Vvoid hello(){printf("%d\n",i);}
5 [) C3 W# c) M' R: ]6 ?5 V. y% w) I$ U};
- U+ d6 W' e" q% M9 |( \* evoid main()8 N# k9 t' K' v3 c+ _* @( B! M
{
% z( K: ^. q# @# A4 } test* p=new test();7 W! n2 U r0 C
p=NULL;5 V$ _/ F, r# z' o
p->hello();
3 K" A$ n7 {) B! [}
6 @. P7 A( ]7 v- y* L如果将p=NULL注释掉就无误,就会输出1.
: L$ o- |0 F# Y5 R: S4 u% P3 a$ B注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
/ m, X8 O7 o# ^# U8 T: `9 I. I$ Z(1)C++的构造以及析构顺序 g. O- j6 E0 N, R, h/ W7 y) Q
#include <iostream>
8 ]3 D+ S5 Y, ?8 |$ R3 Xusing namespace std;" [# r" J; b0 [/ ^2 R
class A
' e3 f5 ^, x3 }; R/ s( o{& L0 ?& _9 Z) s! B* r3 d. d
public:
9 Y4 d1 g- l Z9 Y5 PA(){cout<<"A"<<endl;}2 b% v# Y% [' E; S, _4 f) r
~A(){cout<<"~A"<<endl;}& ]% Q$ A; D/ u, T( f2 ^, d
};$ N: A" ~0 y8 H9 e
class B : public A! e( C- E3 {9 g2 ~; G" }
{
4 j* o, n# Z' |5 Spublic:0 p5 p+ E2 z1 S! E3 B- v
B(){cout<<"B"<<endl;}
' J. G+ N7 f5 d, i v/ @; mvirtual ~B(){cout<<"~B"<<endl;}6 K) M9 d2 ^7 }/ Z% B# ?' `
};
+ H. d- P+ O7 F% D2 tclass C : public B$ O4 t! v2 }# f' j( v" [
{* K) ] R3 ?# r9 L0 m
public:3 q* b4 a: L, |
C(){cout<<"C"<<endl;}
) E" {# y# p( \4 X5 f3 x- @~C(){cout<<"~C"<<endl;}
2 B* S' j# d& x) Y3 Q9 D& M$ Y/ p};* O+ Y" R, j Z. @8 N$ u' Y3 @
0 v+ r* x. l3 t5 K4 i
void main()
6 D: O3 t$ A; V# C{
/ o/ X7 U, c, x" b; z) f8 q- Y9 f5 }
A *a=new A();
2 S: s8 Q9 O- P( [/ Q' |' DB *b=new B();
1 l2 B! q' c5 ^7 t3 U+ I6 A1 { C *c=new C();* n" N, ]- Q/ t0 r' p
A *d=new B();' k9 c% t, T6 f+ F w: y
A *e=new C();- F( F% l& m" b% n
B *f=new C();
. u1 b! D# C- I1 p: e- U7 r6 ~
1 w# [6 E* L5 y3 }9 L+ ?# B3 Bdelete a; cout<<"---------------\n"; Q# o) L. k/ l6 ~8 o
delete b; cout<<"---------------\n";
# N6 }, c. q8 E/ Fdelete c; cout<<"---------------\n";
]3 T' a( W1 ~% e9 M7 udelete d; cout<<"---------------\n";
' _8 }( G( q: M9 J& p( [' _) }% {delete e; cout<<"---------------\n";8 g, d5 ?- V% n( G4 v, K) b D
delete f; cout<<"---------------\n";2 ]2 F8 j- }2 Z* B6 K% A4 K. Y
}7 O) a+ P3 R) V# A
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。4 B6 Y% x- |1 i3 H
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。4 H8 _( d; Q( l! ~) c# ^
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
5 q% Q2 y7 M2 r9 P& f$ F0 X(2)面试的诡异题目% H q! V+ x1 F
大意就是如果你 test *p=new test[20];
, D& p3 o$ c% f B) U然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)% ~4 v$ v4 W4 V# O4 B
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……* c# `* W y' ]* I$ H4 P) X
( ]3 A A* T! n4 f- c7 g. H4 PZz
( F: ~, Y1 _$ H, F爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html0 E' ?( ^% j4 B9 i0 e( n6 T. n
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html. N7 G- s! a% e* m& a' M
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html0 D" J* g, d4 x& i
——
1 W! ^# @: z# b; \3 J& t9 q, H0 s& `百度2011年实习招聘专题
; l& j: s9 P+ L Q x$ z3 a5 G5 chttp://www.aftjob.com/portal.php?mod=topic&topicid=22' i* d" w3 \+ |% J8 C( y- w& F4 K* H
爱立信2011年实习招聘专题9 S+ f+ }7 u6 Y( C$ ^
http://www.aftjob.com/portal.php?mod=topic&topicid=238 I# H5 R$ |6 z" T" _3 d
新浪微博2011年实习生招聘
; r+ j; o+ c8 ? M4 Lhttp://www.aftjob.com/portal.php?mod=topic&topicid=21
$ y8 L w9 q1 K阿凡提招聘:http://job.aftjob.com/job
( E, y: g$ q# Y* i3 \9 ]阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
% e. w# ]+ x: {3 j阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum
' ?3 z4 g. V6 j* f( ?: B1 Y阿凡提职位搜索:/ a! {* w4 J5 q$ I- k( Z8 z
—— |
|