C++ primer第二次阅读学习笔记(第4章)

长平狐 发布于 2012/10/08 15:17
阅读 74
收藏 0

C++语言应尽量使用vector和迭代器类型,应避免使用低级的数组和指针,涉及良好的程序只有在强调速度时才在类实现的内部使用数组和指针。因此要向成为一个真正的C++程序员就要多使用vectorstring来替代数组和c风格字符串。

数组的维数必须用整型常量指定,非const类型或是到运行时才知道其值的const变量都不能用于定义数组的维数。

在没有显式提供元素的初始时数组元素会像普通元素一样初始化。若在函数体外定义的数组,所有元素将会被初始化为0,若是在函数体外定义的数组,其元素不会被初始化。如果数组元素为类类型,无论数组在哪里定义,都会自动调用类的默认构造函数来初始化。如果类没有默认构造函数,则必须为数组的元素提供显式的初始化。这一点与vector类似。

vector中的size_type类似,数组下标的正确类型为size_t;头指针和尾指针只差的正确类型为ptrdiff_t,它是signed类型。

使用指针不当易导致错误发生,应将未初始化的指针初始化为NULL,因为编译器可以测出0值的指针。这在一定程度上可以避免指针未初始化就使用的情况。

void*类型的指针可以存储任何类型的指针。它表明该指针与某一地址值相关,但不清楚存储在此地址上的对象的类型。void*类型的指针只支持几种有限的操作:1,与另一个指针比较2,向函数传递void*指针或是从函数中返回void*指针。3,给另一个void*指针赋值。但是不允许使用void*操作它指向的对象。

实际中常把指向const的指针用作函数形参,以此确保传递给该函数的实际对象不会再函数中被修改。这也说明了,指向const的指针,既可以指向const对象也可以指向非const对象。

使用const定义变量时,const int a;int const a;是等价的。这样就容易导致混淆。如     

typedef int *IntPtr;

const IntPtr pp;

此时pp是什么类型呢。真正的类型应该是将pp定义为指向int类型的const指针。它等价于int * const pp;原因是在const  IntPtr  pp等价于IntPtr  const  pp, const作用于IntPtr类型。而不是跟const int a 一样作用于a。所以尽量写成IntPtr  const  pp这种形式,此时便不会误会。

动态分配数组时可以在数组长度后面加一对空圆括号,对数组的元素进行初始化。此时数组元素都被初始化为0;如int *array=new int[10]();

创建const对象的动态数组时必须为数组元素提供初始化,因为数组元素都是const对象。如const int *array=new const int[100]();

动态分配的数组空间要调用delete []进行释放。漏用【】,编译器无法发现此错误,会导致少释放内存空间,导致内存泄露。

String成员函数c_str()返回const类型的数组指针,因此不能被修改。另外一旦string对象被改变,c_str()返回的数组就会变为无效,也就是说c_str()返回的数组是在调用函数时才对string对象内容的拷贝,并不实时反映string对象的内容。

可以使用数组为vector对象初始化。如int a[]={20,41,52,54,63,54,36};vector<int> v(a,a+7);两个指针标示出vector初值的范围,第二个指针指向数组最后一个元素的后一个地址空间。

区分指针数组与行指针。如int *ptr[10],此为指针数组,int (*ptr)[10]此为行数组,p为指向具有10个元素的数组的指针。 

平时经常使用typedef  int *ptr;来简化操作。但是对于typedef int int_array[4];很不熟悉,可以参照typedef int *ptr;来理解。Int_array p;定义一个具体有四个元素的数组。而int_array *p定义一个指向具有四个元素数组的行指针


原文链接:http://blog.csdn.net/ithzhang/article/details/7573974
加载中
返回顶部
顶部