|
|
2009爱立信面试题% v" x% N j: q: @" G
6 c" J; S# @9 d( IZz$ A- ^7 u7 N/ A1 |
* v( P( E; d& u5 a" E- h
(1)下面程序运行结果是什么:+ }) d: P9 H2 D: s; n& e' P
#include "stdio.h"
- V2 H" f0 O7 ]& Bclass test
# \( y* o) x; U4 S{
. n' X2 t$ o$ C5 @! Tpublic:
7 X* ?8 T; z! n/ T. t' htest(){}
1 S' v- a+ d7 F7 ] n/ S6 hvoid hello(){ printf("hello\n");}
]5 g. t" }' G& d' \1 `};* N0 g4 I! e2 W3 Q+ e
void main()/ _) _& P. B0 q" c( R$ R
{1 p# C# ` s, p! S1 Z
test* p=new test();( s# s+ d4 Q8 ~; d
p=NULL;: Q7 s# [" X& J, p, \- t9 C8 K
p->hello();, i4 [/ u. E, Z" | Z) E$ S6 b- E
}( ]) R# w, c) s& _8 J$ h9 ^- I, T2 }' G
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
7 W7 n/ m6 ^8 e3 A, M5 ]#include "stdio.h"+ a( `0 j5 Z; o/ t& S7 F1 X" a m7 ]# ]
class test. W' c" ^$ W% C! C& |
{
6 k$ [' ]" d* h/ q- d9 X+ V4 W5 vprivate:8 q/ W( G5 ^, i
int i;. M; r2 u; s# B+ K2 |8 t6 `$ `
public:
. [* Q( d4 f4 r' l o0 z( K3 rtest(){i=1;}1 _6 \- p* ^$ U0 ?+ K
void hello(){printf("%d\n",i);}
% F1 z2 T' T. Y. k};
3 Y+ \ u2 D1 Rvoid main()
# G1 M$ x/ Q3 T/ C{
, D# H6 ]* U% c test* p=new test();
+ c" ^" I8 P" `! d( k- P$ Mp=NULL;- |8 z0 f1 x- v) v; j" z
p->hello();! n5 n2 [- ~6 m$ V! u" l# c8 O8 z
}
w1 F" a6 Y5 f6 `! l0 I9 O如果将p=NULL注释掉就无误,就会输出1.1 u1 l9 z3 [( F9 T( b g
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
9 F3 [ G/ x- M- f( V4 b1 C4 S g8 o(1)C++的构造以及析构顺序0 W- C" K7 Z; d @8 K
#include <iostream>
4 N; {. j0 q. n( ?* K2 Y# h3 {: ]using namespace std;
! Z1 F: u: u S3 f' ]class A
- M1 E N2 S, L: z{$ w" h( I# [5 {$ M* ^5 O$ g
public:
& H3 j6 b/ M6 iA(){cout<<"A"<<endl;}2 _7 F* ]- b, |' j+ c2 L
~A(){cout<<"~A"<<endl;}: D$ ?. c) h1 P$ c# v; }6 f
};+ |; {3 y, Y: V* c0 p. x. P* J
class B : public A4 W4 r. P' w6 u$ L& c2 m; z
{. u* B. Q; G6 I, v% }7 [
public:% a. V2 K2 |, m6 e3 ~
B(){cout<<"B"<<endl;}! R1 X3 D6 Z- ]
virtual ~B(){cout<<"~B"<<endl;}0 j6 Z4 n; c V7 ]% \ f* }7 G
};/ \+ b) x- ]; D
class C : public B
! T) D( ]2 P: \" T' Y1 L, {# N- L% i{" F1 H! @2 t% I7 O: X
public:8 G; K! L w% D5 X2 d& F
C(){cout<<"C"<<endl;} c; y4 V8 y& Q$ M+ l6 V2 a, w) B
~C(){cout<<"~C"<<endl;}5 A! `( p0 c/ Y4 S( O {( P
};0 w) g7 L. s4 U& k
& B' l# |1 K W1 c; o1 z& Fvoid main(); ]( y/ X/ ]( v# k: C7 E
{
9 u* w0 w7 _7 H. q+ [' S6 r5 Y5 ~; ^
A *a=new A();* i+ ^* j. v1 J0 e6 Z" _( ? c
B *b=new B();+ k% x7 u* _! `
C *c=new C();3 Y8 A( w' @$ h p1 K
A *d=new B();4 h) y. z' J& ?. v0 R O
A *e=new C();
0 w" r5 C" }& X" c/ iB *f=new C();
' P( ?; ^" j4 v+ g6 ~; \& o
7 I2 z3 c+ S; l. jdelete a; cout<<"---------------\n";% f/ |, N; G$ @: h6 \; F* z
delete b; cout<<"---------------\n";
# D( N) K* `+ A, L B1 j' Sdelete c; cout<<"---------------\n";/ ?4 G9 A0 N, e( n# ^& ^6 r
delete d; cout<<"---------------\n";
! A+ r2 ` m; wdelete e; cout<<"---------------\n";
+ }4 r; v3 {- @& T! m6 _delete f; cout<<"---------------\n";
# ]" p( a3 D/ c}
5 _! R- X6 b3 a- w4 N2 z5 z. A9 F7 ]这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。7 U5 a1 \3 N4 m5 L
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。: G% t# l2 s; ]" v% O! C7 o
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
4 h& u1 w3 x$ P" T7 D(2)面试的诡异题目( B5 E# C$ U5 ~! \
大意就是如果你 test *p=new test[20];
9 I& g1 h2 B7 Q, ~" O然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)' @0 P8 m- S6 {6 [; d
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露…… F: v. k3 \7 L9 ^6 _- {! @2 m
0 N, T6 ^/ j, P7 hZz* t) T; G' i6 A& N' v
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
2 M5 c7 M' q3 K2 M上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html
4 n2 z' b/ d( b7 m6 F5 q. f* P爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html, P& ? _3 P( m
——
, ]6 r# R& ^' g! H百度2011年实习招聘专题3 V3 W0 {' h: s W
http://www.aftjob.com/portal.php?mod=topic&topicid=220 _2 U) ?% l- R: K+ P
爱立信2011年实习招聘专题
3 t, d) {, @+ A7 N8 A4 phttp://www.aftjob.com/portal.php?mod=topic&topicid=235 {% L( o" q: H8 {
新浪微博2011年实习生招聘
+ Z' a* \; Y5 U8 ahttp://www.aftjob.com/portal.php?mod=topic&topicid=21
5 Z B3 n7 \$ d5 S, E8 n阿凡提招聘:http://job.aftjob.com/job; b# _0 w1 j+ U9 U
阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
6 A7 F- V* h$ `2 H阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum
+ E/ J5 G( a; w' }; c5 a阿凡提职位搜索:% ?* |: r+ g$ E/ X& K
—— |
|