您的位置:首页 > 职场人生

程序员面试宝典部分面试题

2013-08-16 22:51 127 查看
第七章面试例题5

#include<iostream>
using namespace std;
class A
{
public:
A(){m_a=1;m_b=2;}
~A(){}
private:
int m_a;
int m_b;
};
class B
{
public:
B(){m_c=3;}
~B(){}
void fun(){printf("%d\n",m_c);}
private:
int m_c;
};
void main()
{
A a;
B*pb=(B*)(&a);
pb->fun();
}


输出结果为1

分析:B*pb=(B*)(&a)强制把a地址内容看成是一个B类的对象,pb指向的是a类的内存空间:pb->fun();正常情况下,B类只有一个元素m_c,A类的内存空间中存放第一个元素的位置是m_a,pb指向的是对象的内存首地址,当pb->fun()调用B::fun()来打印m_c时,编译器对m_c对它的认识就是m_c距离对象的偏移量0,于是打印了对象A首地址的编译量的变量值,所以输出为1。

第十一章11.3 面试例题2

下面程序的结果是什么?

#include<iostream>
using namespace std;
class A
{
char k[3];
public:
virtual void aa(){}
};
class B:public virtual A
{
char i[3];
public:
virtual void bb(){}
};
class C:public virtual B
{
char j[3];
public:
virtual void cc(){}
};
int main()
{
cout<<"sizeof(A)"<<sizeof(A)<<endl;
cout<<"sizeof(B)"<<sizeof(B)<<endl;
cout<<"sizeof(C)"<<sizeof(C)<<endl;
return 0;
}


在VC++6.0:

sizeof(A):8

sizeof(B):20

sizeof(C):32

在gcc中:

sizeof(A):8

sizeof(B):16

sizeof(C):24

分析:对于class A来说,由于有个虚函数,那么必须有一个对应的虚函数表来记录对应的函数入口地址,所以需要一个虚指针,大小为4,。由于类中有char k[3],数据对齐后大小为4,所以总共大小为8,这在gcc和VC++6.0中是一样的。

对于class B来说,在gcc中:由于它虚继承了A所以要加入一个虚类指针,大小为4,然后继承A类的char k[3]和自己成员char j[3]数据对齐后和为8,外加自己的虚函数指针大小为4,所以总和为16。但是在VC++6.0中:同样有一个虚类指针,大小为4,char j[3]数据对齐后为4,虚函数指针为4,然后加上sizeof(A)=8,所以总和为4+4+4+8=20。实际上比gcc多出的4是多计算了一个A类的虚函数指针,这是VC和gcc的区别所在。

对于class C来说,同理在gcc中:虚继承A虚继承B,两个虚类指针为8,外加三个char型数组为12,虚函数指针4,总共为24。在VC中:虚类指针为4,虚函数指针为4,char i[3]为4,sizeof(B)=20,所以20+4+4+4=32,多计算了A和B两个的虚函数指针。

第十四章14.5面试例题1

求一个字符串中连续出现次数最多的字串,请给出分析和代码。

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

pair<int,string> fun(const string &str)
{
vector<string> substrs;
int maxcount =1,count =1;
string substr;
int i,len=str.length();
for(i=0;i<len;++i)
{
substrs.push_back(str.substr(i,len-i));
}
copy(substrs.begin(),substrs.end(),ostream_iterator<string>(cout,"\n"));
for(i=0;i<len;i++)
{
for(int j=i+1;j<len;++j)
{
count=1;
if(substrs[i].substr(0,j-i)==substrs[j].substr(0,j-i))
{
count++;
for(int k=j+(j-i);k<len;k+=(j-i))
{
if(substrs[i].substr(0,j-i)==substrs[k].substr(0,j-i))
++count;
else
break;
}
if(count>maxcount)
{
maxcount = count;
substr=substrs[i].substr(0,j-i);
//cout<<i<<endl<<j<<endl;
}
}
}
}
return make_pair(maxcount,substr);
}
int main()
{
pair<int,string> rs;
string str="abcbcbcabc";
rs=fun(str);
cout<<rs.second<<":"<<rs.first<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: