|
|
2009爱立信面试题8 H) [7 T; p# x- D$ t
2 y5 ]/ B2 \% e6 P
Zz! W/ B h* I% J, i. \$ h% x I% e
& [$ o! S3 @& |+ W# A3 ]5 r% Y+ Z(1)下面程序运行结果是什么:
4 |: k2 q) @& n' [- p#include "stdio.h"
9 R% a0 f/ q# T) T- [class test3 p; G6 D7 [ E
{- E3 e& z9 d7 g! _. k
public:
2 a0 B+ S) W. V7 p; O* Ytest(){}
+ p- z- G% \5 Zvoid hello(){ printf("hello\n");}
' m- Q9 T7 Y% N4 |! `8 X/ |}; ?; `9 j: B1 I, ?( ^* t, E
void main()
- o- a$ y2 I! G# U, h& D{. Q) j, C; p- e K1 z4 G% i- b
test* p=new test();0 m7 i0 F- `9 E& J0 Z8 i+ n F5 a
p=NULL;! O4 y3 j7 Q) X! p& @% a: A
p->hello();. g4 y( s' M4 [0 e
}
( w* K% Q7 N$ `8 c5 `; V事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:# _) y3 U9 i6 O$ e8 q$ F* z: f
#include "stdio.h" p1 } z) K9 ^/ K! U% o( o
class test
9 O2 X' B8 K z( n{
& P" X# u2 c% h, Zprivate:( h( j' z8 y/ `3 v
int i;
+ Y/ ~$ e/ E: @8 }$ k3 Mpublic:
9 n- \4 m( S/ t" ntest(){i=1;}( }: m9 t# `: x; U; f
void hello(){printf("%d\n",i);}
8 a: J3 Y- c7 K* ~6 T) T- f};
1 s( T: F6 i# ]3 hvoid main()
! o0 W& V7 S" l5 S# j# B{
8 j8 ?/ P2 v6 ?* _ test* p=new test();- n: F- k' D) G1 n0 l1 T8 T( j/ W- q
p=NULL;
) N m Y% C& U" m2 qp->hello();2 q. I9 a+ Q3 N
}
9 B0 D; A5 y) K如果将p=NULL注释掉就无误,就会输出1.
. B" u, F" x1 Q% w6 _注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
( [. J/ ?1 p% d2 O( x7 O, ](1)C++的构造以及析构顺序* q1 d q0 D4 f
#include <iostream>
8 x9 Q& | a, y7 m( Musing namespace std;4 u2 U9 }! U- R2 Q
class A
1 `; M- @) ^6 t" u3 s `0 Z' q{
E7 G! p1 V$ fpublic:
% V4 {# d! h1 {- |A(){cout<<"A"<<endl;}! F- b) O9 ^6 C
~A(){cout<<"~A"<<endl;}7 Z# c1 ?) G! x7 m+ |$ y
};
- t. Z. V5 h+ R, D- Xclass B : public A" n, {4 E; f& G) p4 t& \+ a% Y+ w
{* V6 |4 L5 v+ a9 l/ b& h+ f
public:
2 e: @1 E, }, s: S: j7 o1 \( qB(){cout<<"B"<<endl;}5 m: R" G; @$ y X8 w
virtual ~B(){cout<<"~B"<<endl;}
6 |0 h/ E, j( A s1 A- ?( j};' ?! S# s7 k/ N" Q( _# R8 N
class C : public B) P5 ~1 c2 V; `
{8 `( `' O2 a/ j
public:
~1 {& k; e4 H% X! @" ?" N7 Q2 }C(){cout<<"C"<<endl;}
: U- M4 h4 w) ~% G# U3 @7 a m9 v5 L~C(){cout<<"~C"<<endl;}' E3 J5 P4 A! k+ F5 S! t) {
};2 q p7 d% j! q6 [2 {& \) |
- J1 k! e8 S) h6 V! T. ]9 A2 y
void main()" ~* M; H9 a' d
{6 `; G7 ^# f5 K i+ C2 H! A4 Y4 q
' J% z: S* a( \' F9 T5 Z( `9 R- aA *a=new A();+ S. P6 u4 @1 }' d1 i0 _! l7 E
B *b=new B();
; A, C; t( | U: c C *c=new C(); y4 l' n- V; }$ j& u: N
A *d=new B();
$ x, @* c4 Z2 q6 i/ X* oA *e=new C();$ c* S/ x+ |7 M: h
B *f=new C();2 G* q V% X, k
, d) m8 Z. G1 C1 xdelete a; cout<<"---------------\n";" Q+ u5 A9 V0 b% l$ O K9 v
delete b; cout<<"---------------\n";; V, N, ^4 z H
delete c; cout<<"---------------\n";
) B W$ o9 v7 k; h& T( B) ~# Sdelete d; cout<<"---------------\n";) }8 \" X! K( \; d( N
delete e; cout<<"---------------\n";
% W+ J9 k8 j/ E: Ddelete f; cout<<"---------------\n";- R# M0 x- g3 d) I) P0 I, w
}. {1 H' s- @+ f% U" E
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。9 D, }6 q2 L: C) z/ T9 n
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
: w g9 h# F: Y) g, y9 }其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵). s( z3 e7 L) Z) L
(2)面试的诡异题目
6 W0 |6 n7 y8 u: {; ^ Z大意就是如果你 test *p=new test[20];' ~1 h* \' A v- W: R6 ^
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)% X. J* A1 w1 @ q C& ?# Y
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
+ a9 G' U- \! K5 ?- w; }* a s- _6 i- r
Zz: S- M1 i) J; c8 [9 q* P9 `- x9 I
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html; E3 F" b$ @: f" ~! P0 Q' y
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html& j* A; q% {+ a& C) t* d4 c
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
# u a P/ F( C——9 O! T) S8 B$ J7 a9 b \! Z
百度2011年实习招聘专题3 a7 f- O( J9 Y+ I, O# s# s
http://www.aftjob.com/portal.php?mod=topic&topicid=223 V h# J. R+ S3 x
爱立信2011年实习招聘专题; @; P) T9 _' C! j5 A; Y* |3 x
http://www.aftjob.com/portal.php?mod=topic&topicid=23& A0 z* r: R9 J9 O9 p* f2 \
新浪微博2011年实习生招聘; A7 G% z1 w# ^1 ~7 ?7 C
http://www.aftjob.com/portal.php?mod=topic&topicid=21! q I/ y# {; z& N9 p, l
阿凡提招聘:http://job.aftjob.com/job% q% R+ s/ [- r
阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
: L) `3 }& W/ | _4 f( _阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum' g! s5 Z0 L9 @! L( B v$ k1 \ N2 j
阿凡提职位搜索:" V. w5 l9 K8 M' C8 B# O5 A
—— |
|