【铸铁】C++服务器面试题.doc
自己做的答案仅作参考
一、选择题(每题5分)
1. 链表不具有的特点是( B)。
(A) 不必事先估计存储空间; (B) 可随机访问任一元素;
(C) 插入删除不需要移动元素; (D) 所需空间与线性表长度成正比;
2. 下列数据结构中,按先进后出原则组织数据的是(D)
(A) 线性链表; (B) 顺序表; (C)循环链表; (D) 栈;
3. 如果定义一个C++类CDate, 语句“CDate *p = newCDate;”的含义是(A )。
(A) 调用CDate类的缺省构造函数从内存中分配一个CDate类型的对象,并将该对象地址赋值给指针p;
(B) 调用CDate类的拷贝构造函数从内存中分配一个CDate类型的对象,并将该对象地址赋值给指针p;
(C) 调用CDate类的析构函数从内存中分配一个CDate类型的对象,并将该对象地址赋值给指针p;
(D) 从内存中释放指针p所指向的CDate类的对象;
4. 下列关于静态数据成员正确的是( B)
(A) 可以通过this指针访问静态数据; (B) 可以用类名和作用域访问静态数据;
(C) 静态数据在类内声明并初始化; (D)只能由该类的静态成员函数访问;
5. 在TCP/IP协议栈里,如果出现阻塞的情况,下面那种情况最有可能发生? ( A)
(A) 连接错误 (B) 释放缓存 (C) 包错误 (D) 丢包
6. 下面的类图表示的是哪个设计模式?(D)
(A) 代理模式(Proxy) (B) 装饰模式(Decorator)
(C) 桥接模式(Bridge) (D) 观察者模式(Observer)
二、简答题(每题7分)
1. C++中指针和引用有什么区别
答:
1.引用访问一个变量是直接访问,而指针是间接访问。
2.引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。
3.引用在开始的时候就绑定到了一个内存空间(开始必须赋初值),所以他只能是这个内存空间的名字,而不能改成其他的,当然可以改变这个内存空间的值.
2. C++特点是什么,如何实现多态?画出基类和子类在内存中的相互关系
继承,封装,多态
用虚函数实现多态
子类可以继承父类的非私有数据成员
3. 请写一个算法删除数组[1,1,1,2,2,2,2,2,7,7,1,5,5,5,0]中重复的数字,使其转变成1,2,7,1,5,0
voidNoReplicatedSubstring(int s[],int len)
{
vector <int> vectTemp;
int nData= s[0];
vectTemp.push_back(nData);
for(int i=1;i<len;i++)
{
if(s[i] == nData)
{
continue;
}
else
{
nData =s[i];
vectTemp.push_back(s[i]);
}
}
}
4. 一次遍历找链表倒数第n个节点,要求通过一次遍历找到链表中倒数第n个节点,链表可能相当大,可使用辅助空间,但是辅助空间的数目必须固定,不能和n有关。
答案:
ListNode*NodeInList(ListNode* pHead,int Num)
{
if(pHead==NULL)
return NULL;
ListNode* pNode=pHead; //当前结点
ListNode* pMidNode=pHead;//倒数Num个结点
while(Num)
{
if(pNode->m_pNext!=NULL)
pNode=pNode->m_pNext->m_pNext;
Num--;
}
while(pNode->m_pNext!=NULL&&pNode->m_pNext->m_pNext!=NULL)
{
pNode=pNode->m_pNext->m_pNext;
pMidNode=pMidNode->m_pNext;
}
return pMidNode;
}
5. TCP/IP 建立连接的过程?(3-way shake)
答:
Client与server建立TCP连接时:首先Client向server发SYN(请求),然后server回复(应答请求),最后Client回复,这样TCP就建立一次连接(三次握手)的过程就建立了
6. 使用udp和tcp进程网络传输,为什么tcp能保证包是发送顺序,而 udp无法保证?
1.主机每次发送数据时,TCP就给每个数据包分配一个序列号并且在一个特定的时间内等待接收主机对分配的这个序列号进行确认,如果发送主机在一个特定时间内没有收到接收主机的确认,则发送主机会重传此数据包。接收主机利用序列号对接收的数据进行确认,以便检测对方发送的数据是否有丢失或者乱序等,接收主机一旦收到已经顺序化的数据,它就将这些数据按正确的顺序重组成数据流并传递到高层进行处理。
2.UDP不提供可靠的数据传输!一个端口发往同一个目的端口的几个数据包的顺序可能会出现混乱
7. Linux epoll的LT(level triggered)与ET(edge-triggered)工作方式的区别?
答:
LT:水平触发,效率会低于ET触发,尤其在大并发,大流量的情况下。但是LT对代码编写要求比较低,不容易出现问题。LT模式服务编写上的表现是:只要有数据没有被获取,内核就不断通知你,因此不用担心事件丢失的情况。
ET:边缘触发,效率非常高,在并发,大流量的情况下,会比LT少很多epoll的系统调用,因此效率高。但是对编程要求高,需要细致的处理每个请求,否则容易发生丢失事件的情况。
从本质上讲:与LT相比,ET模型是通过减少系统调用来达到提高并行效率的。
8. 网络编程中设计并发服务器,使用多进程与多线程 ,请问有什么区别?
答:
两者都可以提高程序的并发度,提高程序运行效率和响应时间。线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移
9. 请列举进程间通迅都有哪些方式?并说明工作方式,优缺点等。
常见三种方式:管道,消息缓冲,共享内存
1.无名管道简单方便.但局限于单向通信的工作方式.并且只能在创建它的进程及其子孙进程之间实现管道的共享;有名管道虽然可以提供给任意关系的进程使用.但是由于其长期存在于系统之中,使用不当容易出错。
2.消息缓冲,使用方便,但是信息的复制需要额外消耗CPU的时间.不适宜于信息量大或操作频繁的场合。
3.共享内存,针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制,快捷、信息量大是其优点但是不方便网络通信。
10. 你让一些人为你工作了七天,你要用一根金条作为报酬。金条被分成七小块,每天给出一块,如果你只能将金条切割两次,你怎样分给这些工人?
第一次切割七分之一 第二次切割七分之二
这样就分为三段 七分之一一段 七分之二一段 七分之四一段
然后根据每天工作量交换