大家说我这套面试题做得怎么样,考官说我做得一踏糊涂.大家说说!有点郁闷.

cgsw12345 2005-05-07 12:58:09
1. 简述C++虚拟析构函数的作用。试举例说明。
虚拟析构函数的作用是确保实例化的对象能够调用自己类实现的虚构函数而被完整的虚构(释放).当通过基类的指针或引用去删除派生类的对象,而基类又没有虚析构函数时,结果将是不可确定的,派生类的析构函数永远不会被调用.如:
class base
{
public:
virtual ~base()//注:一个虚拟析构函数
{
cerr << "base destructors" <<endl;
}
};
class dervid: public base
{
public:
~ dervid()
{
cerr << " dervid destructors" << endl;
//释放dervid时其它需要的操作
}
};
int main()
{
base* pb = new dervid ();
//……
delete pb; //此时若基类没的虚构函数不是虚的则派生类的虚构函数(~dervid)则不会//被调用,相应释放dervid时其它需要的操作没有被执行.
//……
return 0;
}
另,当我们不打算以类作为基类时,最好不要使虚拟析构函数因为会为类对象增加一个vptr的内存开销.
2 class Integer
{
public:
Integer(int _n){
cout<<"Construction"<<endl;
n = _n;
};
Integer(Integer& Copy)
{
cout<<"Copy Construction"<<endl;
n = Copy.n;
};
Integer operator = (Integer& Int)
{
cout<< "operator = "<<endl;
n = Int.n;
};
~Integer(){
cout<< "Deconstruction"<<endl;
};
private:
int n;
};
Integer ReturnInteger()
{
Integer Int(2); return Int;
}
void Test()
{
Integer Int(0);
Int = ReturnInteger();
}
请顺序写出执行Test()函数后程序的输出:

Construction //以0为参数构造Int
Construction //以2为参数构造ReturnInteger中的Int
Copy Construction //函数返回时调用拷贝构造函数
Deconstruction //虚构ReturnInteger中以2为参数的Int
operator = //调用operator将_result中n的值赋给Int
Deconstruction //虚构_resul
Deconstruction //虚构以0为参数的Int
//注:编译器会对ReturnInteger()函数作NRV优化
Void ReturnInteger(Integer& _result)
{
Integer Int(2);//调用构造函数产生Int
_result. Integer:: Integer(Int)//以Int为参数调用拷贝构造函数.
return;
}

3. class Base
{
public:
void FuncA(void);
virtual BOOL FuncB(int &x) {x--;}
long m_Data1;
long m_Data2;
};
class DivClass : public Base
{
public:
BOOL FuncB(int &x){ x++;}
virtual FuncC(void);
long m_Data3;
};
void FuncC(void)
{
Base *pBase;
int x = 0;
pBase = new DivClass;
x = sizeof(DivClass);//此时x = 16
pBase-> FuncB(x); //因为FuncB是虚函数,调用DivClass类的FuncB 得x = 17
}
请问x = __17___(32机器)
注:x的大小应该和机器以及编译器有关,32机器与64位机器会有完全不同的结果,以下说明假设为32位操作系统上:基类DivClass的大小是基类的两个long各占4个字节,因为类有虚函数所以会增加一个4个字节的vptr指向相应的vtable,所以基类的大小是12个字节,派生类的大小则需要加上自己的非静态成员long占4个字节,所以派生类的大小为16个字.
另因为在32系统上以4个字节为调整码,但DivClass和Base 的大小都是4的倍数,所以不需在调整.
4 请指出如下程序的问题
#pragma pack(4)
struct DATA_REPORT
{
UC DataLinkNo;
US Length;
UC DataType;
UC DataValue[20];
};
#define DATA_TEST 10
struct DATA_REPORT &FuncA(void)
{
struct DATA_REPORT DataReport;
DataReport.Length = 24;
DataReport.DataType = DATA_TEST;
strcpy( DataReport. DataValue, “FuncA Send Data For Test! Data length is 20”);
return DataReport; //此处返回函数局部对象的引用,因为在函数调用时局部对象将被//收回,所以函数外将得到的只是没有用的信息.
}

BOOL FuncB(struct DATA_REPORT &DataReport)
{
CHAR tmpData[18];//18个字节会导致拷贝出界,但不会出错.
memcpy(tmpData, DataReport.DataValue, DataValue.Length);
return TRUE; //些函数总是返回ture,应该没有什么实际的意义.
}
void FuncC(void)
{
struct DATA_REPORT DataReport;
DataReport=FuncA();//假设FuncA()返回一个地址那么接收的将要是一指针或引用
//所以上面一句应改为struct DATA_REPORT* DataReport;
FuncB(DataReport);
}

