`
lovnet
  • 浏览: 6715034 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

C++面试试题0002

 
阅读更多

C++面试试题0002

C++面试题专栏: http://www.mianwww.com/html/category/it-interview/cpp

1.C++中为什么用模板类?

(1)可用来创建动态增长和减小的数据结构。

(2)它是类型无关的,因此具有很高的可复用性。

(3)它在编译时而不是运行时检查数据类型,保证了类型安全。

(4)它是平台无关的,可移植性。

(5)可用于基本数据类型。

2.求函数返回值,输入x=9999;

int func ( x )

{

int countx = 0;

while ( x )

{

countx ++;

x = x&(x-1);

}

return countx;

}

结果呢?

知道了这是统计9999的二进制数值中有多少个1的函数,且有

9999=9×1024+512+256+15

9×1024中含有1的个数为2;

512中含有1的个数为1;

256中含有1的个数为1;

15中含有1的个数为4;

故共有1的个数为8,结果为8。

1000 - 1 = 0111,正好是原数取反。这就是原理。

用这种方法来求1的个数是很效率很高的。

不必去一个一个地移位。循环次数最少。

3.C++的重载(overload)与重写(override)的区别?

成员函数被重载的特征:

(1)相同的范围(在同一个类中);

(2)函数名字相同;

(3)参数不同;

(4)virtual关键字可有可无。

重写是指派生类函数重写基类函数,是C++的多态的表现,特征是:

(1)不同的范围(分别位于派生类与基类);

(2)函数名字相同;

(3)参数相同;

(4)基类函数必须有virtual关键字。

4.MFC中SendMessage和PostMessage的区别?

PostMessage 和SendMessage的区别主要在于是否等待应用程序做出消息处理。PostMessage只是把消息放入队列,然后继续执行;而SendMessage必须等待应用程序处理消息后才返回继续执行。这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确,而SendMessage的返回值表示其他程序处理消息后的返回值。

5.Programming (Mandatory)

Linked list

a. Implement a linked list forintegers,which supports the insertafter (insert a node after a specified node)and removeafter (remove the node after a specified node) methods;

b. Implement a method to sort the linkedlist to descending order.

答:题目的意思是实现一个整型链表,支持插入,删除操作(有特殊要求,都是在指定节点后进行操作),并写一个对链表数据进行降序排序的方法。

那我们不妨以一个线性链表进行编程。

// 单链表结构体为

typedef struct LNode

{

int data;

struct LNode *next;

}LNode, *pLinkList;

// 单链表类

class LinkList

{

private:

pLinkList m_pList;

int m_listLength;

public:

LinkList();

~LinkList();

bool InsertAfter(int afternode, int data);//插入

bool RemoveAfter(int removenode);//删除

void sort();//排序

};

实现方法

//insert a node after a specified node

bool LinkList::InsertAfter(int afternode,int data)

{

LNode *pTemp = m_pList;

int curPos = -1;

if (afternode > m_listLength ) // 插入点超过总长度

{

return false;

}

while (pTemp != NULL) // 找到指定的节点

{

curPos++;

if (curPos == afternode)

break;

pTemp = pTemp->next;

}

if (curPos != afternode) // 节点未寻到,错误退出

{

return false;

}

LNode *newNode = new LNode; // 将新节点插入指定节点后

newNode->data = data;

newNode->next = pTemp->next;

pTemp->next = newNode;

m_listLength++;

return true;

}

//remove the node after a specified node

bool LinkList::RemoveAfter(int removenode)

{

LNode *pTemp = m_pList;

int curPos=-1;

if (removenode > m_listLength) // 删除点超过总长度

{

return false;

}

// 找到指定的节点后一个节点,因为删除的是后一个节点

while (pTemp != NULL)

{

curPos++;

if (curPos == removenode+1)

break;

pTemp = pTemp->next;

}

if (curPos != removenode) // 节点未寻到,错误退出

{

return false;

}

LNode *pDel = NULL; // 删除节点

pDel = pTemp->next;

pTemp->next = pDel->next;

delete pDel;

m_listLength–;

return true;

}

//sort the linked list to descending order.

void LinkList::sort()

{

if (m_listLength<=1)

{

return;

}

LNode *pTemp = m_pList;

int temp;

// 选择法排序

for(int i=0;i<M_LISTLENGTH-1;I++)

for(int j=i+1;j<M_LISTLENGTH;J++)

if (pTemp[i].data<PTEMP[J].DATA)

{

temp=pTemp[i].data;

pTemp[i].data=pTemp[j].data;

pTemp[j].data=temp;

}

}

前两个函数实现了要求a,后一个函数sort()实现了要求b

6.Windows程序的入口是哪里?写出Windows消息机制的流程。

Windows程序的入口是WinMain函数

消息机制:系统将会维护一个或多个消息队列,所有产生的消息都会被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统。

7.如何定义和实现一个类的成员函数为回调函数?

所谓的回调函数,就是预先在系统的对函数进行注册,让系统知道这个函数的存在,以后,当某个事件发生时,再调用这个函数对事件进行响应。

定义一个类的成员函数时在该函数前加CALLBACK即将其定义为回调函数,函数的实现和普通成员函数没有区别。

8.请问交换机和路由器各自的实现原理是什么?分别在哪个层次上面实现的?

交换机属于OSI第二层即数据链路层设备。它根据MAC地址寻址,通过站表选择路由,站表的建立和维护由交换机自动进行。路由器属于OSI第三层即网络层设备,它根据IP地址进行寻址,通过路由表路由协议产生。交换机最大的好处是快速,路由器最大的好处是控制能力强。

9.全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

一些变量在整个程序中都是可见的,它们称为全局变量。一些变量只能在一个函数中可知,称为局部变量。这就是他们的区别。

在任何函数外面定义的变量就是全局变量,在函数内部定义的变量是局部变量,这是它们在程序中的实现过程。

操作系统和编译器是根据程序运行的内存区域知道他们的,程序的全局数据放在所分配内存的全局数据区,程序的局部数据放在栈区。

10. C++:memset ,memcpy 和strcpy 的根本区别?

#include “memory.h”

memset用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘‘或‘\0′;例:char a[100];memset(a, ‘\0′, sizeof(a));

memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例:char a[100],b[50]; memcpy(b, a, sizeof(b));注意如用sizeof(a),会造成b的内存地址溢出。

strcpy就只能拷贝字符串了,它遇到’\0′就结束拷贝;例:chara[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0′之前)是否超过50位,如超过,则会造成b的内存地址溢出。

11. ASSERT()是干什么用的?

ASSERT() 是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。

12. 二分查找算法实现。

1、递归方法实现:

int BSearch(elemtype a[],elemtype x,intlow,int high)

/*在下届为low,上界为high的数组a中折半查找数据元素x*/

{

int mid;

if(low>high) return -1;

mid=(low+high)/2;

if(x==a[mid]) return mid;

if(x<a[mid]) return(BSearch(a,x,low,mid-1));

else return(BSearch(a,x,mid+1,high));

}

2、非递归方法实现:

int BSearch(elemtype a[],keytype key,int n)

{

int low,high,mid;

low=0;high=n-1;

while(low<=high)

{

mid=(low+high)/2;

if(a[mid].key==key) return mid;

else if(a[mid].key<key) low=mid+1;

else high=mid-1;

}

return -1;

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics