C++面试题知识点记录

这几天打算看下《剑指offer》这本书,相关知识要点记录下。

1. 空类型大小

一个空类型实例大小为1字节,由编译器确定。增加普通成员函数至于类型并不会增加类型实例的大小,增加需函数则会多出虚表的指针。

下面写下自己的理解,感觉书中的解释模糊带有误导性。

为什么普通成员函数就不会增加类型实例大小,是因为普通成员函数是在编译期进行对函数调用进行地址替换。

为什么需要虚表,因为虚函数调用是运行期动态决定的,所以必须每个实例需要包含虚表。

2.复制构造函数必须以引用传参,不然会递归死循环。

3. Type Array[10]; 虽然Array本质上是指针,但是代表的其实是声明时的整个数组,所以与指针类型有所区别,sizeof为整个数组大小。

4. 如果函数中要改变指针的指向,必须传参的时候用指针传参或者引用传参。如果传递的是要改变的指针,就与其他类型的传值一样了,只是改变了参数的临时拷贝对象而已。

(被坑过,记录在案!)

5.关于删除链表节点的另一种思维(已知需删除节点的指针pDeleteNode)。常规思维,我们删除一个链表会先首先考虑找到需要被删除链表的前一个节点,但这通常寻找前一个节点需要O(n)的时间去从链表头开始遍历。另一种思维,copy需删除的节点的下一个节点覆盖前者,然后删除后者。

6.很多链表问题可以使用双指针解决(快慢指针):

例如1:找到倒数第k个节点,可以一个指针先走k-1步,然后与另一个从头开始的指针同时向后遍历,当前一个指针到达链表尾的时候,后指针也就到达倒数k节点。

例如2:检查是否链表有环,可以一个指针每次走1步,一个每次走2步,如果有环总会相遇,没环就到达尾节点。

posted on 2013-07-31 11:13  DoubleZ  阅读(211)  评论(0)    收藏  举报

导航