C/C++面试总结

                                      面试总结--C/C++方面

     前几天去了XX技术面试,估计大家也知道XX是什么了,应聘的是核心网CGP, 好像是Carrier Group Platform 的缩写,即运营商级平台。面试中问的问题倒不是很难,之后反思自己没回答好的原因是平时没有很好的总结和积累学习过的东西。

 

   题目: 

  

   1. 什么是多态?怎么实现的?好处是什么?使用虚函数的时候应注意哪些问题?(要回答很全不是很容易)

 

 

   2. new delete 和 malloc free 的区别,使用new delete 的时候应该注意哪些问题?

 

  3. 线程,进程的定义,区别,线程之间的同步方式,进程间通讯的方式,共享内存的使用方法,应注意哪些问题?

 

   4. 找代码中的错误,主要就是字符串拷贝的问题,以及unsigned char类型的变量赋值溢出导致无限for循环的问题,这个就不详述了。

 

   5. 定义链表结构,写代码建立一个链表,再对链表进行排序。 完了又让我定义一个链表类,问应该定义哪些数据成员和接口,

 

   6. 介绍一下STL的容器类,分别说出它们适用的场合和优缺点。

 

 

 

 

 

 

  Answer:


  1. 多态就是一个接口,多种实现;通过虚函数,和晚捆绑实现;好处就是统一接口;使用虚函数时

应注意以下问题:
     (1) 只能用virtual声明类的成员函数,不能声明类外的普通函数,因此虚函数的作用是允许派生

类对基类的虚函数重新定义,它只能用于类的继承层次结构中。
     (2) 一个成员函数被定位为虚函数后,在同一个类族中就不能再定义一个非virtual的但与该虚函

数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数。
 
     那么在什么情况下应考虑把一个函数声明为virtual的呢?主要考虑以下几点:

     (1) 首先看该成员函数所在的类是否会作为基类,然后看该成员函数在类的继承后有无可能被更

改功能,如果希望更改其功能的,一般应将它声明为虚函数。
     (2) 考虑对成员函数的调用时通过对象名还是通过基类的指针和引用去访问,如果是通过基类的

指针或引用,则应该定义为虚函数。

     注意: 使用虚函数,系统要有一定的时间(晚捆绑)和空间(虚函数表)开销,因此它不是“免费的

”。


   2. new 和 malloc 的区别在于使用new 的时候需要调用对象的构造函数,delete 和 free的区别当

然也是delete 会调用对象的析构函数,使用动态分配时需要注意的就是,不再需要使用这块空间时,

要及时的释放,但这点说起来容易,做起来难,在大的系统中,要全部做到就更难了。

 
   3.
    进程是拥有系统资源的基本单位,通常为程序的一个实例,它是没有活力的,只是占有系统分配的

虚拟地址空间,空间有程序代码、数据,和一些资源(文件,动态内存分配和线程)。

    线程是操作系统调度的基本单位,运行于进程之中。线程拥有代码,栈,以及一些共享数据。另外

线程也可以访问全局静态数据。 线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存

空间。

    区别:
    (1) 进程是资源的载体,是程序的一个实例,是一个静态的概念,线程是程序的执行单元,它是动

态执行的。
    (2) 线程属于进程,线程共享进程的内存空间。
 
    线程的同步方式主要有: 事件;临界区;互斥体;信号量。
 
    其中事件主要倾向于在某件事情发生时的通知,而临界区和互斥体主要倾向于实现对资源的互斥访

问,信号量主要实现对多个资源的访问控制,
   
    临界区和互斥体的区别:
    (1) 互斥体可以在进程和线程之间使用,但是临界区只能在线程之间使用。
    (2) 临界区是非内核对象,在用户态进行锁操作,速度快,互斥体属于内核对象,在内核态进行锁

操作,速度慢。
    (3) 临界区和互斥体在Windows平台都可用,Linux平台下只有互斥体可用。

 
  4. 略过....

 

  5. 可以参考STL 和 MFC 的实现。

 

  6.
   vector: 连续的空间存储,可以使用[]操作符)快速的访问随机的元素,快速的在末尾插入元素,但

是在序列中间岁间的插入,删除元素要慢,而且如果一开始分配的空间不够的话,有一个重新分配更大

空间,然后拷贝的性能开销.

 

   deque: 小片的连续,小片间用链表相连,实际上内部有一个map的指针,因为知道类型,所以还是

可以使用[],只是速度没有vector快, 快速的访问随机的元素,快速的在开始和末尾插入元素,随机的

插入,删除元素要慢,空间的重新分配要比vector快,重新分配空间后,原有的元素不需要拷贝。对

deque的排序操作,可将deque先复制到vector,排序后在复制回deque。

 

   list   (每个元素间用链表相连)访问随机元素不如vector快,随机的插入元素比vector快,对每

个元素分配空间,所以不存在空间不够,重新分配的情况

 

   set 内部元素唯一,用一棵平衡树结构来存储,因此遍历的时候就排序了,查找也比较快的哦。
   map 一对一的映射的结合,key不能重复。
   multiset
   multimap

 

   stack 适配器,必须结合其他的容器使用,stl中默认的内部容器是deque。先进后出,只有一个出

口,不允许遍历。

 

   queue 是受限制的deque,内部容器一般使用list较简单。先进先出,不允许遍历。

 

   vector<bool> 与bitset<> ,前面的可以动态改变长度。

 

   priority_queue 插入的元素就有优先级顺序,top出来的就是优先级最高的了

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值