|
|
2009爱立信面试题5 |/ ~3 H& k: b/ x$ U
! i# c7 H/ C! E" o: z7 c2 n7 M
Zz* p+ Y- W: k' c/ h: W+ G& Y
' _: v% _0 c/ y, }& {! i(1)下面程序运行结果是什么:
7 L5 V/ s! G5 N' f( }8 p2 @#include "stdio.h"4 `- m& y' l9 @+ W" F, B
class test2 j& }+ a4 h- m( q
{
- u- e! ?3 H, P# {: U# F$ x9 jpublic:
$ f+ d% O. K$ s: I5 V% k8 Ltest(){}* Q, T8 ?& `, }1 D6 d% M
void hello(){ printf("hello\n");}
7 b, F5 N+ _6 m: y7 @3 A7 t};
. E" {; H* @6 ]$ F' H( wvoid main()! U. \3 x& Y& o( g- b+ z
{- B5 T- W$ L, E3 p
test* p=new test();% [9 d) G: |+ }: V% N! Q; H
p=NULL;9 W$ ]6 V2 ?6 c
p->hello();: R+ A* l$ z+ M6 P
}: u5 g$ e9 p; j4 X3 i. L
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
* R5 h& [9 B) t( e$ q# R/ `#include "stdio.h"' |. U0 G# \) f8 G0 U" C" F/ N% X
class test
- s" D1 r3 i3 D1 x. p* o{
0 x3 J9 n: L1 J sprivate:
, m" V% g& k9 iint i;
: A. N8 f" Z2 I7 N1 E1 I2 l0 c' ]public:
( D, g: D8 P0 c: {( @test(){i=1;} f' B7 v/ D$ G5 E
void hello(){printf("%d\n",i);}. A3 G+ Z# ?7 o3 t' m4 @% Z w
};# Z$ Y/ Y$ E" e$ F
void main()
# i% P# p% A- P$ [# S( W$ ]{
1 r+ k' J; C4 i/ M test* p=new test();
+ C4 l9 I/ b. C2 O. _p=NULL;
3 i) ^' N2 x* W6 ?: q9 a1 yp->hello();/ w/ b; X4 a }$ i2 @; H# d
}
- s& F ]* l9 @: J如果将p=NULL注释掉就无误,就会输出1.2 b* r- u [9 |
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。5 N4 i- X$ a+ E4 U' h
(1)C++的构造以及析构顺序
9 k5 W* H8 C3 P8 Y) }#include <iostream>8 G/ x# J6 L" z& L. J+ Q1 X6 d
using namespace std;6 q) K9 s$ o" }0 u, u9 w) n
class A
- A S9 U( W- ]) B{
' L; I& G+ Z( w0 G9 y1 mpublic:
9 B2 @8 ~/ R: [0 mA(){cout<<"A"<<endl;}
1 h/ z1 _. r" o+ g% M~A(){cout<<"~A"<<endl;}1 b+ Y$ Y. }# A: J3 |1 }
};1 M& V3 a" I* T% f0 Q$ |
class B : public A
) {6 J; \; ?8 J{ D; r0 [1 x/ b- |/ [
public:
. }5 l0 Y' j: l6 vB(){cout<<"B"<<endl;}1 W9 v; s% z f5 r+ L
virtual ~B(){cout<<"~B"<<endl;}: N9 Q8 Q1 l2 Q V5 y9 k V
};
8 Y: Z& q: W6 h2 fclass C : public B# W6 c( }) K+ y1 W8 V& Q
{3 T2 O, f/ p9 K; L( r
public:
G( A* k5 l! n$ }$ v3 tC(){cout<<"C"<<endl;}
+ z5 w# n3 d1 ~. R~C(){cout<<"~C"<<endl;}
; h! G( ~) T4 f* f2 X! _" k- \& l};
3 S0 ]/ A y: r% U2 i' r1 ~# [- R: n1 S9 g9 X# z
void main()2 x& ]9 ~2 h( r. L+ J3 j
{/ d* q$ g9 L5 O4 x0 _
4 z9 E# {! ]2 E B; D$ S5 CA *a=new A();
- a/ i) @: T0 g# o: J% ^B *b=new B();
. V% A3 n; k( t- Q C *c=new C();. F. K, G) ^5 \" ^
A *d=new B();
; k8 P/ ~0 V0 |A *e=new C();
E, D" [/ M! f! g+ _ S' r% \) R: W( P7 UB *f=new C();. A r6 g8 u5 }+ q0 Z: K6 i
' n8 X: `( t6 }+ X& F9 |: \
delete a; cout<<"---------------\n";( Z! c. t5 n" ^0 T2 M2 t% W5 A
delete b; cout<<"---------------\n";$ q5 @4 L+ m1 Y4 x
delete c; cout<<"---------------\n";" |6 w* A7 L! A% i8 M3 q1 V9 D
delete d; cout<<"---------------\n";; {9 a( U' l8 ` f
delete e; cout<<"---------------\n";' V. |, C- C% @$ `
delete f; cout<<"---------------\n";, B% m$ Q6 z0 \$ X9 `. T+ v( a
}
* k" l8 ]* O; E) @) f1 P这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。# L1 ?9 ?( f6 I/ o
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。7 F l4 O% i- c) E& m( m! c. { ~, Y
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)- B. U: b* J% O+ j! m8 \
(2)面试的诡异题目) H9 |8 t Y% @
大意就是如果你 test *p=new test[20];
) J" |0 I+ z. _ x9 ^然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
/ p* z B& b: F8 a, T答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……6 {- L9 N2 ?. M" x# \
( E- P7 x! S7 z% l5 ~- ~: WZz% v) I6 ^1 f3 R, l- u9 d
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html& E' [' T8 g/ v3 w
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html" q. X9 x$ J' K6 \( Q6 _8 s
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html! k [5 j) h H: w x6 E
——
6 x2 S5 Y+ I U百度2011年实习招聘专题
9 J C" H. [) J) @7 M- g- |http://www.aftjob.com/portal.php?mod=topic&topicid=22 F- `4 x6 `; ^* u
爱立信2011年实习招聘专题8 o$ B1 C8 X( x1 r! q+ `( m4 `
http://www.aftjob.com/portal.php?mod=topic&topicid=23
* D: v+ H7 n$ q7 _5 \新浪微博2011年实习生招聘
1 d3 r( h3 U0 C* ]8 J; E4 Shttp://www.aftjob.com/portal.php?mod=topic&topicid=21
+ K) G* ]7 T# i6 D2 C阿凡提招聘:http://job.aftjob.com/job
" {% j3 {- y3 `9 E' {( q; g* U阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
# [: _5 P( [0 A阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum
4 f, k( E. e( Y4 L [/ o阿凡提职位搜索:
% t4 I8 K+ m* h, h4 \" X6 \$ Z—— |
|