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;
}
分享到:
相关推荐
### C++面试题集锦(非常详细):关键知识点解析 #### 一、引用和指针的区别 在C++中,引用和指针是两种不同的数据类型,它们各自有着独特的特性和用途。以下是它们之间的一些主要区别: 1. **内存分配**: - **...
5. **C++面试题集锦.docx**:此文档汇总了各类C++面试题目,特别关注了模板、设计模式和算法等方面,强调理论与实践的结合。 6. **CC++笔试题附答案华为面试题系列.txt**:华为公司对技术实力有很高的要求,这份...
这份"大公司C++面试题目集锦"包含的两份文档——"c++试题(1).doc"和"c++试题(2).doc",无疑是帮助你巩固知识、提升技能的关键资源。以下是基于这些文件可能涵盖的一些重要知识点的详细解析: 1. **基础语法**:...
"C++面试题集锦"是针对想要在C++相关职位上求职的程序员们的一份宝贵资源,涵盖了过去三年的面试题目,可以帮助他们更好地准备面试。 首先,"C++笔试大全.chm"可能包含了各种C++的基础和进阶题目,包括但不限于语法...
C++中的引用与指针是两种不同的内存地址操作方式,它们在使用、功能和性能上各有特点。 引用(Reference)是C++引入的一种...在面试中,对这些知识点的掌握程度往往能够体现面试者的基础水平和对C++语言的深入理解。
在C/C++面试中,以下几个核心知识点通常是考察的重点: 1. **基础语法**:面试通常会涵盖基本的语法结构,如变量定义、数据类型、运算符、流程控制(if/else, switch, for, while)、函数、指针等。理解指针是C/C++...
《C++面试试题荟萃集锦》是一份针对C++面试者的宝贵资源,它涵盖了从基础知识到高级概念的广泛领域,旨在帮助准备C++面试的求职者巩固技能,提升理解深度。这份资料集包含了C++语言的核心要素,如语法、内存管理、...
根据提供的文件信息,文件名为“C_C++面试题集锦.pdf”,描述为“c/c++面试题集锦。囊括了一些在c/c++面试中针对性的一些基础试题。可以说是每个c/c++程序员必须掌握的知识点。虽然并不一定是面试过程中必考的。但是...
在准备C++面试时,了解并掌握这些关键知识点至关重要,因为它们涵盖了从基础到高级的C++特性,以及与操作系统、计算机网络、数据结构、算法、数据库和设计模式等相关领域。以下是对标题和描述中提到的一些核心知识点...
在C/C++编程中,面试时常会涉及到一系列关键概念和技术问题。以下是一些与给定标题和描述相关的知识点详解: 1. **链表检测循环**: 链表是否循环的问题可以通过“快慢指针”(Floyd's Cycle-Finding Algorithm)...
《C C++面试题大汇总》是一份涵盖了C和C++面试中常见问题的资源集锦,主要来源于网络,特别是CSDN这个知名的开发者社区。这份资料的目的在于为准备C++面试的求职者提供全面而丰富的知识复习材料,其中包含了大约200...
"C++面试题集锦" 本资源摘要信息涵盖了 C++ 面试题集锦,涵盖了多态、虚函数、字符串处理、算法、数据结构、内存管理、文件操作、编程语言基础知识等方面的知识点。 1. 多态类中的虚函数表是 Compile-Time 还是 ...
《C++面试试题荟萃》是一份集合了众多C++面试常见问题的资源包,旨在帮助求职者或技术爱好者充分准备面试,提升自己的C++技术水平。这份资料涵盖了C++的基础概念、语法特性、面向对象编程、STL使用、内存管理、多...
《C++面试题集锦》是一份专门为C++开发者准备的面试复习资料,它涵盖了C++语言的基础知识、进阶概念以及实际编程技巧等多个方面。这份文档库旨在帮助求职者全面理解和掌握C++的核心概念,以便在面试中表现出色。 一...
《C、C++面试题集锦》是一份针对C和C++编程语言的面试题库,旨在帮助求职者和学习者深入理解这两种语言的核心概念、语法特性以及在实际开发中的应用。这份文档不仅包含了基础的编程知识,还可能涵盖了部分高级主题和...