|
|
2009爱立信面试题, ^( w. ~8 M& i8 S6 g' A0 K' B, }
+ a' r \5 o- V6 I% h' y3 Q
Zz
8 c2 ?( G: p: h% |' \+ [/ L% E3 \* H& r- ?, @
(1)下面程序运行结果是什么:
' J0 x& a3 s. a! G#include "stdio.h"
7 s. f/ R% A7 j) l/ W _$ hclass test; z, i0 t+ D& K3 ]( P
{7 p& e5 F+ p# ?
public:6 ?. W9 y, J3 v/ k: k3 t
test(){}7 m- \7 M2 n1 r1 T. s- w- r% H
void hello(){ printf("hello\n");}
H; W" V/ `& R% w};
" I! s& \( o4 ?void main()9 `" Y* W u! B1 q5 w
{0 j+ k. p+ N1 o1 ]. w) S% V# ]8 Q
test* p=new test();
; D. G$ K$ p+ N" P p=NULL;
* r I. \! B* Z ^" V p->hello();! l: E2 B4 \% ]! s. |( M
}5 G4 I! }1 p% k- i/ {
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
0 ~$ i. E" g; `' `% e1 v/ ~#include "stdio.h"
" b( j" q% e! z |5 j5 c0 ?" j+ Nclass test
- V: G. B( b+ ]( `9 Y7 ]2 |{
7 H- r6 k5 [+ \. I, _) v7 Vprivate:" [- L* {/ f: {. O) u2 x! A% I
int i;- s6 ^) a* K$ D% x8 P
public:
$ n1 l( R0 @' y3 [ j3 L4 b8 utest(){i=1;}0 M8 g' N& o: t7 k9 b5 P! f
void hello(){printf("%d\n",i);}
" ]5 L6 ~* v8 o2 b/ ]' E3 H};# n; J6 j8 Y1 L8 J! C5 ?% K; J
void main()
7 f: H! g. F" G3 ?% y{
I2 ?0 p2 z+ C' {* F test* p=new test();( a7 n" Q" _) b
p=NULL;' A4 L+ @0 y7 E8 i2 K% Y
p->hello();5 J6 y! {, E. t# Q+ S2 D
}8 D3 G# r8 c. a8 y3 L) m l5 r
如果将p=NULL注释掉就无误,就会输出1.
1 c$ ~# {6 C0 T. n注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
8 O0 ?. n* j; Z# w1 T P) `. Q(1)C++的构造以及析构顺序5 ?6 e8 ]/ n+ ^5 u" s/ ^3 p" S
#include <iostream>
- Q5 N8 n( a- @* |8 ?1 @0 s g/ zusing namespace std;
7 |) q# k5 _5 {4 [- ]3 p0 rclass A" S% j C6 U% J8 l
{+ I$ z4 X& N& f# a* o
public:
0 j2 P& A% }! L# K& r7 YA(){cout<<"A"<<endl;}
# D9 z5 A7 n1 ^, R~A(){cout<<"~A"<<endl;}
( w( a* ^. c- b. s! L9 \, F# l};
' L, k5 H3 _4 b/ D1 L) xclass B : public A3 K! y. e+ h; O5 ~# e' I
{
( L& G7 \- M+ Q' y! Zpublic:6 t) P! c. t; B6 o5 @+ x# X
B(){cout<<"B"<<endl;}
" M: d4 B" j8 l$ b) a: g% O6 \) Tvirtual ~B(){cout<<"~B"<<endl;}
- `5 d) ?' m' D8 E6 D};
9 ~' }% x. q0 A0 |* R. C6 Kclass C : public B) L1 ]- g/ n2 L; ]
{# D" k' Q! U! Z
public:
3 X% J% u. I7 PC(){cout<<"C"<<endl;}
3 q! `( b$ x0 E# u~C(){cout<<"~C"<<endl;}# f9 Z1 s% N% K: t4 r& Z% q
};4 F, e# A& S3 F+ F* X) b* \2 m
) P( A, X5 o' y# w( N8 V
void main()
- e9 h6 h6 a* ]; j+ f{! v* c2 ]. u5 v1 y
, w* [) D0 p3 [) y3 JA *a=new A();
C) T3 X9 n" u! [) sB *b=new B();
2 d+ \1 J* A9 J/ g- |! V/ x. e C *c=new C();7 l1 Z; i8 G4 \% X: L9 z
A *d=new B();
7 _4 L2 u6 ?4 ~6 m3 [A *e=new C();+ s- Q: S6 \" ]# I# b
B *f=new C();
! B+ U! ^4 s" j4 V% v0 @" Y ^) E: ] f8 R, e. Q) o6 G9 {
delete a; cout<<"---------------\n";
! v! e# R$ q0 D4 A0 r3 ^delete b; cout<<"---------------\n";
% H" j1 j' E. B4 x8 A' R# U0 `delete c; cout<<"---------------\n";' Q4 g6 S4 ^1 g/ x
delete d; cout<<"---------------\n";
" r8 M- @4 r9 R! @) ]. Udelete e; cout<<"---------------\n";% f# m' G1 b3 N+ @/ K x* K9 U
delete f; cout<<"---------------\n";9 F: ]# g: M& S9 B; {8 J
}" Q" W: N; p# M
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。 v& Q: y$ f- k9 t6 u+ v" X% C5 L
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
6 s2 x' ?2 E8 `7 Q) x3 _其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
: y1 o1 L, @7 y(2)面试的诡异题目
* B( x$ s. N4 E8 ~1 P2 z+ F大意就是如果你 test *p=new test[20];5 A7 x$ O: ?- ?6 z
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)# i. f: \0 v F$ O! \1 v
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
X5 g- r; x: R5 m/ F
" q3 j- h, v3 r- N p6 @. g( [6 [Zz$ A+ w0 ~8 v7 d' I
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html5 j1 m* r7 V' E u# d
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html: B, J% ^5 ?. e2 A5 T" P1 ?
——
: j+ z$ y% o. ~1 N- D6 i6 h" {查看名企2012校园招聘最新进度,请关注阿凡提求职公共日历:http://www.aftjob.com/home.php?mod=space&do=calendar |
|