5. 实现内存拷贝函数memcpy(void* pdest, const void * psour, int size ) 要求考虑地址重叠的情况
void *memcpy (void * pdest, const void * psour, int size)
{
assert((pdest!= NULL) && (psour!= NULL));
char *pb = (char*) pdest;
char *ps = (char*) psour;
char *temp = new char[size];//由于考虑地址重叠将来源数据暂存起来
char *dt = temp;
for (int i = 0; i < size; ++i) temp[i] = ps [i];//将来源数据拷贝到新申请的内存中
while (i-- > 0)
*( pb ++) = *(temp++);//拷贝到目的地
delete[] dt;//释放分配的地址空间.
return pdest;
}

6. struct List{
struct List *next;
ELEMENT e;
};
struct List *head, *tail;
构造单向链表,然后实现以下函数ReverseList() 将链表反向,即原表头变为表尾,表尾变为表头

typedef int ELEMENT;
struct List{
struct List *next;
ELEMENT ele;
};

class Link
{
struct List *head, *tail;
public:
Link(){ head = tail = NULL; }
~Link(){Erase ();}
int InsertAdd(ELEMENT);//向链表中加入一个值,实现略
int DeleteData(ELEMENT);//在链表中删除指定值的节点,实现略
int DeleteElement(List*);//在链表中删除指定的节点,实现略
int Erase();//删除链表中所有的节点
void reverselist()//反转链表
{
if(head==0)
return;
if(head->next==0)
return;
if(head->next==tail)
{
head->next = 0;
tail->next = head;
}
else
{
List* pre = head;
List* cur = head->next;
List* curnext = cur->next;
head->next = 0;
cur->next = head;
for(; curnext!=0; )
{
cur->next = pre;
pre = cur;
cur = curnext;
curnext = curnext->next;
}
curnext->next = cur;
}
}//end reverselist()
};
...全文
709 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
狂放之歌 2005-05-08
  • 打赏
  • 举报
回复
出题者 有些题本身就有毛病..还拿来考..用正常思维 很难做对..

如果你没记错题 也没写错的话..
我认为这个出题人,很想束缚别人的思维..你一定要跟着他的思维方式才能答对题
这种方法招来的人.大部分缺乏创造力.但不排除有极品
hou2003 2005-05-08
  • 打赏
  • 举报
回复
从搂主的答题来看,虽然不至于都正确。我觉得楼主还是有一定水准的,怎么也不至于一塌糊涂。我想这个考官有点心术不正。这一点楼主还是要又自信的。
flying_dancing 2005-05-08
  • 打赏
  • 举报
回复
ding yi xia
healer_kx 2005-05-08
  • 打赏
  • 举报
回复
楼主, 下次写链表什么的 , 用模板, 带iterator那种的~
healer_kx 2005-05-08
  • 打赏
  • 举报
回复
zhousqy(C++匪徒) 实现的挺好的~
healer_kx 2005-05-08
  • 打赏
  • 举报
回复
楼上的, 告诉你
就是64位机器上 int也是4 BYTE !

世道变了!
int再也不变长了~
visual4825 2005-05-08
  • 打赏
  • 举报
回复
.
neushi 2005-05-08
  • 打赏
  • 举报
回复
to xialin168(林)
32位电脑上,sizeof(int)==sizeof(long int)==4,这一点楼主正解
mostideal 2005-05-08
  • 打赏
  • 举报
回复
学习。。
xialin168 2005-05-08
  • 打赏
  • 举报
回复
虽然楼主的答案有点粗心这处,但怎么也不至于一踏糊涂;
可能考官考的是楼主的细心这处:
遇到这样的考官就该这样来:
1:基本正解;
2:原题错误,不能编译通过;(还可以正面还击下考官)
3:8*3+4+1=29; 32位机上long int为8个字;
4:第一个strcpy就出界了;
5:楼主答得确是不够妥当;5楼的<cunsh(村少)>正解;
6:楼主你只要构造一单向链表就行了,不用加上那么多的功能函数,而反使考官反感;
还有让反感的可能是
typedef int ELEMENT;
struct List{
struct List *next;
ELEMENT ele; //题目明明是ELEMENT e;最好不要自作聪明,可能会反应什么;
};
还有就是反向函数也不该那样写,其它很简单的几行代码,搞复杂了;
还有最重要的一点是考官也太清高了,这样的人日后也不好相处,想想楼主也没什么大不了;
woundedsoul 2005-05-08
  • 打赏
  • 举报
