|
|
2009爱立信面试题
. A8 M2 ], D/ `9 N" Z1 N
5 S5 }1 _6 X- T/ J( q6 C7 wZz
" Y' ?5 m8 k, ]3 { z5 U; \9 a+ F) I: m/ G: ]- A
(1)下面程序运行结果是什么:" t/ ?: Q+ f% b3 ^% F5 O! j
#include "stdio.h"
. Z0 r4 J9 S/ h. D! z+ Lclass test
1 H1 g. B7 [9 o( z: B{
' ~3 g+ F* t' e' j& e* d7 {/ Jpublic:' U2 j; F! d, c) `, ^& V
test(){}
: @4 o$ Y& P/ L5 Svoid hello(){ printf("hello\n");}
( ]- V0 s6 `% @. @};
3 k y7 W$ ]- bvoid main()% Q( t+ G2 r9 z3 b
{
1 m$ P7 u5 D/ x3 q% M/ E+ @! c2 t test* p=new test();
3 k% T6 y& t* A: C3 b p=NULL;
* n. e" J1 t1 }5 q; j p->hello();
/ v! z9 c/ h0 a5 B}
5 e' F5 L" p% x/ |0 n3 F0 k事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
+ m% Y8 f- G& w: E#include "stdio.h"
$ G1 e9 m, [$ H0 ]* x2 k2 Gclass test
# |/ Q4 e2 W& Z" i' [6 l/ r+ @+ t{# k" @2 b8 B5 w/ W% F x2 A2 j& _
private:. h& M9 D8 C$ W) y1 D' E
int i;, Z, \) W9 H8 \6 \$ {1 z) h
public:- g, `5 Q0 b$ k4 \3 ~ h- M7 G
test(){i=1;}# U: v& }# s: q3 A
void hello(){printf("%d\n",i);}
, Z# S5 e) D0 t! @* h};
0 c3 `- g$ {3 }void main()- E, Y4 l7 ^; J$ y/ m1 |5 G
{. z$ B5 e D) \' i( H
test* p=new test();! a; S3 r1 r9 R( R1 I1 X% o7 G( K
p=NULL;3 c: ?' W4 \1 \+ I
p->hello();8 q8 x4 P2 Q7 Y8 i+ C; J
}
7 C+ ^; W+ g9 _' R" P w如果将p=NULL注释掉就无误,就会输出1.0 E: I6 ^, O- B9 c4 [
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
; P$ m* j6 O3 O, r* F/ E4 o7 e/ A(1)C++的构造以及析构顺序
' C" h, g9 ~$ \9 l#include <iostream>
$ h j) d5 k( Pusing namespace std;
# r2 Z' F& Z% O7 E8 eclass A' V+ C( V1 ~3 z/ O
{
* ?( o6 T. d* q# t6 Npublic:) o' P y! P! L7 {
A(){cout<<"A"<<endl;}$ O2 |( E z) K' O- Z
~A(){cout<<"~A"<<endl;}
! m4 b! H4 o( w _& b- B4 ~* n$ f};% J2 l! W# J- A) t
class B : public A
s' V* c- e, N% `, p5 h{
' r7 Y9 Y: ] a" Ipublic:
% y [. a4 W" v+ F7 ^ x# E/ KB(){cout<<"B"<<endl;}! ^8 }" _% \$ t9 V( c; b! a+ [
virtual ~B(){cout<<"~B"<<endl;}
7 {2 ~$ g! `# u% \# X/ H};7 Y, U2 l% `' I2 G* S$ f, e1 M2 Q
class C : public B. {) ` r& z6 U1 t X7 @
{
3 R: i) c# g# L. Ppublic:
$ t% B* `5 C8 k& @- xC(){cout<<"C"<<endl;}6 {6 @" |0 `. B' m, T u
~C(){cout<<"~C"<<endl;}% }8 d6 `$ Y0 ?: Q. N) `* r
};
8 R* i7 Z4 P' @! s% G$ G9 a5 \0 J% m5 h' H; Z* J, L* b2 e
void main()
6 p6 s5 ~3 M' ]# x; x{
8 |" o i) z7 e1 `
. d' P% k/ G" i0 `7 J6 |A *a=new A();+ d0 ~8 O" l& B ]& T
B *b=new B(); x3 e' _, I- _7 s/ m
C *c=new C();
$ r! A- d0 y9 D! E% b2 H/ PA *d=new B();% @7 J7 G# I" V" `
A *e=new C();
; f2 q" w& `4 c0 [1 TB *f=new C();
/ X$ H! c& ^8 ]% K: e# k3 p5 R; {$ F: i9 f) M" B+ q! I
delete a; cout<<"---------------\n";
) B) j" ^( b( f4 F+ u# Ydelete b; cout<<"---------------\n";
5 [+ A( {* C' C- Odelete c; cout<<"---------------\n";; p# [$ T( I# k+ \
delete d; cout<<"---------------\n";
+ `* V' W: z$ ~, F6 d! ?delete e; cout<<"---------------\n";
+ B2 o% ^' M) { X1 H3 _delete f; cout<<"---------------\n";6 g* ]: V5 `, Z# Q& y
}' i X3 x% \7 a C# _1 g
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
1 z- N, C- X1 \' A, ~# V) p! \! Z这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。6 v" u5 Y2 H8 ?0 P0 ]% d$ J+ W
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
8 o( b$ X* Q, }4 P3 E- Y9 Y(2)面试的诡异题目4 `5 k) C) v1 ?0 \
大意就是如果你 test *p=new test[20];
! }8 M9 e: S. B" i& @0 |; N! c$ v然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
- i; o" j% B$ b: A$ \7 i- U1 q/ @答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……% u5 G( j5 F3 _ ^
$ d5 ?7 H; e% F% n. f: iZz
" Q7 k& W3 ?2 u6 z3 w4 ^& k# Q爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
1 k0 f! V T) }! B8 p5 b5 ~上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html7 v. c0 Y! x- t s, o1 |5 R
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
8 F( \& Q% m" s! ^3 a/ E3 Z' R0 o——
- [( P: h4 R( w0 n* B/ |百度2011年实习招聘专题
) B i# P& E1 N! Hhttp://www.aftjob.com/portal.php?mod=topic&topicid=22
, v5 K6 L7 F$ V5 S. {爱立信2011年实习招聘专题
1 ]5 u! z) h* |# C C b8 khttp://www.aftjob.com/portal.php?mod=topic&topicid=23
: p' ~0 I# ^! I) r! A新浪微博2011年实习生招聘
/ C4 o5 k& Y1 J# Vhttp://www.aftjob.com/portal.php?mod=topic&topicid=216 B* i4 I! r# U& f# {5 T
阿凡提招聘:http://job.aftjob.com/job
7 R4 Y( h F2 [$ D$ c; H阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag
) P5 `2 T+ g- v( n0 ^+ T& Y0 ?$ O阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum5 W a9 b7 N* |+ E" q$ q
阿凡提职位搜索:$ E2 P* H: T2 u! I
—— |
|