rambo

面试语法糖C++(二)

1、vector的size()和capacity()

关于size()

vector对象的size()操作返回vector类定义的size_type的值。使用size_type类型时,必须指出该类型在哪定义。

vector<int>::size_type

如果ivec为空则size返回0,比较ix和0。第一次循环时,由于ix本身为0,则条件测试失败,一次也不执行。

Tips:C++程序员习惯于优先选用!=而不是<来编写循环判断条件。调用size函数而不保存它返回的值。循环可以容易的增加新元素,导致size值变化。所以倾向于在每次循环中测试size的当前值。

C++中有些函数声明为内联(inline),编译器遇到时就会直接扩展相应代码,而不进行实际函数调用。

关于capacity()

为了支持快速的随机访问,vector容器的元素以连续的方式存放。当容器中没有空间容纳新的元素,vector必须重新分配存储空间。问题来了,如果vector容器在每次添加新元素时,都要进行分配和撤销内存空间,性能将会非常慢。对于不连续存储元素的容器,不存在这样的内存分配问题。

想当然的认为:list容器优于vector容器。但实际上,对于大部分应用,使用vector容器最好。

有这样的内存分配策略:以最小的代价连续存储元素,带来的访问元素的便利弥补其存储代价。一般,其实际分配的容量比当前所需的空间多一些。

size()指容器当前拥有的元素个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素总数。

2、struct和class区别

当你觉得你要做的更像是一种数据结构的话,那么用struct,如果你要做的更像是一种对象的话,那么用class。如果查看stl各个容器的源码,会发现struct的用处。

  • 默认继承权限,如果不指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
  • 成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。以上两点也是struct和class最基本的差别,也是最本质的差别。

1)若类和结构体所有数据成员均为public型,可采取如下带花括号形式进行初始化。

《windows核心编程》中我们会遇到:STARTUPINFO si = { sizeof(si) } ,就是对si结构体的初始化。

2)若数据成员有private或protected型,或是提供了构造函数,必须使用构造函数来进行初始化。

重要提示:

如果os3已经存在了,则表示用一个临时对象赋值给os3,将调用operator=,然后系统再释放这个临时产生的对象。系统默认的=运算是将源对象的数据成员的值复制到目标对象中的数据成员中。

3)struct能继承,来自struct的继承按照public继承处理。

myqqq

4)struct能支持多态。

如果是class的父类是struct关键字描述的,那么默认访问属性是什么?
当出现这种情况时,到底默认是public继承还是private继承,取决于子类而不是基类。class可以继承自struct修饰的类;同时,struct也可以继承自class修饰的类,继承属性如下列描述: