IT求职知识:基础知识2(c++理论篇)
发表日期:2011-07-07 作者:DH分类:编程技术 标签: c++
上一篇文章给大家分享了涉及C++代码的有趣的题目,这一章节给出遇到的一些理论性的C++问题,给大家分享一下。
1. #include <> 和#include " "的区别?
Answer: 前者从标准库路径开始搜索头文件,后者从用户工作目录开始。
2. 如何判断一段程序是由C编译程序还是由C++编译程序编译的?
Answer: C++编译时定义了_cplusplus,C编译时定义了_STDC_
3. 关于结构体的sizeof计算
当结构体的元素的长度都小于处理器的位数的时候,便以结构体里面最长的数据元素为对齐单位。如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对齐单位。
更具体的解释参考:http://blog.csdn.net/jimmy_w/archive/2007/10/14/1824176.aspx
4. 八皇后问题
http://lolorosa.blogbus.com/logs/45693335.html
5. 0 1背包
输入两个数m,n, 从数列1,2,3,。。。,n中随意去几个数使其和等于m,求出所有组合。
(0 1背包的原型是,容积为m的箱子,有1,2,3.。。。n体积的物品,请问将箱子装满有多少种组合,不考虑物品放置空隙)
分析:
a. 对于n>m的情况m+1...n之间的数都不考虑,也就是将n换成m考虑
b. 对于(n+1)n/26. 析构函数可以是虚函数,构造函数为什么不可以是虚函数呢?
Answer:析构函数是虚函数主要考虑的是多态的问题,当用父类指针指向子类对象的时候,如果析构函数不是虚函数的话,那么从指针删除对象的时候子类的资源就不能自动得到释放。所以这也是大多数编译器在创建新类时的默认行为:将析构函数置为虚函数。
在包含虚函数的类中,都维持一个虚函数表vTable,而类本身还包含一个隐藏变量vPointer来指向虚表。这个vPointer的赋值是在构造函数中隐式完成的。也就是说构造函数调用前是无法使用虚表的。所以如果构造函数本身都是虚函数的话,无法产生正确调用。另一个考虑是构造函数本身没有任何多态的需求,这也就没必要让其成为虚函数。虚函数的出现是有开销的,一个无任何虚函数的类不需要虚表也不需要虚表指针。而有了虚函数这两个就都需要了。
7. override 和overload
override是用来重写虚函数的,overload是同名函数参数表不同。
8. 悬浮指针和空指针
当用delete删除一个对象时,删除的知识对象的内容而非指针的内容,指针的指向仍未改变,只是指向的地址处的对象已经不存在了。这种指针称为悬浮指针。
当把指针显示的赋值为0或NULL时指针变为空指针。
9. 关于public, protected, private继承
(1) public继承
基类的public成员, 在派生类中成为public成员。
基类的protected成员,在派生类中成为protected成员。
基类的private成员,在派生类中成为不可直接使用的成员。
(2) private继承
基类的public成员, 在派生类中成为private成员。
基类的protected成员,在派生类中成为private成员。
基类的private成员,在派生类中成为不可直接使用的成员。
(3) protected继承
基类的public成员, 在派生类中成为protected成员。
基类的protected成员,在派生类中成为protected成员。
基类的private成员,在派生类中成为不可直接使用的成员。
关于集中继承方式,所谓的宝典中有很多处解释都不很确切。尤其值得关注的是任何继承中父类的私有成员在子类中都不可使用,而其他两种成员在子类都可以使用,只是继承后这些成员的可访问性会由于类继承的修饰符而修改。
另外个人的理解protected变量是为了给子类继承用的,所以如果一个类有被继承的可能那么应该把会被子类用的变量都设置成protected,而那些一定不会有子类的类中的属性应该都设置成private的,比如java中的String类。
10. 一般在什么时候构造函数被声明称private呢
宝典中解释是:比如要阻止编译器生成默认的copy constructor的时候。
个人观点:构造函数被声明成private不能阻止编译器生成copy constructor,除非你也写一个private的copy constructor。我觉得使用private构造函数至少有两种情况
a.单例模式,在这种模式下所有的构造函数(初始化构造函数,拷贝构造函数,包括operator=)都要声明为private的,否则这些操作会破坏单例性。
b.工具类,有些工具类只提供静态函数调用,并且没有非静态类变量,比如Java中Math类,对于这种情况,构造函数也都要声明为private,因为不需要出现类的实例。
11. volatile
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 多线程应用中被几个任务共享的变量
12. 使用内部类的若干原因
内部类对象能够访问创建它的对象的实现
内部类能够隐藏起来,不为同一包中的其他类所见
匿名内部类可以方便地定义运行时回调
内部类在编写事件驱动的程序时很方便
除非注明,文章均为灯火部落原创,转载请注明出处:IT求职知识:基础知识2(c++理论篇)-灯火部落