- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第5 章 指针与引用
5.1 动态对象
5.2 引用
返回主目录
5.1 动态对象
5.1.1 动态对象与new、delete运算符
在前面章节的例子中,对象都是自动创建的,程序中定义
的是自定义类型的全局变量或局部的自动变量,对象在进入
其作用域时被创建,在超出其作用域时被销毁。但有一些数
据结构,如链表,在C语言中通常采取动态分配存储空间的
方法,在程序运行过程中调用内存分配函数为链表的结点分
配存储空间。
在C++ 中,一个类的对象也可以动态创建,在程序执行
的过程中分配存储空间。动态对象的使用方法与一般的数据
类型动态创建的方法基本相同,但分配和释放存储空间不再
使用C语言中的malloc 、free等动态内存管理函数,而是使用
C++语言提供的两个运算符new 、delete来实现。下面是一个
简单的程序片断:
class Point{
int xVal,yVal;
public:
Point( ){xVal=yVal=0;}
Point(int x, int y){xVal=x; yVal=y;}
};
Point *p1,*p2;
p1= new Point;
p2= new Point(10, 10);
...
delete p1;
delete p2;
程序片断中定义了两个Point类的指针变量p1 、p2 ,然
后用new运算符后跟类名创建动态对象。与C语言中动态存
储空间分配函数不同的是,new运算符除了分配存储空间之
外,还调用类的构造函数,如果构造函数有参数,则在类
名后将参数传递给构造函数,如上面程序片段中的第二个
new运算符表达式,调用Point类的第二个构造函数构造Point
类对象;如果没有构造函数或构造函数没有参数,则可以
使用上面片断中的第一个new运算符表达式动态构造对象。
如果不能缺省构造,则必须指定对应构造函数的参数以初
始化该动态对象。
与malloc等库函数一样,new运算符操作也可能失败,
可以通过检测返回值是否为0来判断是否失败。
delete运算符用于销毁一个动态对象,除了释放该动态对
象所占用的存储空间之外,还会调用对应类的析构函数。在程
序中决不要忘了销毁动态对象,因为动态对象不会在超出其作
用域时被自动销毁。
new 与delete 运算符也可以用于创建和销毁动态对象数
组,例如:
Point *p;
p=new Point[5]; //创建动态对象数组
delete [ ]p; //释放动态对象数组
要注意的是,如果Point类没有缺省的不使用参数的构造
方法,上面动态对象数组的构造方式是错误的,在Borland
C++3.1编译器中将得到如下的错误信息:
Cannot find default constructor to initialize array element
of type Point
在使用delete运算符销毁动态对象数组时,在指针变量名
前加[ ]符号表示该指针指向的存储空间是对象数组。早期的
C++语言版本中要求给出数组的大小,目前的C++语言标准中
对此不再要求。在Borland C++3.1编译器中,可以给出数组大
小,但编译器将忽略数组的大小。
new和delete运算符也可以用于一般的数据类型,作用与
malloc和free等库函数的作用相当,下面的str定义是等价的:
char * str = (char *)malloc(20) ;
char * str = new char[20] ;
在两种情况中,str都被设置为指向内存空间中被动态分
配的20个字符序列的指针,malloc被指定需要分配的字符个
数,返回void 指针,然后将该指针转换为所需要的指针类
型;new接收数据类型作为操作数,表达式的值为该数据类
型的指针,使用new可以避免不必要的数据类型转换。使用
new 、delete方式程序更
文档评论(0)