c++程序设计 陈圣国第5章.ppt

c++程序设计 陈圣国第5章.ppt

ID:50082085

大小:90.50 KB

页数:43页

时间:2020-03-08

c++程序设计 陈圣国第5章.ppt_第1页
c++程序设计 陈圣国第5章.ppt_第2页
c++程序设计 陈圣国第5章.ppt_第3页
c++程序设计 陈圣国第5章.ppt_第4页
c++程序设计 陈圣国第5章.ppt_第5页
资源描述:

《c++程序设计 陈圣国第5章.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第5章指针与引用5.1动态对象5.2引用返回主目录5.1动态对象5.1.1动态对象与new、delete运算符在前面章节的例子中,对象都是自动创建的,程序中定义的是自定义类型的全局变量或局部的自动变量,对象在进入其作用域时被创建,在超出其作用域时被销毁。但有一些数据结构,如链表,在C语言中通常采取动态分配存储空间的方法,在程序运行过程中调用内存分配函数为链表的结点分配存储空间。在C++中,一个类的对象也可以动态创建,在程序执行的过程中分配存储空间。动态对象的使用方法与一般的数据类型动态创建的方法基本相同,但分配和释

2、放存储空间不再使用C语言中的malloc、free等动态内存管理函数,而是使用C++语言提供的两个运算符new、delete来实现。下面是一个简单的程序片断:classPoint{intxVal,yVal;public:Point(){xVal=yVal=0;}Point(intx,inty){xVal=x;yVal=y;}};Point*p1,*p2;p1=newPoint;p2=newPoint(10,10);...deletep1;deletep2;程序片断中定义了两个Point类的指针变量p1、p2,然后用

3、new运算符后跟类名创建动态对象。与C语言中动态存储空间分配函数不同的是,new运算符除了分配存储空间之外,还调用类的构造函数,如果构造函数有参数,则在类名后将参数传递给构造函数,如上面程序片段中的第二个new运算符表达式,调用Point类的第二个构造函数构造Point类对象;如果没有构造函数或构造函数没有参数,则可以使用上面片断中的第一个new运算符表达式动态构造对象。如果不能缺省构造,则必须指定对应构造函数的参数以初始化该动态对象。与malloc等库函数一样,new运算符操作也可能失败,可以通过检测返回值是否为

4、0来判断是否失败。delete运算符用于销毁一个动态对象,除了释放该动态对象所占用的存储空间之外,还会调用对应类的析构函数。在程序中决不要忘了销毁动态对象,因为动态对象不会在超出其作用域时被自动销毁。new与delete运算符也可以用于创建和销毁动态对象数组,例如:Point*p;p=newPoint[5];//创建动态对象数组delete[]p;//释放动态对象数组要注意的是,如果Point类没有缺省的不使用参数的构造方法,上面动态对象数组的构造方式是错误的,在BorlandC++3.1编译器中将得到如下的错误信

5、息:Cannotfinddefaultconstructortoinitializearrayelementoftype'Point'在使用delete运算符销毁动态对象数组时,在指针变量名前加[]符号表示该指针指向的存储空间是对象数组。早期的C++语言版本中要求给出数组的大小,目前的C++语言标准中对此不再要求。在BorlandC++3.1编译器中,可以给出数组大小,但编译器将忽略数组的大小。new和delete运算符也可以用于一般的数据类型,作用与malloc和free等库函数的作用相当,下面的str定义是等价

6、的:char*str=(char*)malloc(20);char*str=newchar[20];在两种情况中,str都被设置为指向内存空间中被动态分配的20个字符序列的指针,malloc被指定需要分配的字符个数,返回void指针,然后将该指针转换为所需要的指针类型;new接收数据类型作为操作数,表达式的值为该数据类型的指针,使用new可以避免不必要的数据类型转换。使用new、delete方式程序更简洁易懂,试比较下面的两种方式:structPerson{char*name;intage;};Person*p=(

7、Person*)malloc(sizeof(Person));//C库函数方式Person*p=newPerson;//C++方式在C++语言程序中,两种方式都可以使用,但不能混合使用。malloc分配的存储空间使用库函数free释放,new分配的存储空间使用delete运算符释放。*5.1.2重载new与delete与其它运算符一样,new、delete运算符也可以重载,通过重载new、delete运算符,程序员可以改变编译器提供的动态存储管理机制。有两种方法来重载new和delete运算符。程序员可以定制全局缺

8、省运算符,从而影响所有的内存分配和释放。另一种方法是为特定的类重载这两个运算符,在不影响其它new和delete的情况下,为这个类定制动态对象。通常很少会重载全局的缺省new和delete运算符。下面介绍如何为特定类重载new和delete运算符。new和delete运算符在重载时应作为类的函数成员声明,它们缺省是静态的成员,无须声明。这意味着这些运算符不接

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。