2009爱立信面试题
Zz
(1)下面程序运行结果是什么:
#include "stdio.h"
class test
{
public:
test(){}
void hello(){ printf("hello\n");}
};
void main()
{
test* p=new test();
p=NULL;
p->hello();
}
事实是输出了hello,虽然在调用p->hello();之前已经给p赋值为NULL了(即0值),但是p依然可以调用test类的函数。我对此的解释是只要是test类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是test类型的指针就能调用test的成员函数,前提是函数里没有涉及到成员变量。比如下面的代码编译无误但运行会报错:
#include "stdio.h"
class test
{
private:
int i;
public:
test(){i=1;}
void hello(){printf("%d\n",i);}
};
void main()
{
test* p=new test();
p=NULL;
p->hello();
}
如果将p=NULL注释掉就无误,就会输出1.
注意:另外上面两个例子中如果把p=NULL换成delete p;也会有相似地效果,第一个依然输出hello,第二个输出个随机值(不报错)。大家不妨调试看看。
(1)C++的构造以及析构顺序
#include <iostream>
using namespace std;
class A
{
public:
A(){cout<<"A"<<endl;}
~A(){cout<<"~A"<<endl;}
};
class B : public A
{
public:
B(){cout<<"B"<<endl;}
virtual ~B(){cout<<"~B"<<endl;}
};
class C : public B
{
public:
C(){cout<<"C"<<endl;}
~C(){cout<<"~C"<<endl;}
};
void main()
{
A *a=new A();
B *b=new B();
C *c=new C();
A *d=new B();
A *e=new C();
B *f=new C();
delete a; cout<<"---------------\n";
delete b; cout<<"---------------\n";
delete c; cout<<"---------------\n";
delete d; cout<<"---------------\n";
delete e; cout<<"---------------\n";
delete f; cout<<"---------------\n";
}
这个代码在Dev C++下顺利通过,在VC6下有点问题,大家自己看结果。
这里要注意几点的是:首先,A*类型的指针不能赋给B*类型指针(强制转换也不行),不过有两个例外,一个是void*指针,另一个是当A和B有继承关系时。
其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)
(2)面试的诡异题目
大意就是如果你 test *p=new test[20];
然后释放的时候用delete p;会怎样?(明显这样做是不对滴……)
答复是会调用p[0]的析构函数,然后p[1]到p[19]没人管。另外还问是否造成内存泄露……
Zz
爱立信(Ericsson)求职俱乐部:
http://bbs.aftjob.com/group-298-1.html上海爱立信面经(实习) :
http://bbs.aftjob.com/thread-289784-1-1.html爱立信(Ericsson)笔经面经汇总:
http://bbs.aftjob.com/thread-416668-1-1.html——
百度2011年实习招聘专题
http://www.aftjob.com/portal.php?mod=topic&topicid=22
爱立信2011年实习招聘专题
http://www.aftjob.com/portal.php?mod=topic&topicid=23
新浪微博2011年实习生招聘
http://www.aftjob.com/portal.php?mod=topic&topicid=21
阿凡提招聘:
http://job.aftjob.com/job阿凡提热门关键字:
http://bbs.aftjob.com/misc.php?mod=tag阿凡提内容搜索:
http://www.aftjob.com/search.php?mod=forum阿凡提职位搜索:
——
--
FROM 219.236.30.*