- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
vc动态数组实现
vc动态数组实现
vc动态数组实现2010-07-04 19:18数组类型的变量有三个重要的限制:数组长度固定不变,在编译时必须知道其长度,数组只在定义它的块语句内存在.
实际的程序往往不能忍受这样的限制---它们需要在运行时动态地分配数组.虽然数组长度是固定的,但动态分配的数组不必在编译时知道其长度,可以(通常也是)在运行时才确定数组长度.与数组变量不同,动态分配的数组将一直存在,知道程序显式释放它为止.
每一个程序在执行时都占用一款可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区(free store)或堆(heap).C语言程序使用一对标准库函数malloc和free在自由存储区中分配存储空间,而C++语言则使用new和delete表达式实现相同的功能.
1.动态数组的定义
数组变量通过指定类型、数组名和维数来定义.而动态分配数组时,只需指定类型和数组长度,不必为数组对象命名,new表达式返回指向新分配数组的第一个元素的指针:
int*pia=new int[10];//array of 10 uninitialized ints
此new表达式分配了一个含有10个int型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了之怎pia.
new表达式需要指定指针类型以及在方括号中给出的数组维数,该维数可以是任意的复杂表达式.创建数组后,new将返回指向数组第一个元素的指针.在自由存储区中创建的数组对象是没有名字的,程序员只能通过其地址间接地访问堆中的对象.
2.初始化动态分配的数组
动态分配数组时,如果数组元素具有类类型,将使用该类的默认构造函数实现初始化;如果数组元素是内置类型,则无初始化:
string*psa=new string[10];//array of 10 empty strings int*pia=new int[10];//array of 10 ninitialized ints
这两个new表达式都分配了含有10个对象的数组.其中第一个数组是string类型,分配了保存对象的内存空间后,将调用string类型的默认构造函数依次初始化数组中的每个元素.第二个数组则具有内置类型的元素,分配了存储10个int对象的内存空间,但这些元素没有初始化.
也可使用跟在数组长度后面的一对空圆括号,对数组元素做值初始化:
int*pia2=new int[10]();//array of 10 uninitialized ints
圆括号要求编译器对数组做值初始化,在本例中即把数组元素都设置为0.
注解:对于动态分配的数组,其元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值.
3.const对象的动态数组
如果我们在自由存储区中创建的数组存储了内置类型的const对象,则必须为这个数组提供初始化:因为数组元素都是const对象,无法赋值.实现这个要求的唯一方法是对数组做值的初始化:
//error:uninitialized const array const int*pci_bad=new const int[100];//ok:value-initialized const array const int*pci_ok=new const int[100]();
C++允许定义类类型的const数组,但该类类型必须提供默认构造函数:
//ok:array of 100 empty strings const string*pcs=new const string[100];
在这里,将使用string类的默认构造函数初始化数组元素.
当然,已创建的常量元素不允许修改--因此这样的数组实际上用处不大.
4.允许动态分配空数组
之所以要动态分配数组,往往是由于编译时并不知道数组的长度.我们可以编写如下代码
size_t n=get_size();//get_size returns number of elements needed int*p=new int[n];for(int*q=p;q!=p+n;++q)/*process the array*/;
计算数组长度,然后创建和处理该数组.
有趣的是,如果get_size返回0会怎么样?答案是:代码仍然正确执行.C++虽然不允许定义长度为0的数组变量,但明确指出,调用new动态创建长度为0的数组是合法的:
char arr[0];//error:cannot define zero-length array char*cp=new char[0];//ok:but cp cant be dereferenced
用new动态创建长度为0的数组时,new返回有效的非零指针.该指针与n
原创力文档


文档评论(0)