回复
mark
shorch 2005-05-08
  • 打赏
  • 举报
回复
虚心学习 天天进步~~~
Sword_liao 2005-05-08
  • 打赏
  • 举报
回复
第3题出的太弱智了,它没有唯一解,视不同的机器和编译器而定。
一般来说,每个对象一定有一个1bytes的指针,那是被编译器安插进去的一个char,用来唯一标示该object。而且每个类一般有alignment padding bytes,这也是由编译器自己加进去的,alignment到底是多少也要看机器和编译器。
class Base { }
class Derived :virtual publc X {}
在vc6.0上:
sizeof(Base) = 1
sizeof(Derived) = 4 //alignment bytes = 4; alignment padding bytes = 3

第2题operator =应该打错了吧,要return *this;

第6题不用这么复杂吧,从头往后扫描,不断前插就行了
windoze 2005-05-08
  • 打赏
  • 举报
回复
memcpy不考虑内存重叠的情况,memmove才考虑,说实话这个出题人的水平可能还不如你高……
km3 2005-05-07
  • 打赏
  • 举报
回复
mark
boxban 2005-05-07
  • 打赏
  • 举报
回复
题目本身有很多问题,比较突出的是很多声明为有返回值的函数实现并没有return语句,不知是考官故意如此,还是另有图谋
guyaguya 2005-05-07
  • 打赏
  • 举报
回复
完了,又受刺激了
guyaguya 2005-05-07
  • 打赏
  • 举报
回复
不是吧
healer_kx 2005-05-07
  • 打赏
  • 举报
回复
没有一道题是正经题~
还拿临时变量难为人~ 无聊死了
zhousqy 2005-05-07
  • 打赏
  • 举报
回复
void * memcpy(void * dest,const void *src,size_t count)
{
char *tmp = (char *) dest, *s = (char *) src;

while (count--)
*tmp++ = *s++;

return dest;
}
加载更多回复(10)
作者:July、阿财。 时间:二零一一年十月十三日。 ------------------------------ 无私分享造就开源的辉煌。 今是二零一一年十月十三日,明日14日即是本人刚好开博一周年。在一周年之际,特此分享出微软面试 全部100题答案的完整版,以作为对本博客所有读者的回馈。 一年之前的10月14日,一个名叫July 的人在一个叫csdn 的论坛上开帖分享微软等公司数据结构+算法 面试100题,自此,与上千网友一起,一起思考,一起解答这些面试题目,最终成就了一个名为:结构之法 算法之道的编程面试与算法研究并重的博客,如今,此博客影响力逐步渗透到海外,及至到整个互联网。 在此之前,由于本人笨拙,这微软面试100题的答案只整理到了前60题(第1-60题答案可到本人资源下 载处下载:http://v_july_v.download.csdn.net/),故此,常有朋友留言或来信询问后面40题的答案。只是 因个人认为:一、答案只是作为一个参考,不可太过依赖;二、常常因一些事情耽搁(如在整理最新的今年 九月、十月份的面试题:九月腾讯,创新工场,淘宝等公司最新面试十三题、十月百度,阿里巴巴,迅雷搜狗 最新面试十一题);三、个人正在针对那100题一题一题的写文章,多种思路,不断优化,即成程序员编程 艺术系列。自此,后面40题的答案迟迟未得整理。且个人已经整理的前60题的答案,在我看来,是有诸多问 题与弊端的,甚至很多答案都是错误的。 互联网总是能给人带来惊喜。前几日,一位现居美国加州的名叫阿财的朋友发来一封邮件,并把他自己 的全部100题的答案一并发予给我,自此,便似遇见了知己。十分感谢。 任何东西只有分享出来才更显其价值。本只需贴出后面40题的答案,因为前60题的答案本人早已整理上 传至网上,但多一种思路多一种参考亦未尝不可。特此,把阿财的答案再稍加整理番,然后把全部100题的答 案现今都贴出来。若有任何问题,欢迎不吝指正。谢谢。 上千上万的人都关注过此100题,且大都都各自贡献了自己的思路,或回复于微软100题维护地址上,或 回复于本博客内,人数众多,无法一一标明,特此向他们诸位表示敬意和感谢。谢谢大家,诸君的努力足以影 响整个互联网,咱们已经迎来一个分享互利的新时代。 感谢诸君,请享用.....

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