|
|
2009爱立信面试题
0 X J' j) w' k$ J
1 `) ^2 T) N; L) qZz$ n6 z! h! Q4 t+ U7 {% O
# \+ |, {( \. F* C
(1)下面程序运行结果是什么:5 Y u0 w8 C$ g% g
#include "stdio.h"
4 O7 i$ e8 A/ Z. Oclass test
& y5 h* S0 i1 F% \5 z/ L{4 n7 z' U! D, W5 e0 a, k. r
public:
' d: B( C+ v- t9 Z; |/ vtest(){}
$ k5 z1 Y( o0 g# ?void hello(){ printf("hello\n");}
d! r& h; w8 O0 T}; D8 Q: Q( {1 t
void main()
* S$ `" O! O7 F; Q' U0 Q{
# A% g) _5 S7 x' w: ^6 M% M test* p=new test();
/ |0 Q6 K B% Z- c' w! `/ ~ p=NULL;
% Q: N8 G7 D( Z& A p->hello();
8 U Q( A/ q; o% O- Z% ?3 y}3 I5 F$ q3 E* }1 D1 e
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:% g. H* J9 v# i
#include "stdio.h"
, W8 |4 y/ q1 w' G3 O- Jclass test* j- d8 a: i0 t- r: X7 v3 S7 G/ G. T' P
{
8 O$ D9 T2 ~8 _( E" k) ]% lprivate:8 Z9 B2 \" D4 R0 p& h
int i;1 B( g- c2 S, R
public:
) i' N' j3 n. m$ B+ Jtest(){i=1;}
' J2 o2 [* E) `) r1 wvoid hello(){printf("%d\n",i);}
7 V( n4 ]" b- ^# X. I4 W1 o};0 s" A4 V8 x" j1 C6 f8 b
void main()
$ D: k8 L4 {$ [{. l# w+ ]7 N5 V1 s: M$ ]" w
test* p=new test();- N1 H. W, \! J; Y% v
p=NULL;
! d- [) A K4 up->hello();' j6 w, f% g1 j# W
}
) O! q* S7 q- o, v- s+ p K如果将p=NULL注释掉就无误,就会输出1.. l) N' l6 n, ^% ^
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
% i; t/ {' f! B2 i. H(1)C++的构造以及析构顺序
0 l# J$ Z1 ~$ j0 C' P4 S, Y9 Z) N& D#include <iostream>
: O9 T/ `8 x; ausing namespace std;; B' n0 D9 D3 W2 Z6 [: z7 J
class A% j: E t" u, l6 Y2 N
{
2 m: [1 t5 `3 Y+ |; E2 C" f$ g' Hpublic:
% }7 t0 d+ C; h- i; j1 jA(){cout<<"A"<<endl;}
: a; h/ Z* D- o n: ]+ ~ d5 [~A(){cout<<"~A"<<endl;}+ y5 j% `2 {+ r j
};, c7 |1 M( t. G! d2 u
class B : public A
' `8 S" j3 u# W7 g{; D$ ]2 n" _3 z6 w
public:
( b; m1 d; ?! O* ]$ uB(){cout<<"B"<<endl;}0 K& }, ~/ q0 [: m. n
virtual ~B(){cout<<"~B"<<endl;}: v3 i% i4 s7 [6 P
};. b3 o: }) M$ ?
class C : public B* u! E$ m8 l! `! u" O) f
{, X- }- g, K; f6 U2 b
public:5 z# Y2 O D/ h/ q% o8 G. @
C(){cout<<"C"<<endl;}
+ W! D; W* k+ j3 c: ?~C(){cout<<"~C"<<endl;}
, _/ f3 \0 H3 r9 l};
" d r& U3 g% w4 \8 W& l% Y9 @8 p k0 @% \7 ~0 H- M' H
void main()$ l' T8 w8 r3 G1 e; S7 [9 ~+ A
{
$ c7 j7 }! s" S$ }8 \& ?& s7 Z$ Z& I0 T% L
A *a=new A();
% f+ ]9 v) y- G/ @# A+ u+ V$ |) DB *b=new B();8 p# Z: ]+ A; P( l* n
C *c=new C();( G0 C7 e8 `2 Q( C! f. t& ]
A *d=new B();
% b" p' [8 W* k! E, ~A *e=new C();
7 c% `7 l* B* m4 N; oB *f=new C();1 i9 A3 a7 Q S$ f9 U2 ^8 a+ N. c
! _/ `' |1 p2 S
delete a; cout<<"---------------\n";- [( j1 ?) m5 M" U: y
delete b; cout<<"---------------\n";4 W- d- c: Z3 }* P, M
delete c; cout<<"---------------\n";
" S. k' F. I% p! b# T1 Ddelete d; cout<<"---------------\n";
! V( H ?9 l$ Y$ ~8 o% Ndelete e; cout<<"---------------\n";
/ D' X% R( d8 R' B. ndelete f; cout<<"---------------\n";* ~1 j& |6 W7 A! E f
}+ u& ]* Y3 f* y: B1 K
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
$ v1 W3 A; o: U5 v8 d0 @6 A4 z这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
7 C6 b( y5 T! F( `, j" N其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
) x9 U6 q. g( j. Z* j4 w5 `(2)面试的诡异题目
: c$ i$ b; k& G' ]1 [3 N大意就是如果你 test *p=new test[20];; V+ Q! y+ v: H4 x
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
! Z" @; B* w% E3 `- X# W答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
" D' F. ?( T- E; m' c) R) R3 x/ {" ~. s
Zz
+ g$ o* n: c3 D3 l爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html* e: P; E/ a7 O% y# F- O
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html
" a1 ~( R7 h) Z4 C8 p爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
2 s0 w1 o! `2 C9 d——
, S& T' c: u4 N( A# ~! ]! [百度2011年实习招聘专题7 x. E" P$ H$ a: ~+ L) `9 ?
http://www.aftjob.com/portal.php?mod=topic&topicid=22, \/ u" E3 ?3 c3 ^
爱立信2011年实习招聘专题, z; D( d* B9 x6 a( m( w
http://www.aftjob.com/portal.php?mod=topic&topicid=23
6 m. J3 i) c2 N A新浪微博2011年实习生招聘/ ]1 y# a( `7 X2 u4 V/ ]! K2 U
http://www.aftjob.com/portal.php?mod=topic&topicid=21
! T" o3 [! B) \/ u! p阿凡提招聘:http://job.aftjob.com/job( t- l) P0 k; R/ Q6 l; N& w4 X8 I8 Y% E% Z
阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
' `8 v' T1 {* o: ^0 f阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum1 T5 s8 u: T+ }; U; i, Q" f
阿凡提职位搜索:
. l- I0 w9 e3 ^2 ]* W—— |
|