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

第七章面试例题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;
}


 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值