|
|
2009爱立信面试题9 S) r5 m1 B3 g9 q8 h% R
" q+ m8 g5 A6 H- s L. I7 D& YZz
% h4 r: C9 s9 [+ X8 ^7 |
% H; z, |* S" [- z(1)下面程序运行结果是什么:
5 N% n; q4 m( D% _ y#include "stdio.h"! J, M. \8 d) i. s% B& y s
class test
- V0 ]7 s/ _4 @. Z- U+ C{7 I2 B2 X+ q/ W5 V# ]1 v# s0 j1 j
public:
/ q n1 [7 T1 ~' h* vtest(){}1 A- y* D8 w+ U5 T8 S5 Z
void hello(){ printf("hello\n");}, Y7 E5 q. g: M1 W3 D
};& h! S/ }5 K9 A- R }
void main()+ [" K7 R: T' c, x* N* ]
{
2 a9 D6 e. M9 o; q3 J( m3 X1 p test* p=new test();0 [' z' z( J/ R! O+ j3 M' W# r
p=NULL;5 O0 V1 b* a5 Q/ h
p->hello();
+ K3 k6 [, K8 ^) c) g" p}; X+ J2 I/ ~ V! z& I
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:0 P% f( q, I4 U' J0 u( \, `: Z* V
#include "stdio.h"6 O4 {( j( [2 ?2 D9 Z
class test
; s# l, |: `# g" p{
2 K6 h; @1 L3 E; G# |* o+ Rprivate:
( q' l+ y, |9 O( z4 X& bint i;" z) g5 O" ~/ c& W. n) N1 f, a
public:
, L+ x# e) W' g+ M/ W+ u' t. Etest(){i=1;}' m7 \2 X2 {! c+ v m$ t: b! a# G
void hello(){printf("%d\n",i);}
. x0 |0 q# g& Z2 [+ f; P8 I, U2 p};
# B% M) E% B: }( gvoid main()
0 |* x* E3 F9 @" C1 D{
9 l) H# ^/ c0 o$ ]3 } test* p=new test();
) P( {5 v8 k) bp=NULL;
& v" }) x1 r, i' G7 Np->hello();. g8 D( o2 g. O
}2 r3 s! H w3 W2 Z% y" v8 Y+ U6 B
如果将p=NULL注释掉就无误,就会输出1.
/ g4 q( s* i( h' x0 k( E4 p注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。' R7 i1 _2 `+ E- ?
(1)C++的构造以及析构顺序
H$ h5 h: Q J, ~#include <iostream>
( X8 l) \! I+ Nusing namespace std;
' q9 b6 X! l* |3 @+ p8 e! F# M8 Bclass A" J: a" ?; I& f; L8 O
{
g G3 {2 \1 V! y# Spublic:
. j' ^/ [# n3 [5 mA(){cout<<"A"<<endl;}4 p+ j* Z3 B" m, b) d8 U* Z
~A(){cout<<"~A"<<endl;}
% r5 Z, P0 F# @* X. Z};
9 A) T8 H0 J& yclass B : public A3 D+ f1 ~' U' U0 `2 L
{$ R* f! S( J0 z
public: y' q) c1 o4 G W
B(){cout<<"B"<<endl;}/ I* I! d7 {6 W1 W$ w- S
virtual ~B(){cout<<"~B"<<endl;}* O+ J; k& |/ h- S: ^& B
};
% c6 u/ d% h6 Z1 G7 g# Oclass C : public B
6 z4 R9 p) j4 z9 F+ r{2 G, n% [, |3 I! G3 s W
public:+ @5 H5 F) E8 l) S1 `/ {2 o, H
C(){cout<<"C"<<endl;}
* @: L# h" c8 D9 w" b( O. ]~C(){cout<<"~C"<<endl;}
& K8 g! j! Q( y};+ T0 |8 _, p( H& C# W
5 ^* i' \. Q! p$ O7 q
void main()
. Y' B2 s4 m+ f7 a$ s- u- k{( M: O4 r7 e0 {/ A8 y/ T: `* R! I
- r6 ]4 r' n; G2 c" C' m( M! {
A *a=new A();. P6 Q5 o1 F. v% _1 `0 u: q
B *b=new B();
- n3 u) t( a1 t; K' r C *c=new C();, ~- a' q# ?' w) w9 |: L7 n
A *d=new B();
6 t3 S( `9 q; QA *e=new C();7 y$ e3 b2 A/ Z- [, v+ G3 B
B *f=new C();. ^. w0 U [7 I( {0 V/ F
7 r1 f; X3 ^) J+ [( Y* Z! cdelete a; cout<<"---------------\n";& n" K% m5 q+ @5 z% @2 E
delete b; cout<<"---------------\n";
9 _) b1 @( ~4 o9 ?$ e0 J7 Gdelete c; cout<<"---------------\n";7 J/ V, J$ G T B" @
delete d; cout<<"---------------\n";' N$ H& _" _( ?9 S* ~, A1 s
delete e; cout<<"---------------\n";
1 x, S6 Y" ?, {* b- Q0 U$ O% W9 odelete f; cout<<"---------------\n";. `# K2 l; |* L
}
6 i. M9 G1 P0 Y) e这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。: @" y" I6 _3 u3 B6 L
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。. M7 t2 ~9 o" \: \
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
1 o. k! t2 l' u, p: O: c0 i" S- p(2)面试的诡异题目/ B) t( P- l" e5 `" K1 X1 Y! i
大意就是如果你 test *p=new test[20];
. w5 Y! U2 o3 `* w3 d, P然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)1 W# \1 q% S' {; ~" V/ z4 w
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……+ a( O9 [- c' \; c
( [& |+ z7 [2 k2 D, I$ d
Zz
2 q S/ @& \8 V+ s3 M& ?爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
3 o% B5 a- |/ b2 v+ U" L. o2 S: _5 X上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html
* P7 M {. H% L: a爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html6 e! E2 R& U7 a% C) O, C: }
——" o- J, j3 F' ?; {
百度2011年实习招聘专题" u4 w" D, x6 b9 I8 J, S
http://www.aftjob.com/portal.php?mod=topic&topicid=22/ ^: l# J9 f( u- m
爱立信2011年实习招聘专题0 R# u9 N5 Z! M# o
http://www.aftjob.com/portal.php?mod=topic&topicid=23
# R W( R" G4 \* O9 V) C新浪微博2011年实习生招聘8 o3 D4 |/ z: n( Q4 J8 K3 L. W/ |
http://www.aftjob.com/portal.php?mod=topic&topicid=211 Q8 `: e ?3 F6 ?2 ^- c7 v a
阿凡提招聘:http://job.aftjob.com/job. V# Q" k4 A& ]; R0 N
阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
4 U6 m/ u+ i; q: E( g. ]阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum2 \- ]* m* A2 {* i
阿凡提职位搜索:3 w+ S6 l v' ~5 u$ }5 `
—— |
|