分享

C++.一组面试题及整理的答案

 雄Frank 2011-10-16
1.volitale与register的常用用途
2.谈谈DLL
3.VC中的sendMessage与postMessage
4.堆和栈区别
5.指针与引用的区别
6.普通成员函数与虚函数的区别
7.class A{
  ~virtual A{}
  }
  class B:public A{
  ~ B{}
  }
 为什么要把A类析构函数设为虚函数
8.快排思想,其不足之处,以及改进方法
9.huffman编码需要扫描一次还是两次文件,它与LZW编码的不同在哪
10.TCP/IP协议模型

 

1.volitale与register的常用用途
1 都是变量类型修饰符,第一个指这个变量是易变的,如果一个声明变量时在前面加上volitale,就意味着每次取值都从内存里取
第二个是寄存器,就是变量的值存储在寄存器中

volitale在非局部跳转的时候,在多线程的时候都会用到吧,防止编译器优化,数据在寄存器计算完成后立即写回内存,并且读取从内存读. register相反,它请求让该变量利用寄存器优化读取速度,但应该也只是个建议性的.
.volitale与register的常用用途
volitale >是不让编译在修改volitale所修饰的变量,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
register
>例如:register char *p=(char *)malloc (sizeof (char));
p指向了一个唯一的地址;这个是为了提高数据的读取速度;但是所存储的数据被放在Cpu拥有的寄存器中,而非内存。
//

2.谈谈DLL
还木有怎么用过,DLL分为静态链接和动态链接,每个DLL都有和它一起存在的lib,静态链接用lib,动态链接用dll,编译DLL时要用extern "C"或者DEF保证函数名是神马神马的。DLL里的开辟的内存由DLL里的函数释放。
使用DLL程序更换DLL就可以完成更新。

3.VC中的sendMessage与postMessage
PostMessage是将消息放到消息队列里,不一定立即处理。(异步的)
SendMessage是消息立即被处理,处理完成后函数返回,(同步的)

4.堆和栈区别
栈向下增长,堆向上增长,栈是函数内的各种局部变量的存储区,堆是动态开辟内存的存储区。栈不大,堆还挺大的。
5.指针与引用的区别
指针可以赋值,引用只能初始化。

指针代表了地址,引用是变量的别名,必须初始化

6.普通成员函数与虚函数的区别
普通函数就是普通函数,虚函数可以动态绑定,由对象内的虚函数指针指向的虚函数表定位,虚函数是多态的基础。

虚函数为了动态绑定,也就是实现多态,当基类指针或引用指向派生类时,程序运行阶段就会使用派生类定义的函数


7.class A{
  ~virtual A{}
  }
  class B:public A{
  ~ B{}
  }
 为什么要把A类析构函数设为虚函数
因为这样A *p=new B(); delete p;调用的不是A的析构,而是B的析构,B的析构又会自动调用A的析构,于是完整析构了整个B对象。

比如定义基类指针,如果析构函数不设为虚函数的话,那么调用的就是基类的析构函数,只是把派生类的基类子对象部分给释放了,但派生类剩下的部分没有释放,造成内存泄露。如果设为虚函数,那么调用时就会调用派生类的析构函数,这样整个派生类对象都被释放了。

8.快排思想,其不足之处,以及改进方法
快排思想就是将一个数n放到它在有序队列内应该在的位置,不足之处就是每一次partition可能都会出现1:n-1的最坏情况,导致快排效率是O(n^2)。 改进方法就是诸多算法书上的,3分取点法决定是用哪一个n(将n换到序列头部然后进行普通的partition)。也有用随机法选n的(效率也不行)。
快排思想:
通过选取枢纽元,把小于枢纽元的数排在左边,大于的排在右边,然后分别对左右两边递归调用。

不足之处:
枢纽元选取不当,会使程序表的很慢,甚至有可能退化到O(N^2)。一般的选取枢纽元的方法是
1.选第一个元素(不好,如果本来就是有序的,会是灾难性的)
2.随机选一个(不好,随机函数的开销也是不小的)

改进方法:
1.由于数组规模很小时,插入排序要快过快排,因此可以在数组过小时选用插入排序,而不用快排。(可以定为个数小于等于10个时)。
2.枢纽元的选取是关键,一种比较好的方法是:选取第一个,最后一个,和中间的一个,排序后选取中位数,作为枢纽元。

9.huffman编码需要扫描一次还是两次文件,它与LZW编码的不同在哪。 
LZW是什么,huffman编码扫描一次统计字符频率,生成每个字符的编码,再扫描一次进行编码压缩。
LZW就是GIF图片用的压缩算法,原理也是查字典表。它的特点就是对于所有串,其前缀子串都必须在字典中存在。其最大的好处就是压缩时查表非常快,但是也牺牲了一些压缩性能。解压时它不比LZ系列算法快。

 


10.TCP/IP协议模型
物理,链路,网络,传输,应用。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多