欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第三章类和对象精选文档.ppt

    • 资源ID:69876597       资源大小:2.74MB        全文页数:86页
    • 资源格式: PPT        下载积分:18金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要18金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第三章类和对象精选文档.ppt

    第三章类和对象本讲稿第一页,共八十六页本讲稿第二页,共八十六页本讲稿第三页,共八十六页在在C C十十中,一个结构的成员通常分为十十中,一个结构的成员通常分为两类两类:私有成员私有成员(privateprivate)和和公有成员公有成员(publicpublic),),私有私有成员成员(包括数据和函数包括数据和函数)只能被该结构中的其它只能被该结构中的其它成员访问,而公有成员成员访问,而公有成员(包括数据和函数包括数据和函数)既可既可被结构内其它成员访问,也可被结构外的其它被结构内其它成员访问,也可被结构外的其它部分访问。部分访问。例如在上例中,变量例如在上例中,变量realreal和和imagimag只需要被该只需要被该结构的成员函数访问,则可声明为私有成员;结构的成员函数访问,则可声明为私有成员;四个成员函数需要在结构体外被调用,则可声四个成员函数需要在结构体外被调用,则可声明为公有成员。明为公有成员。C C十十规定,在缺省情况下,十十规定,在缺省情况下,结构中的成结构中的成员是公有的员是公有的,因此上例结构,因此上例结构complexcomplex中的成员都中的成员都是公有的。是公有的。本讲稿第四页,共八十六页本讲稿第五页,共八十六页2 类的声明类的声明 C十十提供了一种比结构类型更安全有效的数据类十十提供了一种比结构类型更安全有效的数据类型型类。类是类。类是C十十的一个最重要的特性。类与十十的一个最重要的特性。类与结构的扩充形式十分相似,其一般形式如下:结构的扩充形式十分相似,其一般形式如下:class 类名类名 private:私有数据成员和成员函数私有数据成员和成员函数 pubic:公有数据成员和成员函数公有数据成员和成员函数;其中:其中:class是声明类的关键字,类名是要声明的是声明类的关键字,类名是要声明的类的名字;后面的花括号表示出类的声明范围;最类的名字;后面的花括号表示出类的声明范围;最后的分号表示类声明结束。后的分号表示类声明结束。本讲稿第六页,共八十六页 类的声明内容包括类的声明内容包括数据和函数数据和函数。类中的数据。类中的数据和函数都是类的成员,分别叫做和函数都是类的成员,分别叫做数据成员数据成员和和成成员函数员函数。与结构的扩充形式一样。类的成员也分为私与结构的扩充形式一样。类的成员也分为私 有成员和公有成员。有成员和公有成员。私有成员私有成员用用privateprivate说明,说明,privateprivate下面的每一行下面的每一行,不论是数据成员还是成不论是数据成员还是成员函数员函数,都是私有成员。私有成员只能被该类的都是私有成员。私有成员只能被该类的成员函数访问,这是成员函数访问,这是C C十十实现封装的一种方法,十十实现封装的一种方法,即把特定的成员定义为私有的,就能严格地控即把特定的成员定义为私有的,就能严格地控制对它的访问。制对它的访问。公有成员公有成员用用publicpublic说明,说明,publicpublic下面的每一下面的每一行都是公有成员。公有成员可被程序中的其它行都是公有成员。公有成员可被程序中的其它函数访问,它们是类的对外接口。函数访问,它们是类的对外接口。本讲稿第七页,共八十六页实际上,在实际上,在C十十中,类十十中,类class和结构和结构struct是类似的因为是类似的因为C十十的结构与类一十十的结构与类一样都含有数据以及对这些数据进行的操样都含有数据以及对这些数据进行的操作。它们的作。它们的主要区别主要区别是缺省值不同:是缺省值不同:在在类中类中,缺省时成员是私有的缺省时成员是私有的,而,而在结构中在结构中,缺省时成员是公有的缺省时成员是公有的。本讲稿第八页,共八十六页本讲稿第九页,共八十六页 可以看出,类和结构的功能基本上相同。可以看出,类和结构的功能基本上相同。那那么在么在C C十十中为什么要用类代替结构呢十十中为什么要用类代替结构呢?原因原因是,在缺省的情况下,类成员是私有的,是,在缺省的情况下,类成员是私有的,类类提供了缺省的安全性提供了缺省的安全性。这一规定符合面向对。这一规定符合面向对象思想中数据隐藏的准则。数据隐藏使得类象思想中数据隐藏的准则。数据隐藏使得类中的成员比一般的局部变量得到更好的保护中的成员比一般的局部变量得到更好的保护本讲稿第十页,共八十六页类的几点说明类的几点说明 (1)(1)类的声明中的类的声明中的privateprivate和和publicpublic两个关键两个关键字可以按任意顺序出现任意次。但是,如果把字可以按任意顺序出现任意次。但是,如果把所有的私有成员和公有成员归类放在一起,程所有的私有成员和公有成员归类放在一起,程序将更加清晰。并且应该养成把所有的私有成序将更加清晰。并且应该养成把所有的私有成员放在公有成员前面的习惯,因为一旦用户忘员放在公有成员前面的习惯,因为一旦用户忘记了使用说明符记了使用说明符privateprivate,由于缺省值是,由于缺省值是privateprivate,这将使用户的数据仍然得到保护。,这将使用户的数据仍然得到保护。(2)(2)除了除了privateprivate和和publicpublic之外,类中的成员之外,类中的成员还可以用另一个关键字还可以用另一个关键字protectedprotected来说明。被来说明。被protectedprotected说明的成员称为保护成员,它不能说明的成员称为保护成员,它不能被外部函数使用,但可以通过其它方法使用它,被外部函数使用,但可以通过其它方法使用它,将在第将在第4 4章详细地介绍此方面内容。章详细地介绍此方面内容。本讲稿第十一页,共八十六页(3)(3)数据成员可以是任何数据类型但是不数据成员可以是任何数据类型但是不能用自动能用自动(auto)(auto)、寄存器、寄存器(register)(register)或外或外部部(extern)(extern)进行说明。进行说明。(4)(4)不能在类的声明中给数据成员赋初值,不能在类的声明中给数据成员赋初值,C C十十规定,只有在类对象定义之后才能十十规定,只有在类对象定义之后才能给数据成员赋初值,例如:给数据成员赋初值,例如:本讲稿第十二页,共八十六页成员函数的定义成员函数的定义 如上所述,类中含有两种成份,即数据成员和成员函数如上所述,类中含有两种成份,即数据成员和成员函数其中成员函数也称方法。实际上,成员函数相方法指的其中成员函数也称方法。实际上,成员函数相方法指的是同一种实体,是一种实体的两种不同叫法,成员函数是是同一种实体,是一种实体的两种不同叫法,成员函数是程序设计语言程序设计语言c c十十中的术语,而方法是面向对象方法中的十十中的术语,而方法是面向对象方法中的术语。在以后的叙述中,本书采用术语成员函数。术语。在以后的叙述中,本书采用术语成员函数。成员函数的定义通常采用两种方式成员函数的定义通常采用两种方式:第一种方式第一种方式是在类声明中只给出成员函数的原型,而是在类声明中只给出成员函数的原型,而成员函数体在类的外部定义。这种成员函数定义的一般成员函数体在类的外部定义。这种成员函数定义的一般形式是:形式是:返回类型返回类型 类名类名:函数名函数名(参数表参数表)././函数体函数体 本讲稿第十三页,共八十六页(1)(1)在所定义的成员函数名之前应缀上类名,在类名和函数名之间加上分隔符在所定义的成员函数名之前应缀上类名,在类名和函数名之间加上分隔符“:”,例如上面例子中的,例如上面例子中的“Point“Point:”。(2)(2)在定义成员函数时,对函数所带的参数,不但要说明它的类型,还要指出其参数名。在定义成员函数时,对函数所带的参数,不但要说明它的类型,还要指出其参数名。(3)(3)在定义成员函数时、其返回类型一定要与函数原型中声明的返回类型匹配在定义成员函数时、其返回类型一定要与函数原型中声明的返回类型匹配。本讲稿第十四页,共八十六页本讲稿第十五页,共八十六页将成员函数定义在将成员函数定义在类的内部,即定义为内类的内部,即定义为内置函数。在置函数。在C+C+可以用可以用下面两种格式定义类的下面两种格式定义类的内置函数:内置函数:(1)(1)隐式定义隐式定义 所谓内置所谓内置函数的隐式定义,就是函数的隐式定义,就是直接将函数定义在类内直接将函数定义在类内部,例如部,例如:成员函数的第二种定义方式成员函数的第二种定义方式本讲稿第十六页,共八十六页(2)(2)显式定义显式定义 在定义内置函数时,为了书写清晰,仍将它放在定义内置函数时,为了书写清晰,仍将它放在类定义体外。但为了使它仍然起内置函数的作用,在函数在类定义体外。但为了使它仍然起内置函数的作用,在函数定义前冠以关键字定义前冠以关键字“inline”,以此显式地说明这是一个,以此显式地说明这是一个内置函数。例如上面的例子改为显示定义可变成如下内置函数。例如上面的例子改为显示定义可变成如下形式形式:本讲稿第十七页,共八十六页对象的定义及引用对象的定义及引用 1 1类与对象的关系类与对象的关系 通常我们把具有通常我们把具有同样性质同样性质和和功能功能的东西所的东西所构成的构成的集合集合称为类称为类。在。在C C十十中,可以把相同十十中,可以把相同内部存储结构和相同操作集的对象看成属于内部存储结构和相同操作集的对象看成属于同一类。同一类。在在C C十十中,对象是类的实际变量。类与对十十中,对象是类的实际变量。类与对象间的关系,可以用整型象间的关系,可以用整型intint和整型变量和整型变量i i之之间的关系来类比。类和整型间的关系来类比。类和整型intint均代表的是一均代表的是一般的概念,而对象和整型变量般的概念,而对象和整型变量i i却是代表具体却是代表具体的东西。正像定义的东西。正像定义intint类型的变量一样,也可类型的变量一样,也可以定义类的变量。以定义类的变量。C C十十把类的变量称为类的十十把类的变量称为类的对象,对象也称为类的实例。对象,对象也称为类的实例。本讲稿第十八页,共八十六页 2 2对象的定义对象的定义 定义对象定义对象的的两种方法:两种方法:(1)(1)在声明类的同时,直接定义对象,即在在声明类的同时,直接定义对象,即在声明类的右花括声明类的右花括 后,直接写出属于该类的对后,直接写出属于该类的对象名称。例如:象名称。例如:本讲稿第十九页,共八十六页 (2)(2)声明了类之后,在使用时再定声明了类之后,在使用时再定义对象,定义的格式与一般变量的定义对象,定义的格式与一般变量的定义格式相同义格式相同.如下所示:如下所示:Point op1 Point op1,op2;op2;此时定义了此时定义了op1op1和和op2op2为为PointPoint类的两个类的两个对象对象.本讲稿第二十页,共八十六页 3 3对象的引用对象的引用 对象的引用是指对对象成员的引用。对象的引用是指对对象成员的引用。不论是不论是数据成员数据成员,还是,还是成员函数成员函数只要是只要是公有的、就可以被外部函数直接引用,引公有的、就可以被外部函数直接引用,引用格式是:用格式是:对象名对象名.数据成员名数据成员名 或或 对象名对象名.成员函数名成员函数名(实参表实参表)其中其中“.”叫做叫做对象选择符对象选择符,简称,简称点运算点运算符符。本讲稿第二十一页,共八十六页本讲稿第二十二页,共八十六页本讲稿第二十三页,共八十六页几点说明几点说明(1)(1)本例中本例中oploplsetpoint(1,2)setpoint(1,2)实际上是一种实际上是一种缩写形式。它表达的意义缩写形式。它表达的意义opl.Point:setpoint(1,2),opl.Point:setpoint(1,2),这两种表达式是这两种表达式是等价的。等价的。(2)(2)外部函数不能引用对象的私有成员。如果外部函数不能引用对象的私有成员。如果将例将例3 33 3中的主程序改成下面的形式中的主程序改成下面的形式本讲稿第二十四页,共八十六页 则编译这个程序时,则编译这个程序时,编译器将指示这编译器将指示这两条两条语句的错误语句的错误。这时可。这时可将这两条错误语句改将这两条错误语句改成调用公有的成员函成调用公有的成员函数来获得私有数据成数来获得私有数据成员员x x和和y y的值的值.本讲稿第二十五页,共八十六页(3)(3)在定义对象时若我们定义的是指向在定义对象时若我们定义的是指向此对象的指针,则访问此对象的成员此对象的指针,则访问此对象的成员时,不能用时,不能用“.”操作符,而应使用操作符,而应使用“-”操作符,例如:操作符,例如:本讲稿第二十六页,共八十六页4 4对象赋值语句对象赋值语句 如果有两整型变量如果有两整型变量x x和和y y,那么用,那么用y yx x,就可以把就可以把x x的值赋给的值赋给y y。同类型的对象同类型的对象之间之间也可以进行赋值当一个对象赋值给另一也可以进行赋值当一个对象赋值给另一个对象时,个对象时,所有的数据成员都会逐位拷贝所有的数据成员都会逐位拷贝。例如,例如,A A和和B B是同一类的两个对象,假设是同一类的两个对象,假设A A已已经存在,那么下述对象赋值语句把对象经存在,那么下述对象赋值语句把对象A A的的 值拷贝给对象值拷贝给对象B B:B=A B=A本讲稿第二十七页,共八十六页本讲稿第二十八页,共八十六页 说明说明 (1)(1)在使用对象赋值语句进行对象赋值时,在使用对象赋值语句进行对象赋值时,两个对象的两个对象的类型必须相同类型必须相同,如对象的类型不,如对象的类型不同,编译时将出错。同,编译时将出错。(2)(2)两个对象之间的赋值,仅仅使这些对两个对象之间的赋值,仅仅使这些对象中数据相同,而两个象中数据相同,而两个对象仍是分离对象仍是分离的。例的。例如本例对象赋值后、再调用如本例对象赋值后、再调用o1.set()o1.set()设置设置olol的值,不会影响的值,不会影响o2o2的值。的值。(3)(3)将一个对象的值赋给另一个对象时,将一个对象的值赋给另一个对象时,多数情况下都是成功的但当类中存在指针多数情况下都是成功的但当类中存在指针时,可能会产生错误。这个问题我们将在第时,可能会产生错误。这个问题我们将在第5 5章分析。章分析。本讲稿第二十九页,共八十六页3.1.4 3.1.4 类的作用域类的作用域 所谓类的作用域所谓类的作用域就是就是指在类的声明中的一指在类的声明中的一对对花括号花括号所形成的作用域所形成的作用域。一个类的所有成。一个类的所有成员都在该类的作用域内。一个类的任意成员员都在该类的作用域内。一个类的任意成员可以引用该类的其它成员。可以引用该类的其它成员。C C十十把类的所有十十把类的所有成员都作为一个整体的相关部分。成员都作为一个整体的相关部分。一个类的成员函数可以不受限制地引用该一个类的成员函数可以不受限制地引用该类的数据成员,而在该类作用域之外对该类的数据成员,而在该类作用域之外对该类的数据成员和成员函数的引用则要受到一类的数据成员和成员函数的引用则要受到一定的限制,有时甚至是不允许的。这体现了定的限制,有时甚至是不允许的。这体现了类的封装类的封装功能。下面的例子可帮助我们理解功能。下面的例子可帮助我们理解类的作用域。类的作用域。本讲稿第三十页,共八十六页本讲稿第三十一页,共八十六页3 32 2构造函数与析构函数构造函数与析构函数3 32 21 1 构造函数构造函数 构造函数是一种特殊的成员函数它主要构造函数是一种特殊的成员函数它主要用于为对象分配空间,进行初始化。用于为对象分配空间,进行初始化。构造函数具有一些特殊的性质:构造函数具有一些特殊的性质:(1)(1)构造函数的名字必须与构造函数的名字必须与类名相同类名相同 (2)(2)构造函数可以构造函数可以有有任意类型的任意类型的参数参数,但,但不能不能具有具有返回类型返回类型 (3)(3)定义对象时,编译系统会定义对象时,编译系统会自动地调用自动地调用构造函数。构造函数。本讲稿第三十二页,共八十六页本讲稿第三十三页,共八十六页 构造函数不能像其它成员函数那样被构造函数不能像其它成员函数那样被显式地调用,它是在定义对象的同时调显式地调用,它是在定义对象的同时调用的,其一般格式为:用的,其一般格式为:类名类名 对象名对象名(实参表实参表),这里的这里的“类名类名”与与构造函数名相同构造函数名相同,“实参表实参表”是为构造函数提供的实际参数。是为构造函数提供的实际参数。本讲稿第三十四页,共八十六页本讲稿第三十五页,共八十六页本讲稿第三十六页,共八十六页本讲稿第三十七页,共八十六页构造函数的几点说明构造函数的几点说明 (1)(1)构造函数的名字必须与类名相同,否构造函数的名字必须与类名相同,否则编译程序将把它当作一般的成员函数来处则编译程序将把它当作一般的成员函数来处理。理。(2)(2)构造函数没有返回值,在声明和定义构造函数没有返回值,在声明和定义构造函数时,是不能说明它的类型的,甚至构造函数时,是不能说明它的类型的,甚至说明为说明为voidvoid类型类型也不行。也不行。(3)(3)在实际应用中,通常需要给每个类定在实际应用中,通常需要给每个类定义构造函数。如果没有给类定义构造函数,义构造函数。如果没有给类定义构造函数,则编译系统自动地生成一个缺省的构造函数。则编译系统自动地生成一个缺省的构造函数。(4)(4)构造函数可以是不带参数构造函数可以是不带参数本讲稿第三十八页,共八十六页 此时,类此时,类ab的构造的构造函数就没有带参数,函数就没有带参数,在在main()函数中可以函数中可以采用如下方法定义对采用如下方法定义对象:象:ab s;在定义对象在定义对象s的同时的同时,构造函数构造函数s.ab:ab()被被系统自动调用执行系统自动调用执行 幕上显示字符串幕上显示字符串“initialized”,并给私有数据成员并给私有数据成员a 赋初值赋初值10。本讲稿第三十九页,共八十六页 (5)(5)构造函数也可采用构造函数也可采用构造初始化表构造初始化表对数据成对数据成员进行初始化,这是某些程序员喜欢使用的员进行初始化,这是某些程序员喜欢使用的方法。例如:方法。例如:本讲稿第四十页,共八十六页 这个含有三个数据成员的类,利这个含有三个数据成员的类,利用构造初始表可以写成用构造初始表可以写成:本讲稿第四十一页,共八十六页 以上两种构造函数的定义都是有效的。以上两种构造函数的定义都是有效的。但是如果需要将数据成员存放在但是如果需要将数据成员存放在堆中或数堆中或数组组中,则应在构造函数中使用赋值语句,中,则应在构造函数中使用赋值语句,即使构造函数有初始化表也应如此,例即使构造函数有初始化表也应如此,例如:如:本讲稿第四十二页,共八十六页本讲稿第四十三页,共八十六页(6)(6)对没有定义构造函数的类,其对没有定义构造函数的类,其公有数据成员公有数据成员可以用可以用初初始值表始值表进行初始化。请看以下例子。进行初始化。请看以下例子。在本例中,在本例中,main()main()中创建了一个类中创建了一个类myclassmyclass的对象的对象a a,并将初始值表中的并将初始值表中的“chen”“chen”和和2525分别分别赋给赋给a namea name和和a anono。程序运行结果。程序运行结果为:为:chen 25 chen 25 这种方法对结构和这种方法对结构和数组的初始化较适合数组的初始化较适合。本讲稿第四十四页,共八十六页3 32 22 2缺省参数的构造函数缺省参数的构造函数 对于带参数的构造函数,在定义对象时对于带参数的构造函数,在定义对象时必须给构造函数传递参数,否则构造函数必须给构造函数传递参数,否则构造函数将不被执行。但在实际使用中,有些构造将不被执行。但在实际使用中,有些构造函数的参数值通常是不变的,只有在特殊函数的参数值通常是不变的,只有在特殊情况下才需要改变它的参数值,这时可以情况下才需要改变它的参数值,这时可以将其定义成带缺省参数的构造函数,例如:将其定义成带缺省参数的构造函数,例如:本讲稿第四十五页,共八十六页本讲稿第四十六页,共八十六页本讲稿第四十七页,共八十六页本讲稿第四十八页,共八十六页 在上面定义了三个对象在上面定义了三个对象s1s1、s2s2和和s3s3,它们都,它们都是合法的对象。由于传递参数的个数不同使是合法的对象。由于传递参数的个数不同使它们的私有数据成员它们的私有数据成员realreal相相imagimag取得不同的值。取得不同的值。由于定义对象由于定义对象S1S1时,没有传递参数所以时,没有传递参数所以realreal和和imagimag均取构造函数的缺省值为其赋值均取构造函数的缺省值为其赋值PgPg此此realreal和和imagimag均为均为0.00.0。在定义对象在定义对象s2s2时,只传递了一个参数,这时,只传递了一个参数,这个参数传递给构造函数的第一个参量,而第二个参数传递给构造函数的第一个参量,而第二个参量取缺省值,所以对象个参量取缺省值,所以对象s2s2的的realreal取值为取值为1.11.1,而,而imagimag取值为取值为0.00.0。在定义对象在定义对象S3S3时,传递了两个参数,这两时,传递了两个参数,这两个参数分别传给了个参数分别传给了realreal和和imag imag 此此realreal取值为取值为1.11.1,imag imag取值为取值为2.22.2。本讲稿第四十九页,共八十六页3 32 23 3 析构函数析构函数 析构函数也是一种特殊的成员函数。它执析构函数也是一种特殊的成员函数。它执行与构造函数相反的操作,通常用于执行一行与构造函数相反的操作,通常用于执行一些清理任务,如释放分配给对象的内存空间些清理任务,如释放分配给对象的内存空间等。析构函数有以下一些特点:等。析构函数有以下一些特点:(1)(1)析构函数与构造函数析构函数与构造函数名字相同名字相同,但它前,但它前面必须加一个波浪号面必须加一个波浪号()。(2)(2)析构函数析构函数没有参数没有参数,也,也没有返回值没有返回值,而,而且且不能重载不能重载,因此在一个类中,因此在一个类中只能有一个析只能有一个析构函数构函数。(3)(3)当当撤消对象撤消对象时,编译系统会时,编译系统会自动地调用自动地调用析构函数析构函数。本讲稿第五十页,共八十六页本讲稿第五十一页,共八十六页本讲稿第五十二页,共八十六页 说明:说明:每个类必须有一个析构函数。每个类必须有一个析构函数。若没有显式地为一个类定义析构函数,若没有显式地为一个类定义析构函数,编译系统会自动地生成一个缺省的析编译系统会自动地生成一个缺省的析构函数。例如,编译系统为类构函数。例如,编译系统为类complexcomplex生成缺省的构造函数如生成缺省的构造函数如:complex:complex()complex:complex()本讲稿第五十三页,共八十六页 对于大多数类而言,缺省的析构函数就能满足要求。但对于大多数类而言,缺省的析构函数就能满足要求。但是,如果在一个对象完成其操作之前需要做一些内部处理,是,如果在一个对象完成其操作之前需要做一些内部处理,则应该显式地定义祈构函数,例如:则应该显式地定义祈构函数,例如:这是构造函数相这是构造函数相析构函数常见的用析构函数常见的用法即在构造函数法即在构造函数中用运算符中用运算符new为字符串分配存为字符串分配存储空间,最后在储空间,最后在析构函数中用运析构函数中用运算符算符delete释放已释放已分配的存储空间分配的存储空间。本讲稿第五十四页,共八十六页3.2.43.2.4重载构造函数重载构造函数 与一般的成员函数一样,与一般的成员函数一样,C C十十允许重载十十允许重载构造函数以适应不同的场合。这些构造构造函数以适应不同的场合。这些构造函数之间以它们所带函数之间以它们所带参数的个数参数的个数或或类型的类型的不同不同而区分。而区分。本讲稿第五十五页,共八十六页本讲稿第五十六页,共八十六页本讲稿第五十七页,共八十六页本讲稿第五十八页,共八十六页 这是一个计时器的例子。首先定义这是一个计时器的例子。首先定义一个一个timertimer类,在创建对象时就赋给对类,在创建对象时就赋给对象一个初始时间值。本例中,通过重载象一个初始时间值。本例中,通过重载构造函数使用户可以用一个整数表示初构造函数使用户可以用一个整数表示初始的秒数;也可用数字串或是指明时间始的秒数;也可用数字串或是指明时间为分、秒的两个整数表示初始的秒数。为分、秒的两个整数表示初始的秒数。还可以不带参数使初始值为零。还可以不带参数使初始值为零。本讲稿第五十九页,共八十六页 说明:说明:在重载没有参数和带缺省参数的在重载没有参数和带缺省参数的构造函数时,有可能产生二义性,例如构造函数时,有可能产生二义性,例如本讲稿第六十页,共八十六页 拷贝构造函数是一种特殊的构造函数。拷贝构造函数是一种特殊的构造函数。它用于依据已存在的对象建立一个新对象。它用于依据已存在的对象建立一个新对象。典型的情况是,将参数代表的对象逐域拷贝典型的情况是,将参数代表的对象逐域拷贝到新创建的对象中。到新创建的对象中。1自定义拷贝构造函数自定义拷贝构造函数 自定义拷贝构造函数的一般形式如下自定义拷贝构造函数的一般形式如下:class name(const class_name&b)拷贝构造函数的函数体拷贝构造函数的函数体3 32 25 5 拷贝构造函数拷贝构造函数本讲稿第六十一页,共八十六页 本例除了显本例除了显式调用拷贝构造式调用拷贝构造函数外,还可以函数外,还可以采用赋值形式调采用赋值形式调用拷贝构造函数用拷贝构造函数。本讲稿第六十二页,共八十六页 在定义对象在定义对象p2p2时,虽然从形式上看时,虽然从形式上看是将对象是将对象plpl赋值给了对象赋值给了对象p2p2,但实际上,但实际上调用的是拷贝构造函数,在对象调用的是拷贝构造函数,在对象p2p2被创被创建时,将对象建时,将对象plpl的值逐域拷贝给对象的值逐域拷贝给对象p2p2,运行结果同上。,运行结果同上。本讲稿第六十三页,共八十六页 2 2缺省的拷贝构造函数缺省的拷贝构造函数 如果没有编写自定义的拷贝构造函数如果没有编写自定义的拷贝构造函数 c c十十会自动地将一个已存在的对象复制给新对象,这十十会自动地将一个已存在的对象复制给新对象,这种按成员逐一复制的过程是由缺省拷贝构造函数自动种按成员逐一复制的过程是由缺省拷贝构造函数自动完成的。完成的。本讲稿第六十四页,共八十六页 3 33 3对象数组与对象指针对象数组与对象指针 对象数组是指对象数组是指每一数组元素都是对象每一数组元素都是对象的数组也就是的数组也就是说,若一个类有若干个对象就把这一系列的对象用一个说,若一个类有若干个对象就把这一系列的对象用一个数组来存放。数组来存放。类类examexam中没有自定义的构造函数,对中没有自定义的构造函数,对象数组由象数组由C+C+的系统缺省构造函数建立。在赋值之前,的系统缺省构造函数建立。在赋值之前,每个对象数组元素都含有未定义的数据。每个对象数组元素都含有未定义的数据。本讲稿第六十五页,共八十六页本讲稿第六十六页,共八十六页 如果类中含有如果类中含有用户定义的构造函数用户定义的构造函数,而且构造函数,而且构造函数带带有参数有参数,则定义对象数组时,可通过,则定义对象数组时,可通过初始值表初始值表进行赋进行赋值。请看下面的例子。值。请看下面的例子。本讲稿第六十七页,共八十六页若类中有构造函数,那么定义若类中有构造函数,那么定义对象数组时,也可通过不带参数的对象数组时,也可通过不带参数的构造函数或带有缺省参数的构造函构造函数或带有缺省参数的构造函数给对象数组元素赋值数给对象数组元素赋值本讲稿第六十八页,共八十六页本讲稿第六十九页,共八十六页本讲稿第七十页,共八十六页3 33 32 2 对象指针对象指针 在在c c语言中能够直接访问结构,或通过指向该结构的指语言中能够直接访问结构,或通过指向该结构的指针来访问结构。类似地,在针来访问结构。类似地,在c c十十语言中可以直接引用对十十语言中可以直接引用对象,也可以通过指向该对象的指针引用对象。对象指针是象,也可以通过指向该对象的指针引用对象。对象指针是C C十十的重要特性之一。十十的重要特性之一。1 1用指针引用单个对象成员用指针引用单个对象成员 说明对象指针的语法和说明其它数据类型指针的语法说明对象指针的语法和说明其它数据类型指针的语法相同。使用对象指针时,相同。使用对象指针时,首先首先要把它要把它指向一个已创建指向一个已创建的对象的对象,然后然后才能才能引用该对象的成员引用该对象的成员。在一般情况下,用点运算符在一般情况下,用点运算符(.)来引用对象成员,当来引用对象成员,当用指向对象的用指向对象的指针来引用对象成员指针来引用对象成员时,就要用时,就要用 “-”操作符。操作符。本讲稿第七十一页,共八十六页本讲稿第七十二页,共八十六页2 2用对象指针引用对象数组用对象指针引用对象数组 对象指针不仅能引用单个对象,也能引用对象指针不仅能引用单个对象,也能引用对象数组。下面的语句声明了一个对象指针对象数组。下面的语句声明了一个对象指针和一个有两个元素的对象数组;和一个有两个元素的对象数组;exe*p exe*p 声明对象指针声明对象指针p p exe ob3 exe ob3 声明对象数组声明对象数组ob3;ob3;若只有数组名若只有数组名,没有下标,这时该数组名代没有下标,这时该数组名代表第一个元素的地址表第一个元素的地址 p pob;ob;就把对象数组的第一个元素的地址赋给对象就把对象数组的第一个元素的地址赋给对象指针指针p p。例如。例如:本讲稿第七十三页,共八十六页 一般而言,当指针一般而言,当指针加加1 1或减或减l l时,它时,它总是指向其基本总是指向其基本类型中相邻的一类型中相邻的一个元素,对象指个元素,对象指针也是如此。本针也是如此。本例中指针对象例中指针对象p+p+时,指向下时,指向下一个数组元素。一个数组元素。本讲稿第七十四页,共八十六页 指向类的非静态成员指针w声明指向公有数据成员的指针:类型说明符 类名:*指针名;w声明指向公有成员函数的指针 类型说明符(类名:*指针名)(参数表);w对数据成员指针赋值的一般语法形式:指针名=&类名:数据成员;w访问(调用)数据成员:对象名.*类成员指针名 或 对象指针名-*类成员指针名 本讲稿第七十五页,共八十六页w声明指向公有成员函数的指针 类型说明符(类名:*指针名)(参数表);w成员函数赋值:指针名=类名:成员函数名;w访问(调用)成员函数:对象名.*类成员指针名(参数表)或 对象指针名-*类成员指针名(参数表)w 注意成员函数指针的声明、赋值和使用过程中的返回值类型、函数参数表一定要匹配本讲稿第七十六页,共八十六页3 33 33 3 this 指针指针 C C十十提供了一个特殊的对象指针十十提供了一个特殊的对象指针thisthis指针。指针。它是成员函数所属对象的指针。它指向类对象的地它是成员函数所属对象的指针。它指向类对象的地址。成员函数通过这个指针可以知道自己属于哪一址。成员函数通过这个指针可以知道自己属于哪一个对象。个对象。thisthis指针是一种指针是一种隐含指针隐含指针,它隐含于每个类,它隐含于每个类的成员函数中。也就是每个成员函数都有一个的成员函数中。也就是每个成员函数都有一个thisthis指指针针,this,this指针指向该函数所属类的对象。因此,成员指针指向该函数所属类的对象。因此,成员函数访问类中数据成员的格式可以写成函数访问类中数据成员的格式可以写成 this-this-成员变量成员变量 下面的程序帮助我们了解下面的程序帮助我们了解thisthis指针是如何工作的。指针是如何工作的。本讲稿第七十七页,共八十六页本讲稿第七十八页,共八十六页 当一个对象调用成员函数时、该成员函数的当一个对象调用成员函数时、该成员函数的thisthis指针指针便指向这个对象。如果不同的对象调用同一个成员函数,便指向这个对象。如果不同的对象调用同一个成员函数,C+C+编译器将根据该成员函数的编译器将根据该成员函数的thisthis指针指向的对象来指针指向的对象来确定应该引用哪一个对象的数据成员。在本例中,当对确定应该引用哪一个对象的数据成员。在本例中,当对象象objobj调用成员函数调用成员函数load()load()和和get()get()时,时,thisthis指针便指向指针便指向objobj。这时,。这时,this-ithis-i便指向对象便指向对象objobj中的中的i i。在实际编程。在实际编程中,由于不标明中,由于不标明thisthis指针的形式使用起来更加方便,因指针的形式使用起来更加方便,因此大部分程序员都使用简写形式。此大部分程序员都使用简写形式。本讲稿第七十九页,共八十六页 那么那么C+C+如何将如何将thisthis指针指向对象指针指向对象obob呢呢?实际上实际上C C十十在编译过程十十在编译过程中做了些简单的工作,将上述调中做了些简单的工作,将上述调用用init()init()函数的语句转换成如下函数的语句转换成如下形式;形式;init(&ob init(&ob,“X”,12)“X”,12);换句话;换句话说,说,C+C+把类对象作为参数传递把类对象作为参数传递给函数给函数(传地址传地址)。虽然程序中的。虽然程序中的成员函数成员函数init()init()没有对应的形参。没有对应的形参。但程序编译时但程序编译时C+C+将其转换成以将其转换成以下形式:下形式:void init(abc*this;char ma,int mb)this-a=ma;this-bmb;本讲稿第八十页,共八十六页3 34 4 向函数传递对象向函数传递对象 对象可以作为参数传递给函数,其方对象可以作为参数传递给函数,其方法与传递其它类型的数据相同。在向函数法与传递其它类型的数据相同。在向函数传递对象时,是通过传递对象时,是通过传值调用传值调用传递给函数传递给函数的。这就是说把对象的拷贝而不是对象本的。这就是说把对象的拷贝而不是对象本身传给函数。身传给函数。因此因此函数中对对象的任何修改均不影函数中对对象的任何修改均不影响调用该函数的对象本身响调用该函数的对象本身。下例说明了这。下例说明了这一点。一点。本讲稿第八十一页,共八十六页本讲稿第八十二页,共八十六页本讲稿第八十三页,共八十六页 如同其它类型的变量一样、也可如同其它类型的变量一样、也可以以将对象的地址传递给函数将对象的地址传递给函数。这时函。这时函数对对象的修改将影响调用该函数的数对对象的修改将影响调用该函数的对象本身。下面我们来说明这个问题。对象本身。下面我们来说明这个问题。本讲稿第八十四页,共八十六页本讲稿第八十五页,共八十六页本讲稿第八十六页,共八十六页

    注意事项

    本文(第三章类和对象精选文档.ppt)为本站会员(石***)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开