面向对象程序设计语言C+++-+第4章+深入类与对象.ppt_第1页
面向对象程序设计语言C+++-+第4章+深入类与对象.ppt_第2页
面向对象程序设计语言C+++-+第4章+深入类与对象.ppt_第3页
面向对象程序设计语言C+++-+第4章+深入类与对象.ppt_第4页
面向对象程序设计语言C+++-+第4章+深入类与对象.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

面向对象程序设计语言C+,电子科技大学示范性软件学院,1,第四章深入类和对象,4.1构造函数4.1.1构造函数的作用在第三章讨论的的类Date中,有一个专门负责初始化对象状态的函数InitDate()。这个函数在对象创建后被显式地调用。这个步骤非常的重要,否则,类对象将处在一个未知的状态,其后续的操作也将会得到未知的结果。但问题是,程序员有的时候会忘记了调用初始化函数,或者调用了多次。这都是不好的现象。,2,第四章深入类和对象,4.1构造函数4.1.1构造函数的作用C+为类设计了构造函数(constructor)机制,它可以达到自动初始化数据成员的目的。类的构造函数是类的一个特殊成员函数,它没有返回类型(void也不行),可以有参数,函数名和类名一样。当创建类的一个新对象时,自动调用构造函数,完成初始化工作(需要注意构造函数是否有参数,以及参数的个数、类型)。,3,第四章深入类和对象,4.1构造函数4.1.1构造函数的作用构造函数的作用为:(1)分配一个对象的数据成员的存储空间;(该功能由系统自动完成。)(2)执行构造函数(体),一般是初始化一个对象的部分或全体数据成员。,4,第四章深入类和对象,4.1构造函数4.1.2构造函数的定义1.构造函数的定义例:为Date类添加构造函数classDateprivate:intyear,month,day;public:Date(inty,intm,intd);/其它成员;构造函数的参数可以是缺省的。,5,第四章深入类和对象,4.1构造函数4.1.2构造函数的定义2.构造函数的初始化方式构造函数有两种方式初始化数据成员:1)在构造函数体内用赋值语句的方式;Date(inty,intm,intd)year=y;month=m;day=d;,6,第四章深入类和对象,4.1构造函数4.1.2构造函数的定义2)用构造函数的初始化列表的方式。构造函数的初始化列表是一种特殊的机制。它的语法如下:构造函数名(参数列表):成员名(表达式),成员名(表达式)Circle(intxc,intyc):x(xc),y(yc),7,第四章深入类和对象,4.1构造函数4.1.2构造函数的定义3.缺省的构造函数用户定义的类类型中,可以没有构造函数。此时编译器会自动给该类类型生成一个没有参数的构造函数,该函数不作任何工作。这种构造函数称为缺省的构造函数。当建立一个对象时,这个缺省的构造函数被自动调用。不过,一旦一个类有一个显式定义的构造函数,哪怕这个函数是个空函数,编译器也不会代劳生成缺省构造函数了。,8,第四章深入类和对象,4.1构造函数4.1.2构造函数的定义4.定义类对象时给构造函数提供参数1)仅仅只有一个参数:类名对象名=参数;2)有一个或多个参数:类名对象名(参数列表);,9,第四章深入类和对象,4.1构造函数4.1.3重载构造函数一个类可以提供多个构造函数,用于在不同场合进行类对象的初始化工作。很明显,这是构造函数的重载,它们的参数表必须互不相同。classDatepublic:Date(intd,intm,inty);Date();Date(constchar*dateStr);,10,第四章深入类和对象,4.2析构函数与构造函数对应的是析构函数。C+通过析构函数来处理对象的善后工作。析构函数没有返回类型,没有参数,函数名是类名前加“”。析构函数的作用为:(1)执行析构函数(一般没有具体的工作);(2)释放对象的存储空间。(该功能由系统自动完成。)(3)释放对象占用的资源。这项工作要有程序员设定。,11,第四章深入类和对象,4.2析构函数可以使用完全限定名方式显式地调用析构函数;若没有显式调用,则在一个对象的作用域结束时,系统自动调用析构函数。系统自动调用构造函数和自动调用析构函数的顺序是相反的。classXpublic:X()X();(ex4-8.cpp),12,第四章深入类和对象,4.3拷贝构造函数1.什么是拷贝构造函数构造函数的参数可以是任何类型参数,甚至可以将自己类对象的(常量)引用作为参数,称它为拷贝构造函数。拷贝构造函数有两个含义:首先,它是一个构造函数,当创建一个新对象时,系统自动调用它;其次,它将一个已经定义过的对象(参数代表的对象)的数据成员逐一对应地拷贝给新对象。,13,第四章深入类和对象,4.3拷贝构造函数1.什么是拷贝构造函数classXpublic:X();X(constX/b调用自己的拷贝构造函数来复制a,14,第四章深入类和对象,4.3拷贝构造函数1.什么是拷贝构造函数如果一个类没有显式定义拷贝构造函数,C+编译器可以为该类产生一个缺省的拷贝构造函数。这个缺省的拷贝构造函数采用C的方式,将拷贝对象的内存一个字节一个字节的拷贝到被拷贝对象的内存当中。这样一来,两个对象的内存映像是一模一样的。,15,第四章深入类和对象,4.3拷贝构造函数2.拷贝构造函数的作用拷贝构造函数的作用是:创建一个新对象,并将一个已存在的对象拷贝到这个新对象对象的值做参数(将实参对象拷贝给形参对象)函数返回一个对象(拷贝返回的对象给一个临时对象)(ex4-9.10.cpp),16,第四章深入类和对象,4.3拷贝构造函数3.为什么需要拷贝构造函数我们往往会忽略为一个类显式地提供拷贝构造函数。此时C+编译器会为这个类产生一个缺省的拷贝构造函数。缺省的拷贝构造函数采用内存拷贝的形式,将已存在对象的内存一个字节一个字节地拷贝到新建对象的内存当中。这样一来,新对象和老对象的内存映像是一模一样的,我们可以说,新对象是老对象的“克隆体”。,17,第四章深入类和对象,4.3拷贝构造函数3.为什么需要拷贝构造函数在一般情况下,这个缺省的拷贝构造函数工作得很好,但是,在一些特殊的情况下,它却表现得有问题。请看例子ex4-11。,18,第四章深入类和对象,4.3拷贝构造函数3.为什么需要拷贝构造函数在C+中,类是一种用户定义的类型,可能比较简单,也可能很复杂,系统难以把握。当类的对象本身作为函数参数、函数的返回值或者其他需要拷贝类对象的情况下,系统很难提供一个统一的拷贝函数以适应各类对象的拷贝。因此,C+设置拷贝构造函数,不管拷贝构造函数是缺省的,还是由用户提供,它都属于一个具体的类。这样,当需要拷贝类对象时,C+调用这个类的拷贝构造函数。,19,第四章深入类和对象,4.4对象的创建、释放和初始化1.对象的创建和释放可以创建不同形式的各类对象:命名的自动对象每次进入该对象的作用域,都需要调用构造函数;每次退出该对象的作用域,都需要调用析构函数。,20,第四章深入类和对象,4.4对象的创建、释放和初始化1.对象的创建和释放classTable;voidf(inta)Tableaa;/aa的生命期到f函数返回Tablebb;/bb的生命期到f函数返回if(a0)Tablecc;/cc的生命期到if语句结束Tabledd;/dd的生命期到f函数返回;若调用函数f,则调用构造函数的顺序是:aa、bb、cc、dd;调用析构函数的顺序是:cc、dd、bb、aa。,21,第四章深入类和对象,4.4对象的创建、释放和初始化1.对象的创建和释放可以创建不同形式的各类对象:自由对象(动态对象)使用new创建对象(实际上调用构造函数),使用delete释放对象(实际上调用析构函数);当使用delete释放对象后,该对象就不能再被使用。另外,如果构造函数有参数,也必须给出实参。(ex4-13.cpp),22,第四章深入类和对象,4.4对象的创建、释放和初始化2.对象的初始化初始化有许多表示法,C+语言允许下述三种表示方法。C风格的初始值表的方法赋值表达式的方法表达式表的方法Class_NameObject();Class_NameObject=;,23,第四章深入类和对象,4.5对象和指针4.5.1this指针C+为所有非静态成员函数提供了一个称为this的指针,因此,常常称成员函数拥有this指针。this是一个隐含的指针,不能被显式声明,它只是一个形参,一个局部变量,它在任何一个非静态成员函数里都存在,它局部于某一对象。this指针是一个常指针,可以表示为(但不能显式声明):X*constthis;,24,第四章深入类和对象,4.5对象和指针4.5.1this指针可以使用const说明符将this声明为指向常量的常指针。在类中,一个成员函数的原型后跟一个const,该函数称为const成员函数,它的特点是该函数不能修改this所指的对象的成员。例(ex4-14.cpp):intGetInt()const;this指针主要用在运算符重载、自引用等场合。(ex4-15.cpp),25,第四章深入类和对象,4.5对象和指针4.5.2指向类对象的指针在C+中,可以直接使用对象,也可通过指向对象的指针变量来使用对象。说明指向对象的指针变量的语法与说明指向其他任何数据类型的指针变量的语法相同。One_Class_Name*obj_pointer;可以通过指向对象的指针变量-类的公有成员的方式在类外访问一个类的成员。(ex4-16.cpp),26,第四章深入类和对象,4.5对象和指针4.5.3指向类的成员的指针C+语言中,可以说明指向类的数据成员的指针和指向类的成员函数的指针。这两种指针必须与对象或指向对象的指针结合使用。,27,第四章深入类和对象,4.5对象和指针4.5.3指向类的成员的指针1.指向类的数据成员的指针指向类的数据成员的指针定义格式为:类型名类名:*指针;这种说明不是说指针是属于类的,而是说明指针只能指向指定类的指定类型的成员。(ex4-17.cpp),28,第四章深入类和对象,4.5对象和指针4.5.3指向类的成员的指针2.指向类的成员函数的指针指向类的成员函数的指针定义的格式为:类型名(类名:*指针)(参数表);同样的道理,函数指针并不属于类,而是只能指向类的指定原型的函数。(ex4-18.cpp),29,第四章深入类和对象,4.6友元关系一个对象的私有数据,只能通过成员函数进行访问,这是一堵不透明的墙。这种限制性的用法给两个类必须共享同一函数的情形带来了较大的开销。出于效率(而非技术上必须)考虑,C+提供了一种辅助手段,允许外面的类或函数去访问一个类的私有数据。类X的友元F可以是一个函数也可以是一个类,它虽然不是X的成员函数,但能访问X的私有成员和保护段的成员,除了具有这一访问权限外,F在作用域、声明和定义等方面都是一普通的函数(或类)。,30,第四章深入类和对象,4.6友元关系4.6.1友元函数classINTEGERprivate:intnum1;friendvoidPrint(constINTEGER函数Print可以访问类INTEGER的任何成员。友元函数不属于任何类,因此友元函数没有this指针,这是友元函数与成员函数的主要区别。友元函数的声明可以放在类的任何段里。,31,第四章深入类和对象,4.6友元关系4.6.2友元类classPrinter;classINTEGERprivate:intnum1;friendPrinter;类Printer的成员函数可以访问类INTEGER的任何成员。,32,第四章深入类和对象,4.6友元关系4.6.3友元关系的总结友元具有如下的特性:非传递性。即A是B的友元,B是C的友元,但A不一定是C的友元(除非将A声明为C的友元);非对称性。即A是B的友元,但B不一定是A的友元(除非将B声明为A的友元)。,33,第四章深入类和对象,4.7与类和对象相关的问题4.7.1对象数组可以像创建任何其他数据类型的数组一样的方式来创建一个类的对象数组。创建一个对象数组,每个数组元素都是一个对象,所以需要多次调用构造函数;释放对象数组,也需要多次调用析构函数。One_Class_Nameobj_array10;,34,第四章深入类和对象,4.7与类和对象相关的问题4.7.1对象数组C+语言不允许初始化对象数组,所以,要创建一个类的对象数组,该类的构造函数必须满足下列三个条件之一:没有构造函数;有构造函数,但要有一个构造函数不带参数;有构造函数,但要有一个构造函数具有的参数全是缺省参数。(ex4-22.cpp),35,第四章深入类和对象,4.7与类和对象相关的问题4.7.2类类型做参数类型由于类是一个数据类型,也可以将对象作为参数传递给函数,参数传递遵循传值(或传地址)的方式,这同所有其他的数据类型是相同的。类类型做形参类型,一般有3种方式:对象本身做参数(传值)对象引用做参数(传地址)对象指针做参数(传值)(ex4-23.cpp),36,第四章深入类和对象,4.7与类和对象相关的问题4.7.2类类型做参数类型对象本身做参数,对形参的任何修改都不影响用作实参的对象;对象引用做参数,对形参的任何修改就是对实参的对象的修改;对象指针做参数,对它指向的对象作任何修改就是对实参对象的修改。,37,第四章深入类和对象,4.7与类和对象相关的问题4.7.3类类型常量类类型常量的基本形式为:类名(常量表)(ex4-24.cpp),38,第四章深入类和对象,4.7与类和对象相关的问题4.7.4一个类的对象作为另一个类的成员一个类的对象可以作为另一个类的数据成员,简称为对象作为成员,实现的是整体和部分之间的关系(apartof),即对象的包含关系,有时也称为类之间的“复合”(composition)。可以通过外部对象名.内部对象

温馨提示

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

评论

0/150

提交评论