|
|
2009爱立信面试题7 e0 P4 E# I; a
+ P% I; q$ d/ Z& ?. O; o
Zz" D( |7 q& { y1 s# ^, b* u
9 e' ~0 ~0 O0 T( ~$ T+ x) }1 `(1)下面程序运行结果是什么:
1 O1 f0 z4 ?6 F' p- a#include "stdio.h"
+ W, ]% q# Y, j) uclass test
1 C' R( _ s. x" _4 p1 b{
4 |' P. j1 H f" D* F+ _% x* Dpublic:
: L: b, M% e. \test(){}5 s/ u! t9 \/ X4 D) R" P& e- E1 |
void hello(){ printf("hello\n");}/ F" m7 G; @- U# ~2 Y# v
};& D! w3 |3 r6 B4 U6 O5 o, m
void main()
I3 L- Z* B/ w/ F$ B7 ~. p, {{
4 G" u, S3 l7 w8 _2 \0 ]* C, Y test* p=new test();" f4 L4 e# H2 q& h# `4 c
p=NULL;
6 `: M3 e* V# g+ M+ x p->hello();
6 e& A( a- z- C% o2 Q}
5 m0 W9 p7 p2 h8 h事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:* Y% ?7 D! M+ m; F4 h8 b
#include "stdio.h"* l4 j L3 i" | h/ e
class test+ G# v* ~- _" o2 ?4 `3 D- H; ~
{
' f: b! p* R* v8 Qprivate:& }3 Y6 G$ r/ _& C- o c
int i;
5 Y2 P" ?' J+ \+ B2 @8 A( |/ b# upublic:
1 m' B5 h b$ ytest(){i=1;}
1 l3 u' {6 Q" k! Z( T& |# ovoid hello(){printf("%d\n",i);}
6 g& z1 H8 l( z j! J7 s6 _( Z};
1 l# {8 R5 a4 D& R0 M5 L8 H2 Uvoid main(), y% [4 Z5 W6 A1 y$ J/ x
{' U( @/ l* T" n1 F$ D
test* p=new test();, t1 S7 Q4 n8 d5 T) S4 h5 Q% I+ `
p=NULL;
* h1 {1 P) ^. s! E$ q1 _p->hello();! j: K0 h5 H" L1 ]
}
9 k0 F4 p* l# w. l: k6 j3 n如果将p=NULL注释掉就无误,就会输出1.8 y$ C+ D/ G2 B4 d/ ~& i
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
# ]+ P j4 F: @5 _% }(1)C++的构造以及析构顺序
: z# z+ x; M0 d: n3 L8 e#include <iostream>' E: A' }8 X3 K; {% p
using namespace std;# f! P5 b) W. V- Y& l* [0 b6 o, D
class A
, D" N# d4 t8 S) W$ ?/ [! e{
I2 f# h' s( D5 ]3 y% a4 kpublic:
+ y0 I! T1 O% h. B/ a* A- X9 l0 n! }# {& yA(){cout<<"A"<<endl;}7 i5 V2 }+ {7 R P, E2 C
~A(){cout<<"~A"<<endl;}
! Z# P, i1 f+ @};
4 K! ^/ G t9 q; @) Sclass B : public A
" o- O I; y1 R( e{9 b) z& T- n2 l
public:
" Z0 L* @1 @) ]: I# g: r. A; S1 J# `* wB(){cout<<"B"<<endl;}
3 e" z }+ z9 [) ]# Tvirtual ~B(){cout<<"~B"<<endl;}
+ M6 P( M0 R$ x) U7 M5 H: E4 I! m};: q- }0 y) X9 b8 |6 r8 }: Z
class C : public B
3 d+ I8 `2 }' D8 v) Z" R{& ^# J3 o1 J* U/ g( e) ^7 z y ]
public:- a/ J1 F& q+ V( A1 V" o
C(){cout<<"C"<<endl;}
: T1 e; l! q8 q3 ]~C(){cout<<"~C"<<endl;}! _2 m* a7 ~, ~. D1 X
};# b: m# h$ M P9 m! M* B$ [: b
' z/ X4 h0 u6 l. P/ P, ^void main()7 t3 \4 _8 Z2 j! f) |( ~' }$ k8 {0 L
{
! P4 g; I( Z/ m9 ]/ S( J
/ G" E5 S2 I% OA *a=new A();3 j, x% ?( S: R. ]! q/ H" l
B *b=new B();! M9 x6 @, p! K8 d" J' p1 _2 U
C *c=new C();
: Q3 L0 P8 [: f! G& ^; P) ?7 kA *d=new B();# |" t$ K# |: H
A *e=new C();
- Z3 @- s) Z1 L5 _( {7 C4 D) oB *f=new C();/ T- e! n- n- l3 [5 o
1 [1 ?6 y4 K4 Y6 F
delete a; cout<<"---------------\n";. z( Q2 e" H& e9 z( e: j0 j% j" ~
delete b; cout<<"---------------\n";, X1 j4 W9 j/ z0 R0 m# K- l9 j
delete c; cout<<"---------------\n";
7 N8 S( u# V& G2 N3 ydelete d; cout<<"---------------\n";
& o- J! T" o$ V' |# }delete e; cout<<"---------------\n";3 @& q: u2 b& G% p: H2 F
delete f; cout<<"---------------\n";8 O3 F& f) Y E! J) r! Q9 X
}: ]: y3 O! j; Q5 U+ O/ f% d% H0 \( D
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
/ G& m& @( e- H+ u& {' e8 A8 g这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
9 ^6 [0 a/ T }4 F. G3 q其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
7 N6 O( n* ~4 s& c2 x3 x1 U(2)面试的诡异题目
% Y% X; r2 u0 s5 \' |大意就是如果你 test *p=new test[20];
1 t7 U7 z, u ~0 g0 d0 D+ i然后释放的时候用delete p;会怎样?(明显这样做是不对滴……). a' K7 N9 u6 g+ M+ z8 ^
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
2 ]% i7 ?0 m) J7 p. T
B0 E5 n' J8 \2 |; `9 A q! AZz
+ t+ e* s( q( T6 J爱立信(Ericsson)求职俱乐部:http://bbs.aftjob.com/group-298-1.html
7 ]. ~1 k& S; W上海爱立信面经(实习) :http://bbs.aftjob.com/thread-289784-1-1.html# x, K- ?' Z' ?3 Y: z
爱立信(Ericsson)笔经面经汇总:http://bbs.aftjob.com/thread-416668-1-1.html! q' H& S( G Q! E+ p- l
——
. b- @+ J7 f" S- y: N百度2011年实习招聘专题: w& `$ |( M( D* ?, f# R' |
http://www.aftjob.com/portal.php?mod=topic&topicid=221 ~# Y% b+ Y) l( p0 u- e! f& \5 p8 U
爱立信2011年实习招聘专题( I, a+ C* j* w
http://www.aftjob.com/portal.php?mod=topic&topicid=23
. u6 j/ i! a- x+ Y( J; T新浪微博2011年实习生招聘
" o3 ?( B+ O) U1 X L! Zhttp://www.aftjob.com/portal.php?mod=topic&topicid=21
# U$ {" k5 F8 M+ V# s0 ]" X$ Q阿凡提招聘:http://job.aftjob.com/job5 z0 h9 ?' p: _- R8 w$ [* T& i- _$ X
阿凡提热门关键字:http://bbs.aftjob.com/misc.php?mod=tag% \( X, `, I" @
阿凡提内容搜索:http://www.aftjob.com/search.php?mod=forum0 {0 P0 E6 ^: D, q
阿凡提职位搜索:
( u- a/ T/ h9 t—— |
|