找回密码
 加入后院

QQ登录

只需一步,快速开始

搜索
查看: 1017|回复: 0

[面筋] 2009爱立信面试题

[复制链接]
发表于 2011-10-19 18:17 | 显示全部楼层 |阅读模式
2009爱立信面试题
6 I& `2 `) I$ N# C5 G9 E( C
; {- `( H0 a, {Zz
( X" J0 k+ K0 m! K/ U
' F6 w$ D) v' n5 f  ^, l(1)下面程序运行结果是什么:
4 I9 R) l7 H$ O#include "stdio.h"
: Y' r# e/ W; U6 m( ~class test6 R* h1 \; Q- c9 I1 ]$ S
{
( R& \% p0 P, _# U$ bpublic:1 R' p( ~! M% Y
test(){}$ g9 U# O9 k+ \- v6 ~
void hello(){ printf("hello\n");}
$ C6 Z; V# a5 f3 q9 I. V9 a};
; K# k# H$ k) ~% p$ {, ]3 Pvoid main()( x( y  \. A( a0 f: e( o
{. p0 F/ m( G- Y% g0 A) |, x
    test* p=new test();' S. F  J" ~7 `; W% I
    p=NULL;2 f) {$ b3 b' H! |  o, x# \$ Q
    p->hello();; V" n( V/ Y& V: {) S
}
& U) }( x' q) e4 `! E6 C事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
7 F2 W" K  J' @$ V3 t6 Q; e2 S( I6 D# |/ t#include "stdio.h"
% G1 O% t9 W8 E1 s& \' [class test
0 h* C' w6 U; |; R! r{' y+ z; k( u3 ]  i) y* j
private:
; @+ D& l% m. V1 _8 E- kint i;
( n9 t4 d, z, U3 l! j& Epublic:
; S( o1 E- {7 n% w* n+ {test(){i=1;}! |! n# u' S2 ^1 d, `7 H
void hello(){printf("%d\n",i);}
; R2 ?1 J: k7 ?4 ^( A5 q};5 d, M2 |" k# K& v; Y* [
void main()
' h$ Y0 y0 f! r$ W% j{6 h% b! m8 D5 N; D) a" \. [
    test* p=new test();. Z- |$ y$ f  z( s
p=NULL;# ]) T& X+ _) s, v/ V
p->hello();
, A" ]+ E! P$ x6 E& c; S}) M; P! A6 N4 D5 N$ g6 h
如果将p=NULL注释掉就无误,就会输出1.
7 u$ ~/ z0 [5 y2 p* I注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
& j( e5 L9 c0 d0 ?5 d0 J(1)C++的构造以及析构顺序' s) C& y. J5 B# W, M# F5 [
#include <iostream>  s8 i  ?- t$ o. I& _" O  w' W, @
using namespace std;4 L; G) @8 b- V, s0 m- a+ h
class A
& G+ R+ ^3 h' J. _  u" y  W9 m4 I; w{
) d4 Z* e# |+ ?. jpublic:  D9 o: C2 {- H8 |
A(){cout<<"A"<<endl;}
. n2 j+ N* z2 _2 j  L~A(){cout<<"~A"<<endl;}# a0 Q4 S0 {- Y
};
. D6 Q6 y0 f6 e3 Xclass B : public A
+ c6 O+ ~+ s/ O% Z" x{6 a7 l% j$ W, m$ l$ w+ O) Y$ ]
public:
! m) }& S3 j+ b: FB(){cout<<"B"<<endl;}9 j# K- E5 p1 c% R2 R+ J
virtual ~B(){cout<<"~B"<<endl;}
$ R9 u6 E, \' l};
* K( J+ K0 }0 V% A! J: yclass C : public B
. m' k+ C; Q  J1 z+ N2 w* |/ |6 N( F{
7 X6 Q9 k$ {' C" M( s# epublic:
0 t2 I4 _0 @9 `( \- V) M; iC(){cout<<"C"<<endl;}
' `: Z5 X! b5 G+ B' w  y0 o  C3 c~C(){cout<<"~C"<<endl;}
, m" W; ~0 g; S$ k3 s. s( f};  `' d8 Z/ e6 b' P7 p
+ S2 X7 Y: g0 y$ {& Q
void main()
# f8 x- n: [! }1 K{
* b& N7 k+ }  r" @% E1 D  ~: V$ J% p0 B7 f+ C9 P1 v, y4 f
A *a=new A();
5 q, k- B( K5 A; N& ~B *b=new B();
2 l+ [* \: H- O$ p  M  C *c=new C();
" r) A1 [7 C8 z( iA *d=new B();
' O" A* c* i: C( H- a7 VA *e=new C();
# |2 b/ Q" N" N$ e. hB *f=new C();3 A6 Y' A, e. A7 ]
9 `/ t& _; ~+ y2 D, x( z- B
delete a; cout<<"---------------\n";- m) ]4 A2 Q# Q- z
delete b;   cout<<"---------------\n";( A( M+ a! S) M) |8 i% [
delete c;   cout<<"---------------\n";  N7 r7 b( g0 V; Q
delete d;   cout<<"---------------\n";
* z- M1 A/ e$ D2 j1 s6 x' vdelete e;   cout<<"---------------\n";( p: {( a0 a5 k- {5 J
delete f;   cout<<"---------------\n";
5 k8 x3 m% }+ \/ I$ {- G0 H- E, ?}
& I+ Q3 _8 R+ b% D$ y, B4 `8 B这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。& ]$ n6 }2 j8 H9 T3 I4 k
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
" V; H; l2 b) A$ D. Y0 A+ ?其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
2 ]4 K8 J% T. }(2)面试的诡异题目0 d0 U" @: }1 }2 l- G
大意就是如果你 test *p=new test[20];
& T" M( ?- |- h+ \% L) y# \2 d3 G然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
1 O* e1 [3 t! j( H* W答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
2 r0 f' a' D6 w
& ?. _; j; ?  v( XZz
: R9 \# t& e6 Y爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html( R3 ]0 p. I/ u# z* m
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html
, {$ u$ i1 {: O* F( W——
5 H  L# g( I) X' h: e* Q查看名企2012校园招聘最新进度,请关注阿凡提求职公共日历:http://www.aftjob.com/home.php?mod=space&do=calendar
您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

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

GMT+8, 2026-9-22 17:31

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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