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

  1. 1、本文档共43页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
5.1 动 态 对 象 5.2 引 用 现在可以像数组下标运算符一样给下标运算表达式赋值,例如: Vect v(10, 10); v[x]=20; v[y]=30; 上面的程序中定义了一个静态的整型变量dummy,目的是防止在调用下标运算符时传入非法的字符串。要注意,如果不将其说明为静态变量,则程序将可能发生意想不到的错误。例如计算下面的表达式: v[z]=10; 实际上是给局部变量dummy赋值,而如果dummy说明为自动变量,则在退出该函数时,dummy变量所占用的空间已经被释放,此时给其赋值将产生意想不到的结果。所以在使用引用返回值时,应注意不能返回局部自动变量的引用,编译器不能检测该错误。 5.2.5 对象的复制 C++程序在执行过程中有时会将一个对象复制到另一个对象。将一个对象赋值给另一个对象,此时第一个对象被拷贝到第二个对象中,或者在对象定义时,使用同类对象作为初值来创建和初始化一个对象。下面的片断中将对象b的值复制到对象a,对象d的值复制到对象c。 Point a,b,d; Point c=d; ... a=b; 另外,当对象作为参数传递给函数时,或从函数返回一个对象时同样会发生对象的复制。在缺省的情况下,C++采取位复制的方式来完成对象的复制,即将被复制对象所占用的存储空间的内容原样复制到目标对象中去。位复制方式对一些特殊的类将会产生错误,试看下面的例子: #include iostream.h #include string.h class StringClass{ char * str; public: StringClass(char *s); ~StringClass( ); Print( ){coutstr\n;} }; StringClass::StringClass(char *s) { str=(char *)malloc(strlen(s)+1); strcpy(str,s); } StringClass::~StringClass( ) { free(str); } void main( ) { StringClass s1(Test); StringClass s2=s1; s1.Print( ); s2.Print( ); } 该程序定义了一个StringClass类,包含一个指针类型的数据成员,在构造函数中分配存储空间,然后在析构函数中释放这部分存储空间。主程序中定义了一个对象s1,然后用s1初始化对象s2。 由于采取位复制方式,因此对象s1和s2的成员str的值相同。指向相同的存储空间。当主程序结束运行时,对象s1和s2被分别调用析构函数,str所指向的存储空间将被两次调用free函数来释放。 同样类似的问题也会出现在赋值运算和函数参数或返回值的使用上,例如下面的函数: StringClass NewString(char * s) { StringClass s1(s); return s1; } * 第 5 章 指针与引用 5.1 动态对象 5.2 引用 返回主目录 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

您可能关注的文档

文档评论(0)

118压缩包课件库 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档