当前位置:编程学习 > C/C++ >>

[铸铁]C++服务器面试题

自己做的答案仅作参考
 
一、选择题(每题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. 网络编程中设计并发服务器,使用多进程与多线程 ,请问有什么区别?
&nb
补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,