c课件第10章指针和引用高级应用.pptx_第1页
c课件第10章指针和引用高级应用.pptx_第2页
c课件第10章指针和引用高级应用.pptx_第3页
c课件第10章指针和引用高级应用.pptx_第4页
c课件第10章指针和引用高级应用.pptx_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第10章指针和引用高级应用,-2-,本章内容安排,堆中的数据成员 const修饰指针 数据保护 指针和引用的陷阱,-3-,1、指针数据成员,类中可能会包含指针数据成员,每个指针指向堆中的对象。通常在构造函数(或其它成员函数)中分配内存,在析构函数中释放内存。 含有指针数据成员的类,都要编写析构函数释放内存,编译器提供的缺省析构函数不会释放内存,将造成内存泄漏。,-4-,2、SimpleCat类,class SimpleCat public: SimpleCat(); SimpleCat(); int getAge() const return *itsAge; int getWeight()const return *itsWeight; void setAge(int age ) *itsAge=age; void setWeight(int weight) *itsWeight=weight; private: int *itsAge; int *itsWeight; ;,为含有指针成员的类编写构造与析构函数。,-5-,SimpleCat类,SimpleCat:SimpleCat() itsAge = new int(2); itsWeight = new int(5); SimpleCat:SimpleCat() delete itsAge; delete itsWeight; ,在构造函数中分配内存,在析构函数中释放内存。 在堆中分配内存时,通过()可以指定初始值,将itsAge所 指单元初始化为2,将itsWeight所指单元初始化为5。,int *p=new int,分配1个数据 不初始化 int *p=new int(2),分配1个 数据,初始化为2 int *p=new int10,分配10 个数据,不初始化。,-6-,堆中创建对象,#include int main() SimpleCat *myCat = new SimpleCat; std:coutgetAge() setAge(4); std:coutgetAge() “ years old.n“; delete myCat; return 0; ,-7-,内存结构,SimpleCat *myCat = new SimpleCat; . /使用myCat delete myCat;,X,new,构造函数,delete引起 析构函数,X,-8-,3、this指针,每个成员函数都有一个隐含的参数,this指针,是指向其函数被调用的对象。 this指针由编译器隐含插入,通常情况下不需要访问this指针,也可以显示使用。 主要用途:在特殊情况下可以获得对象自身的地址。 setAge( int age ); setAge( SimpleCat* const this, int age );,程序员无需维护this指针的创建和销毁,由编译器完成。,-9-,使用this的Rectangle类,class SimpleCat public: Rectangle() itsWidth=5; itsLength=10; Rectangle() int getLength() const return this-itsLength; int getWidth() const return itsWidth; void setLength(int length) this-itsLength=length; void setWidth(int width) itswidth=width; private: int itsLength; int itsWidth; ;,-10-,本章内容安排,堆中的数据成员 const修饰指针 数据保护 指针和引用的陷阱,const修饰指针,三种形式 int number=5; const int *pOne = ,-11-,pOne:指向整型常量的指针,通过pOne不能修改所指向变量 的值;但可以指向别的整数。,const修饰指针,三种形式 int number=5; const int *pOne = ,-12-,pTwo:指向整型的常量指针,pTwo不能再指向其它变量, 但可以通过指针修改所指向变量的值。,const修饰指针,三种形式 int number=5; const int *pOne = ,-13-,pThree:指向整型常量的常量指针,pThree不能再指向其它 变量,通过指针也不能修改所指向变量的值。,const修饰指针,三种形式 int number=5; const int *pOne = ,-14-,若const位于*号左侧,表示指向内容为常量(内容受保护) 若const位于*号右侧,表示指针本身为常量(指针受保护),常对象与指向常对象的指针,类的常成员函数中不能修改对象的数据成员,否则编译器会报错。 定义常对象后,通过对象只能调用其常成员函数。 定义指向常对象的指针后,通过该指针也只能调用常成员函数。,-15-,-16-,Rectangle类,class Rectangle public: Rectangle() : itsWidth(5), itsLength(10) Rectangle() void setLength( int length) itsLength=length; void setWidth( int width) itsWidth = width; int getLength()const return itsLength; int getWidth()const return itsWidth; private: int itsLength; int itsWidth; ;,通过初始化列表对数据成员进行初始化。 11章再详细讨论。,-17-,主程序,#include int main() Rectangle *pRect = new Rectangle; const Rectangle *pConstRect = new Rectangle; Rectangle *const pConstPtr = new Rectangle; pRect-setWidth(20); /pConstRect-setWidth(20); pConstPtr-setWidth(30); std:coutgetWidth()getWidth()getWidth()“n”; return 0; ,-18-,本章内容安排,堆中的数据成员 const修饰指针 数据保护 指针和引用的陷阱,传递引用和指针的副作用,函数传递引用或地址,可以提高效率,避免构造与析构函数的调用开销,但也会产生副作用。 在函数内部,通过引用或地址,可以间接修改原始数据,从而造成意外的修改或破坏。 为了保护实参不被意外修改,通常使用const限定形参。,-19-,-20-,SimpleCat类,#inlcude class SimpleCat public: SimpleCat(); SimpleCat(SimpleCat,-21-,SimpleCat类,SimpleCat:SimpleCat( SimpleCat ,-22-,1、按值传递,SimpleCat FunctionOne( SimpleCat theCat ) return theCat; int main() SimpleCat myCat; FunctionOne(myCat); return 0; ,调用函数时创建theCat,调用复制构造函数复制myCat 内容;函数返回后调用析构函数,并销毁theCat。 函数返回时创建临时对象,调用复制构造函数复制 theCat的内容;最后要析构并销毁临时对象。,-23-,2、通过指针提高效率,SimpleCat* FunctionOne( SimpleCat *theCat ) return theCat; int main() SimpleCat myCat; FunctionOne( ,theCat只是局部指针变量,接收myCat的地址,不会 引起对象的复制构造以及返回后的析构函数调用。 函数返回临时指针变量,保存的是theCat存储的地址 值,不会引起对象的复制构造以及析构。 问题:函数中通过theCat可以修改myCat。,-24-,3、const指针保护数据,const SimpleCat* const FunctionTwo( const SimpleCat * const theCat ) / theCat-setAges(10); return theCat; int main() SimpleCat myCat; FunctionTwo( ,传递的参数是指向常对象的常量指针,编译器禁止在 函数内修改theCat,起到保护作用。,-25-,4、通过引用提高效率,SimpleCat ,theCat是myCat的引用,不会引起构造及析构。 返回的临时引用是theCat的引用,也就是对myCat的 引用,不会引起构造与析构。 传递引用不会创建新的对象,引用只是别名。,-26-,5、const引用保护数据,const SimpleCat ,传入的参数是const引用,编译器禁止在函数内修改 theCat,起到保护作用。,引用和指针的使用时机,引用更加清晰、简单,相对容易使用。 引用不能重新赋值,如果需要依次指向不同的对象,只能使用指针。 引用不能为NULL,如果指向的对象可能为NULL,必须使用指针。 如果需要在堆中分配内存,必须使用指针。,-27-,-28-,本章内容安排,堆中的数据成员 const修饰指针 数据保护 指针和引用的陷阱,-29-,SimpleCat类,class SimpleCat public: SimpleCat(int age, int weight) : itsAge(age), itsWeight( weight) SimpleCat() int getAge() const return itsAge; int setWeight( )const return itsWeight; private: int itsAge; int itsWeight; ;,通过初始化列表对数据成员进行初始化。,-30-,不要返回局部对象的引用,SimpleCat ,myCat是局部对象,函数返回后myCat将被系统自动清理 此时返回的引用引用了一个不存在的对象。,-31-,不要返回局部对象的地址,SimpleCat* TheFunction( ) SimpleCat myCat(5,9); return ,myCat是局部对象,函数返回后myCat将被系统自动清理 此时返回的指针指向了一个不存在的对象。,-32-,返回指向堆中对象的引用,SimpleCat ,返回堆中对象的引用后,在main函数中释放。 delete后,rCat引用空对象,非常危险!,-33-,返回指向堆中对象的地址,SimpleCat* TheFunction( ) SimpleCat *pCat = new SimpleCat(5,9); return pCat; int main() SimpleCat *pCat = TheFunction(); std:coutgetAge() “ years old!n“; delete pCat; pCat = NULL; return 0; ,1个函数中分配内存,返回指针,由调用函数 释放内存的做法容易出现内存泄漏!,内存请求与释放的责任,让一个函数分配内存,而另一个函数负责释放的做法比较危险,会导致遗忘释放或重复释放。 建议的原则:分配内存的函数负责释放内存,调用其它函数时,按地址或引用方式传参

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论