|
|
2009爱立信面试题5 P3 j; C, i" y* D
. { H# b" Y# k, L& M
Zz$ e7 ~+ c" ^: w2 E; t' ]
5 [* q9 R8 f3 B( h( L
(1)下面程序运行结果是什么:" M T1 l1 f6 \/ Y( r
#include "stdio.h"
2 {* {8 k) w, u. q# lclass test
3 w" Z0 D. b' p+ z{/ X+ ^% W1 W6 r
public:
' r1 K7 X" x. q; q- f, Q3 v0 Gtest(){}
9 I( V* _% Z1 h. V; @void hello(){ printf("hello\n");}& T) h7 E/ M' h( D
};
. u2 t3 M) X) W/ m3 [( A( n# m1 {void main()# O9 H- Z" t6 B- W' h: j- j+ H
{
6 _: ^- r. R& R; l& P test* p=new test();1 _+ L7 l& @& |+ C. T/ D
p=NULL;$ w0 B8 J# d1 |1 L6 L
p->hello();
. q& n( `6 S% D: P% h3 [}) H3 |0 r0 A, c" _& ]* ]. B
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
" m- n' P4 ~0 L; W$ U, h#include "stdio.h"& X0 c4 \- e7 \4 M* z! W9 s; X: |
class test
I; w7 N1 B% s6 K! o# m{& {, a( [: p5 h" [7 u9 J; ~. }- G
private:) e. P1 t) n- z. @. C' d
int i;
* L f& Q! M& g3 A% I0 T2 epublic:: J1 }& k) g9 }. f
test(){i=1;}
. r: J2 H" T$ Gvoid hello(){printf("%d\n",i);}
' }6 P1 J( F+ ]- W1 u8 ]: I};
0 f! Q2 U* A; avoid main()
1 i$ g7 M; p% u# M3 P, F7 V{3 K7 j3 `9 d, ^1 L+ w% R7 Y# e
test* p=new test();
! \" a' _7 x/ M1 z! Op=NULL;: h2 Y3 u4 ~$ z: i# q9 v
p->hello();
) O8 i8 ^( Y" N3 X}0 [& j' c. X8 }1 N
如果将p=NULL注释掉就无误,就会输出1.9 g V; {. S6 Y s
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
6 t7 H6 J' L' V: I7 C(1)C++的构造以及析构顺序 r- S* _. h/ T' c$ ^ ~5 q) g
#include <iostream>: [7 {5 E( o1 G! x$ e7 Z3 L
using namespace std;: [/ m, R# Y! C1 L W% B
class A
1 v. m4 _) L1 {0 i' q{
W; n8 V3 m/ C3 T. ~public:# y2 w4 L% s4 M; q* P
A(){cout<<"A"<<endl;}: n: i* Y, L* c
~A(){cout<<"~A"<<endl;}. J+ A- G+ k t% w) K; i4 M4 B
};
; L" c5 ]2 K4 X# \' M% ~class B : public A
9 t# p& Z" A6 ^% \) W6 R7 D* k{; k, S5 Z' d) s( ^: O
public:
* `2 S' D6 `' Y) \B(){cout<<"B"<<endl;}7 i3 l" K2 Y8 G- B
virtual ~B(){cout<<"~B"<<endl;}
- w: t$ Q# F! v# K}; W" r, n7 @5 D+ h9 k% D3 X; i
class C : public B
& C+ U7 `5 C0 V K5 M: a6 H \{
( y2 V) H1 ~$ E% F. d+ J& d' @public: m; J. D1 B& V7 v" G
C(){cout<<"C"<<endl;}
* V$ R# `, G5 r+ n: D9 T~C(){cout<<"~C"<<endl;}8 I& s8 j/ {! t& V- {8 |
};3 e3 H! o+ t) Y& z k
: n: _" W. _& E; |6 @! [1 D% ]
void main()
% D: J1 d- E: c2 I{$ ^+ a; |- P+ h$ n3 P
) P1 m8 c6 w" M5 S- }1 M" }+ q
A *a=new A();8 {) V" \: H8 o- I/ Y
B *b=new B();
. e" r% p! h- T% j* m( a C *c=new C();
. ?; Z: E; L/ s4 LA *d=new B();- Q# a( V( e+ ?* f) D
A *e=new C();
5 d2 e% q2 ]8 w8 U* E5 [+ RB *f=new C();
+ \. B( l' q' O& }% m6 T/ x
( C# g7 Z& P7 u* vdelete a; cout<<"---------------\n";
! J! W, c+ x, Ldelete b; cout<<"---------------\n";
. H4 F. ]8 I! u6 z' Qdelete c; cout<<"---------------\n";; Z; [1 \. }$ w! z
delete d; cout<<"---------------\n";
2 @9 I! q6 t8 w9 U: \' bdelete e; cout<<"---------------\n";( x0 s# l: i6 Y- R
delete f; cout<<"---------------\n";9 o6 t x Y7 Z
}7 a) l- z7 g1 t, Z9 t
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。; j! V5 S* T$ W9 U2 T
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。, I, a: O# h# Y! v7 z
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)7 G: f- n+ g+ I2 g2 O! a3 J
(2)面试的诡异题目
+ B# W. f O( z- F% a+ J大意就是如果你 test *p=new test[20];- x& G* U$ F. R) v) b1 L" s p
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
- e1 M1 e5 E" u5 `答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……1 L8 {# U5 w0 u, ~& y# v; d
+ ~3 s; N& z# ^2 |: _4 L
Zz# m6 }& D. s& a
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
: D1 {4 ^1 d3 a4 B* B7 q' w/ N爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html" y. o( Y. F7 V1 Y' N/ r% n9 K
——
' w1 ]6 r4 E2 c7 U, g- ~( X查看名企2012校园招聘最新进度,请关注阿凡提求职公共日历:http://www.aftjob.com/home.php?mod=space&do=calendar |
|