找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1067|回复: 0

[面筋] 2009爱立信面试题

[复制链接]
发表于 2011-7-5 10:42 | 显示全部楼层 |阅读模式
2009爱立信面试题7 ~- Y0 v$ _& d! k" g
# `/ v4 o* c& A  o( R, P' j5 _' A
Zz. I1 _+ }# s7 W" x
% f* N$ O6 |9 q* ~4 I
(1)下面程序运行结果是什么:
) f8 ?% e& A+ ~2 q#include "stdio.h"6 f# w* g% d& Z. {  m
class test( N: a. O2 \0 B* n+ T
{. }& }& R- j! W
public:& V3 d5 o7 F" j
test(){}  K1 J/ O# [; `6 U* n4 ]- u
void hello(){ printf("hello\n");}0 x/ H4 m" J( l) o9 r
};
2 W% ^0 ~8 b8 v. Cvoid main()3 {  u( R" ?0 d1 M1 Z8 ]
{
" t$ @8 X3 M2 W, @0 P. o    test* p=new test();# R0 a& U- A6 Z! S
    p=NULL;
1 {4 V: F. [: V2 C$ h* G    p->hello();6 z, a( x) o  `& D$ J6 z* d
}  Q/ B8 @- }! x
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
2 G! H% j) J0 t#include "stdio.h"
- a# K- ^% z3 u, q  [% N! f2 yclass test
0 R) H4 [9 L6 C, ?{5 C3 |7 V5 \% Z  \4 G2 s: `# B
private:
( u$ h5 L9 Z" [% a- Mint i;4 y+ x6 u. X& O( s' P
public:
  Z( f+ b/ [7 F* U* Qtest(){i=1;}" u! d7 @; c# ^$ ~
void hello(){printf("%d\n",i);}
8 ~3 ?; u! R. l* y# b7 ?  q};
& V, j3 k/ F6 \$ B& g$ cvoid main()5 u8 n9 Q  |7 [9 p! i  Q# y
{7 w0 c4 w" ~, M1 Y/ m$ z
    test* p=new test();9 o% X( s9 }+ t9 E* q9 r1 E2 r
p=NULL;' s* ^1 m) H- F! ~& M* t! ]
p->hello();$ w; N7 G" F* q- {& G
}9 l3 m1 Q; S; j7 m5 l3 u
如果将p=NULL注释掉就无误,就会输出1.
+ Z  V* J' N8 T2 Z: O3 F& L注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。, d/ b5 N  i3 ~- J: @2 Q, c, V- ?
(1)C++的构造以及析构顺序' g# L) y- o' H. N# G) g8 o4 R
#include <iostream>& V2 ]; e2 T8 q) Q8 F8 T
using namespace std;
. Y1 u6 t& D" U; @* @class A+ ]! F2 m$ E1 q+ q. z5 b2 |
{
  Y& `. ~3 }" l$ [2 U/ Apublic:
3 L+ T  n: G  C8 \! ^3 n  @2 lA(){cout<<"A"<<endl;}8 v2 Q' \5 t* L6 N7 Z* X
~A(){cout<<"~A"<<endl;}6 t8 Z8 E1 ~5 j  s/ P
};* \9 j9 \' g" D3 }% P8 N4 m
class B : public A" |( L! R' J. i0 C8 Q! {2 x6 w
{
6 w. z! w- d: A' a; c) jpublic:, l: j. w2 g. X+ x6 A& {
B(){cout<<"B"<<endl;}1 t( m* f, U' ~& ~& Z! }
virtual ~B(){cout<<"~B"<<endl;}
% a- ^' z* `# z};
' k. n, e1 `$ G& i# Aclass C : public B4 A9 E' z1 b8 J
{
, k9 W0 y5 b2 z$ Q0 ppublic:% {4 ^: c$ Q: Q; Y% Y' \3 J  o
C(){cout<<"C"<<endl;}; l. e8 q+ u( v
~C(){cout<<"~C"<<endl;}2 B% G' Y) P1 O; M+ w8 ?$ [6 a6 E
};
& _1 o) K& [% U3 Z  b( C
, D# l" }( m" L% zvoid main(), y5 M% I+ L$ B+ h/ Q
{% y( l# y6 X& p$ o$ S$ O
- t3 d8 K+ L: f
A *a=new A();
4 L( f& Y9 J. j7 z8 R( l9 ?B *b=new B();
+ z2 w  W+ p9 H3 {, Q% e  C *c=new C();
4 X% s0 q5 X8 s7 @# s, t, }! lA *d=new B();; U) N8 Z; i2 G4 X# p1 N
A *e=new C();  V4 V8 ]1 v; k2 Z5 S
B *f=new C();$ m" c6 S  \( k, Q' p% ]

, Y3 @! V/ b( A- T4 Y3 Edelete a; cout<<"---------------\n";
* d0 @% h1 n+ A2 e( ]8 T) Vdelete b;   cout<<"---------------\n";
# }1 ], Z7 {% u) }1 y& odelete c;   cout<<"---------------\n";7 S! q8 [; b0 _: s6 w! v5 h
delete d;   cout<<"---------------\n";
3 V# H0 ^* w" n, z7 a  Kdelete e;   cout<<"---------------\n";
0 X8 `$ [8 p, E! Idelete f;   cout<<"---------------\n";) o! C# G4 s# A; Q) g' X; d4 @
}7 T* Q$ W, T; t% B" Q( E8 t
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
; m1 N' c6 b6 E. O4 d& C这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
) l+ H( m! S: J: d1 q7 a; v# \其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
3 l' g; D$ Z3 z  P(2)面试的诡异题目
) d7 X& I/ q! o: m; D大意就是如果你 test *p=new test[20];
# Q; |) i1 P. {$ H然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)! b. [. [( ^: G" x! Q- x' A% N% Y7 H& Y
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……! Q6 N' F& }! ^
7 P$ s: x  B- u) \* F4 S
Zz+ M8 s/ S5 w$ j: C1 Y- e% W+ I+ l) a
爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html% L3 B( s7 @! j0 ^7 a
上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html9 g9 i9 n! {4 S7 W* k5 q. S
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
1 a! {! H- H1 |8 m: T——9 a5 ?# ~2 A4 ?' S' V
百度2011年实习招聘专题1 Y- |* Q% C8 }+ b6 ?  J
http://www.aftjob.com/portal.php?mod=topic&topicid=22" C+ o$ D0 i+ a. B; I  }: U' L+ S
爱立信2011年实习招聘专题
( I6 y8 Q2 S  ]' C- }& Z7 r  thttp://www.aftjob.com/portal.php?mod=topic&topicid=23
/ C+ Z  O$ `) [) p4 b新浪微博2011年实习生招聘
- a5 q) ~* R8 o# }http://www.aftjob.com/portal.php?mod=topic&topicid=218 Q9 X, E/ Q6 L( `
阿凡提招聘http://job.aftjob.com/job
6 R5 [- l4 Q! \) x+ O+ |阿凡提热门关键字http://bbs.aftjob.com/misc.php?mod=tag$ b* @4 q; _3 H
阿凡提内容搜索http://www.aftjob.com/search.php?mod=forum/ b5 w+ U1 Y' _8 s- j6 |% B. ~- q
阿凡提职位搜索) ^% g6 Z7 x$ z
——
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-11-21 15:36

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表