|
|
2009爱立信面试题
* @# d$ O4 e4 B R' A5 q/ u
" s/ K1 W' t4 }2 rZz
) X6 U, a% L1 B$ O) U5 m$ r% u8 J( A; E5 K5 H
(1)下面程序运行结果是什么:
) C2 _( H; M# ~1 U7 d#include "stdio.h"
9 q4 y) R# S+ R# D+ p0 tclass test" b2 s2 I+ M. g% x3 `
{
0 X4 B9 V* Z1 h7 p% {+ Q' ppublic:
: w4 i3 u4 F9 K% p! j0 ?test(){}2 t; X# O* a) V" [/ Y# z1 S
void hello(){ printf("hello\n");}
7 C, x& N1 A$ v0 c};9 A8 ], @+ i" t: I- G! z
void main()
! ~0 b m/ w3 M+ H5 z7 H* ]{! k t4 ?- v. A- }' L8 ^, C, k
test* p=new test();
E2 R D% i/ H9 m p=NULL;
) _2 |* |: n7 o( u. H p->hello();
1 e% U: o% p+ I. I+ B}
" z2 I6 S. W) ^5 O: u5 m7 _% j: t3 F事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
6 L9 J3 f% Q$ g, `0 k! l9 U#include "stdio.h"9 v7 P [8 L$ I% H9 k& v! t e6 f* c9 u- _
class test
1 V3 L4 _: _5 H: D! M{ @5 ^ J- \3 _% L/ I: r
private:* @8 p6 f+ |. `! a! b9 d' C
int i;
* }* x4 V# V" S8 t% Q/ xpublic:
' [, R% h; `8 ~: G1 Ptest(){i=1;}
8 y$ ]( V/ w% u- ~1 Z! Avoid hello(){printf("%d\n",i);}
. s' D7 }/ ^* W* y9 |1 t) h, {};9 [( m3 Q) e$ r' N, a6 q
void main()8 W6 r+ J, z2 T) b6 \! a
{
4 c$ J5 F' W+ r+ r" S# E test* p=new test();
4 w$ q' d: l4 Q, {; q: V) c. j3 Z$ pp=NULL;
) ^. N H/ f0 }& _8 ]9 y- p' A% m4 Vp->hello();/ S" n9 O1 `9 j Q0 Y9 |) m0 G. J
}5 |: k. a- F6 ~9 K \. a. U" ]
如果将p=NULL注释掉就无误,就会输出1.8 H/ v& B% h' O" b; l
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。% P- n& P6 v; `6 S' _
(1)C++的构造以及析构顺序
: @& o! y3 `& W* w#include <iostream># Z5 B5 g2 d. N( t% d
using namespace std;
1 G: _& p/ A' }8 jclass A b5 ^" f3 }. P: Y" n6 I9 B
{
Z2 X) \/ F- P) V' c8 kpublic:3 b# } j/ {* b
A(){cout<<"A"<<endl;}0 z( Q. N4 p$ D6 t$ o
~A(){cout<<"~A"<<endl;}
4 ]: W2 |% q; D$ A! A9 u- q( |};
) L3 _3 M8 _: _class B : public A
3 v6 K$ f D4 }& t( q2 w1 E* x{
$ l4 b( C, E9 K( v" M3 o: upublic:
& }# Q1 P$ p: Q6 {( n. R" OB(){cout<<"B"<<endl;}/ ?7 V6 b3 l! S+ B4 u: x# [
virtual ~B(){cout<<"~B"<<endl;}
' g# G$ P0 O, h& r/ r( P+ g};5 Z, w" _1 y# g+ M6 M
class C : public B
- M% F: w: U/ D1 A) S S" ?5 r' f{
: r+ T# o: @4 Hpublic:: C- k1 T% K3 A
C(){cout<<"C"<<endl;}
& a7 W7 D/ D5 M/ f& Z3 B% F4 i( E~C(){cout<<"~C"<<endl;}
; d! W" m$ Z7 I" K, M0 ~0 I8 M4 b$ ~};' [( j! D$ Z$ j7 o1 ^) g
$ o9 I9 R+ Y. n0 L9 X2 G( D
void main(), T. {9 q4 m/ V' L" Q$ |- ^0 J q
{
; U( z- C7 L2 u3 p$ `* I" ]; M2 P4 u4 s, s/ ~
A *a=new A();
# C5 e1 f6 X" H( fB *b=new B();
3 z8 r4 Y8 P6 V' P( E" U3 W2 ~' f/ {5 G C *c=new C();
& N5 n' N% J1 g! LA *d=new B();
$ Q, h* }8 F- TA *e=new C();
1 K) g- t# @) p- R- @# s v! kB *f=new C();
{0 U% m% x; N' m! Y. p
) h F3 ?( D* l4 S; R) n; S+ H/ m7 Bdelete a; cout<<"---------------\n";9 B: }9 R/ o9 i: D3 ?( p& Z# {1 j
delete b; cout<<"---------------\n";+ f, g8 G( H9 ~$ O5 S# x
delete c; cout<<"---------------\n";0 R- Q7 H3 G3 q1 Y
delete d; cout<<"---------------\n";
4 W* ~3 x/ i. |3 e, L/ W! y! ydelete e; cout<<"---------------\n";
' _0 ~7 \! C ]$ C, Udelete f; cout<<"---------------\n";( j1 Y( B* I. v5 |) \9 H' G
}8 e5 P3 m* w6 x# j! B1 L4 e7 m0 g
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
2 v- L; w6 t& V: }! C7 Y* V这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
) j' c" b6 R6 M% e& j* d* y6 _其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
$ |# [7 G# \" u, c" [7 _(2)面试的诡异题目' p7 ?, _4 i- W! `
大意就是如果你 test *p=new test[20];
: S4 ]2 Y7 x- ]& D% f然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)6 q& w; `. d; \$ B, w0 W( U
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
* N. h) o2 `/ ~) `/ B3 g$ p6 e+ o' o) j2 q/ M; i
Zz
" O% A: g8 h' N5 p3 A爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html. S5 x! H( T: L- l# G& K0 S
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html
( \$ D# i' Z' _1 [* }; ]爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html& b4 j5 s8 b; G7 Q+ g* S* I
——9 ^ X$ p8 q; Q: r% M
百度2011年实习招聘专题
5 e5 C6 c% \& T# a0 vhttp://www.aftjob.com/portal.php?mod=topic&topicid=22; B, h* W8 \ F) I8 P1 W9 U
爱立信2011年实习招聘专题
% f# n6 }, O* ]( s- [http://www.aftjob.com/portal.php?mod=topic&topicid=232 m4 |( m+ U6 l3 ]5 M9 p5 {
新浪微博2011年实习生招聘
# v+ @1 z% Y& G8 {. {6 B+ ~http://www.aftjob.com/portal.php?mod=topic&topicid=21; d2 t/ F( g+ r' j9 y
阿凡提招聘:http://job.aftjob.com/job
7 z& l1 b, }- e: x9 S( J K阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag# D7 N* X) c+ U$ j7 l/ q9 C
阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum6 [6 @4 k# U* j4 B1 X: g
阿凡提职位搜索:
% R6 h' H6 b* e1 P% {) C% x2 \—— |
|