第三章类和对象精选文档.ppt
《第三章类和对象精选文档.ppt》由会员分享,可在线阅读,更多相关《第三章类和对象精选文档.ppt(86页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第三章类和对象本讲稿第一页,共八十六页本讲稿第二页,共八十六页本讲稿第三页,共八十六页在在C C十十中,一个结构的成员通常分为十十中,一个结构的成员通常分为两类两类:私有成员私有成员(privateprivate)和和公有成员公有成员(publicpublic),),私有私有成员成员(包括数据和函数包括数据和函数)只能被该结构中的其它只能被该结构中的其它成员访问,而公有成员成员访问,而公有成员(包括数据和函数包括数据和函数)既可既可被结构内其它成员访问,也可被结构外的其它被结构内其它成员访问,也可被结构外的其它部分访问。部分访问。例如在上例中,变量例如在上例中,变量realreal和和imag
2、imag只需要被该只需要被该结构的成员函数访问,则可声明为私有成员;结构的成员函数访问,则可声明为私有成员;四个成员函数需要在结构体外被调用,则可声四个成员函数需要在结构体外被调用,则可声明为公有成员。明为公有成员。C C十十规定,在缺省情况下,十十规定,在缺省情况下,结构中的成结构中的成员是公有的员是公有的,因此上例结构,因此上例结构complexcomplex中的成员都中的成员都是公有的。是公有的。本讲稿第四页,共八十六页本讲稿第五页,共八十六页2 类的声明类的声明 C十十提供了一种比结构类型更安全有效的数据类十十提供了一种比结构类型更安全有效的数据类型型类。类是类。类是C十十的一个最重要
3、的特性。类与十十的一个最重要的特性。类与结构的扩充形式十分相似,其一般形式如下:结构的扩充形式十分相似,其一般形式如下:class 类名类名 private:私有数据成员和成员函数私有数据成员和成员函数 pubic:公有数据成员和成员函数公有数据成员和成员函数;其中:其中:class是声明类的关键字,类名是要声明的是声明类的关键字,类名是要声明的类的名字;后面的花括号表示出类的声明范围;最类的名字;后面的花括号表示出类的声明范围;最后的分号表示类声明结束。后的分号表示类声明结束。本讲稿第六页,共八十六页 类的声明内容包括类的声明内容包括数据和函数数据和函数。类中的数据。类中的数据和函数都是类的
4、成员,分别叫做和函数都是类的成员,分别叫做数据成员数据成员和和成成员函数员函数。与结构的扩充形式一样。类的成员也分为私与结构的扩充形式一样。类的成员也分为私 有成员和公有成员。有成员和公有成员。私有成员私有成员用用privateprivate说明,说明,privateprivate下面的每一行下面的每一行,不论是数据成员还是成不论是数据成员还是成员函数员函数,都是私有成员。私有成员只能被该类的都是私有成员。私有成员只能被该类的成员函数访问,这是成员函数访问,这是C C十十实现封装的一种方法,十十实现封装的一种方法,即把特定的成员定义为私有的,就能严格地控即把特定的成员定义为私有的,就能严格地控
5、制对它的访问。制对它的访问。公有成员公有成员用用publicpublic说明,说明,publicpublic下面的每一下面的每一行都是公有成员。公有成员可被程序中的其它行都是公有成员。公有成员可被程序中的其它函数访问,它们是类的对外接口。函数访问,它们是类的对外接口。本讲稿第七页,共八十六页实际上,在实际上,在C十十中,类十十中,类class和结构和结构struct是类似的因为是类似的因为C十十的结构与类一十十的结构与类一样都含有数据以及对这些数据进行的操样都含有数据以及对这些数据进行的操作。它们的作。它们的主要区别主要区别是缺省值不同:是缺省值不同:在在类中类中,缺省时成员是私有的缺省时成员
6、是私有的,而,而在结构中在结构中,缺省时成员是公有的缺省时成员是公有的。本讲稿第八页,共八十六页本讲稿第九页,共八十六页 可以看出,类和结构的功能基本上相同。可以看出,类和结构的功能基本上相同。那那么在么在C C十十中为什么要用类代替结构呢十十中为什么要用类代替结构呢?原因原因是,在缺省的情况下,类成员是私有的,是,在缺省的情况下,类成员是私有的,类类提供了缺省的安全性提供了缺省的安全性。这一规定符合面向对。这一规定符合面向对象思想中数据隐藏的准则。数据隐藏使得类象思想中数据隐藏的准则。数据隐藏使得类中的成员比一般的局部变量得到更好的保护中的成员比一般的局部变量得到更好的保护本讲稿第十页,共八
7、十六页类的几点说明类的几点说明 (1)(1)类的声明中的类的声明中的privateprivate和和publicpublic两个关键两个关键字可以按任意顺序出现任意次。但是,如果把字可以按任意顺序出现任意次。但是,如果把所有的私有成员和公有成员归类放在一起,程所有的私有成员和公有成员归类放在一起,程序将更加清晰。并且应该养成把所有的私有成序将更加清晰。并且应该养成把所有的私有成员放在公有成员前面的习惯,因为一旦用户忘员放在公有成员前面的习惯,因为一旦用户忘记了使用说明符记了使用说明符privateprivate,由于缺省值是,由于缺省值是privateprivate,这将使用户的数据仍然得到保
8、护。,这将使用户的数据仍然得到保护。(2)(2)除了除了privateprivate和和publicpublic之外,类中的成员之外,类中的成员还可以用另一个关键字还可以用另一个关键字protectedprotected来说明。被来说明。被protectedprotected说明的成员称为保护成员,它不能说明的成员称为保护成员,它不能被外部函数使用,但可以通过其它方法使用它,被外部函数使用,但可以通过其它方法使用它,将在第将在第4 4章详细地介绍此方面内容。章详细地介绍此方面内容。本讲稿第十一页,共八十六页(3)(3)数据成员可以是任何数据类型但是不数据成员可以是任何数据类型但是不能用自动能用
9、自动(auto)(auto)、寄存器、寄存器(register)(register)或外或外部部(extern)(extern)进行说明。进行说明。(4)(4)不能在类的声明中给数据成员赋初值,不能在类的声明中给数据成员赋初值,C C十十规定,只有在类对象定义之后才能十十规定,只有在类对象定义之后才能给数据成员赋初值,例如:给数据成员赋初值,例如:本讲稿第十二页,共八十六页成员函数的定义成员函数的定义 如上所述,类中含有两种成份,即数据成员和成员函数如上所述,类中含有两种成份,即数据成员和成员函数其中成员函数也称方法。实际上,成员函数相方法指的其中成员函数也称方法。实际上,成员函数相方法指的是
10、同一种实体,是一种实体的两种不同叫法,成员函数是是同一种实体,是一种实体的两种不同叫法,成员函数是程序设计语言程序设计语言c c十十中的术语,而方法是面向对象方法中的十十中的术语,而方法是面向对象方法中的术语。在以后的叙述中,本书采用术语成员函数。术语。在以后的叙述中,本书采用术语成员函数。成员函数的定义通常采用两种方式成员函数的定义通常采用两种方式:第一种方式第一种方式是在类声明中只给出成员函数的原型,而是在类声明中只给出成员函数的原型,而成员函数体在类的外部定义。这种成员函数定义的一般成员函数体在类的外部定义。这种成员函数定义的一般形式是:形式是:返回类型返回类型 类名类名:函数名函数名(
11、参数表参数表)././函数体函数体 本讲稿第十三页,共八十六页(1)(1)在所定义的成员函数名之前应缀上类名,在类名和函数名之间加上分隔符在所定义的成员函数名之前应缀上类名,在类名和函数名之间加上分隔符“:”,例如上面例子中的,例如上面例子中的“Point“Point:”。(2)(2)在定义成员函数时,对函数所带的参数,不但要说明它的类型,还要指出其参数名。在定义成员函数时,对函数所带的参数,不但要说明它的类型,还要指出其参数名。(3)(3)在定义成员函数时、其返回类型一定要与函数原型中声明的返回类型匹配在定义成员函数时、其返回类型一定要与函数原型中声明的返回类型匹配。本讲稿第十四页,共八十六
12、页本讲稿第十五页,共八十六页将成员函数定义在将成员函数定义在类的内部,即定义为内类的内部,即定义为内置函数。在置函数。在C+C+可以用可以用下面两种格式定义类的下面两种格式定义类的内置函数:内置函数:(1)(1)隐式定义隐式定义 所谓内置所谓内置函数的隐式定义,就是函数的隐式定义,就是直接将函数定义在类内直接将函数定义在类内部,例如部,例如:成员函数的第二种定义方式成员函数的第二种定义方式本讲稿第十六页,共八十六页(2)(2)显式定义显式定义 在定义内置函数时,为了书写清晰,仍将它放在定义内置函数时,为了书写清晰,仍将它放在类定义体外。但为了使它仍然起内置函数的作用,在函数在类定义体外。但为了
13、使它仍然起内置函数的作用,在函数定义前冠以关键字定义前冠以关键字“inline”,以此显式地说明这是一个,以此显式地说明这是一个内置函数。例如上面的例子改为显示定义可变成如下内置函数。例如上面的例子改为显示定义可变成如下形式形式:本讲稿第十七页,共八十六页对象的定义及引用对象的定义及引用 1 1类与对象的关系类与对象的关系 通常我们把具有通常我们把具有同样性质同样性质和和功能功能的东西所的东西所构成的构成的集合集合称为类称为类。在。在C C十十中,可以把相同十十中,可以把相同内部存储结构和相同操作集的对象看成属于内部存储结构和相同操作集的对象看成属于同一类。同一类。在在C C十十中,对象是类的
14、实际变量。类与对十十中,对象是类的实际变量。类与对象间的关系,可以用整型象间的关系,可以用整型intint和整型变量和整型变量i i之之间的关系来类比。类和整型间的关系来类比。类和整型intint均代表的是一均代表的是一般的概念,而对象和整型变量般的概念,而对象和整型变量i i却是代表具体却是代表具体的东西。正像定义的东西。正像定义intint类型的变量一样,也可类型的变量一样,也可以定义类的变量。以定义类的变量。C C十十把类的变量称为类的十十把类的变量称为类的对象,对象也称为类的实例。对象,对象也称为类的实例。本讲稿第十八页,共八十六页 2 2对象的定义对象的定义 定义对象定义对象的的两种
15、方法:两种方法:(1)(1)在声明类的同时,直接定义对象,即在在声明类的同时,直接定义对象,即在声明类的右花括声明类的右花括 后,直接写出属于该类的对后,直接写出属于该类的对象名称。例如:象名称。例如:本讲稿第十九页,共八十六页 (2)(2)声明了类之后,在使用时再定声明了类之后,在使用时再定义对象,定义的格式与一般变量的定义对象,定义的格式与一般变量的定义格式相同义格式相同.如下所示:如下所示:Point op1 Point op1,op2;op2;此时定义了此时定义了op1op1和和op2op2为为PointPoint类的两个类的两个对象对象.本讲稿第二十页,共八十六页 3 3对象的引用对
16、象的引用 对象的引用是指对对象成员的引用。对象的引用是指对对象成员的引用。不论是不论是数据成员数据成员,还是,还是成员函数成员函数只要是只要是公有的、就可以被外部函数直接引用,引公有的、就可以被外部函数直接引用,引用格式是:用格式是:对象名对象名.数据成员名数据成员名 或或 对象名对象名.成员函数名成员函数名(实参表实参表)其中其中“.”叫做叫做对象选择符对象选择符,简称,简称点运算点运算符符。本讲稿第二十一页,共八十六页本讲稿第二十二页,共八十六页本讲稿第二十三页,共八十六页几点说明几点说明(1)(1)本例中本例中oploplsetpoint(1,2)setpoint(1,2)实际上是一种实
17、际上是一种缩写形式。它表达的意义缩写形式。它表达的意义opl.Point:setpoint(1,2),opl.Point:setpoint(1,2),这两种表达式是这两种表达式是等价的。等价的。(2)(2)外部函数不能引用对象的私有成员。如果外部函数不能引用对象的私有成员。如果将例将例3 33 3中的主程序改成下面的形式中的主程序改成下面的形式本讲稿第二十四页,共八十六页 则编译这个程序时,则编译这个程序时,编译器将指示这编译器将指示这两条两条语句的错误语句的错误。这时可。这时可将这两条错误语句改将这两条错误语句改成调用公有的成员函成调用公有的成员函数来获得私有数据成数来获得私有数据成员员x
18、x和和y y的值的值.本讲稿第二十五页,共八十六页(3)(3)在定义对象时若我们定义的是指向在定义对象时若我们定义的是指向此对象的指针,则访问此对象的成员此对象的指针,则访问此对象的成员时,不能用时,不能用“.”操作符,而应使用操作符,而应使用“-”操作符,例如:操作符,例如:本讲稿第二十六页,共八十六页4 4对象赋值语句对象赋值语句 如果有两整型变量如果有两整型变量x x和和y y,那么用,那么用y yx x,就可以把就可以把x x的值赋给的值赋给y y。同类型的对象同类型的对象之间之间也可以进行赋值当一个对象赋值给另一也可以进行赋值当一个对象赋值给另一个对象时,个对象时,所有的数据成员都会
19、逐位拷贝所有的数据成员都会逐位拷贝。例如,例如,A A和和B B是同一类的两个对象,假设是同一类的两个对象,假设A A已已经存在,那么下述对象赋值语句把对象经存在,那么下述对象赋值语句把对象A A的的 值拷贝给对象值拷贝给对象B B:B=A B=A本讲稿第二十七页,共八十六页本讲稿第二十八页,共八十六页 说明说明 (1)(1)在使用对象赋值语句进行对象赋值时,在使用对象赋值语句进行对象赋值时,两个对象的两个对象的类型必须相同类型必须相同,如对象的类型不,如对象的类型不同,编译时将出错。同,编译时将出错。(2)(2)两个对象之间的赋值,仅仅使这些对两个对象之间的赋值,仅仅使这些对象中数据相同,而
20、两个象中数据相同,而两个对象仍是分离对象仍是分离的。例的。例如本例对象赋值后、再调用如本例对象赋值后、再调用o1.set()o1.set()设置设置olol的值,不会影响的值,不会影响o2o2的值。的值。(3)(3)将一个对象的值赋给另一个对象时,将一个对象的值赋给另一个对象时,多数情况下都是成功的但当类中存在指针多数情况下都是成功的但当类中存在指针时,可能会产生错误。这个问题我们将在第时,可能会产生错误。这个问题我们将在第5 5章分析。章分析。本讲稿第二十九页,共八十六页3.1.4 3.1.4 类的作用域类的作用域 所谓类的作用域所谓类的作用域就是就是指在类的声明中的一指在类的声明中的一对对
21、花括号花括号所形成的作用域所形成的作用域。一个类的所有成。一个类的所有成员都在该类的作用域内。一个类的任意成员员都在该类的作用域内。一个类的任意成员可以引用该类的其它成员。可以引用该类的其它成员。C C十十把类的所有十十把类的所有成员都作为一个整体的相关部分。成员都作为一个整体的相关部分。一个类的成员函数可以不受限制地引用该一个类的成员函数可以不受限制地引用该类的数据成员,而在该类作用域之外对该类的数据成员,而在该类作用域之外对该类的数据成员和成员函数的引用则要受到一类的数据成员和成员函数的引用则要受到一定的限制,有时甚至是不允许的。这体现了定的限制,有时甚至是不允许的。这体现了类的封装类的封
22、装功能。下面的例子可帮助我们理解功能。下面的例子可帮助我们理解类的作用域。类的作用域。本讲稿第三十页,共八十六页本讲稿第三十一页,共八十六页3 32 2构造函数与析构函数构造函数与析构函数3 32 21 1 构造函数构造函数 构造函数是一种特殊的成员函数它主要构造函数是一种特殊的成员函数它主要用于为对象分配空间,进行初始化。用于为对象分配空间,进行初始化。构造函数具有一些特殊的性质:构造函数具有一些特殊的性质:(1)(1)构造函数的名字必须与构造函数的名字必须与类名相同类名相同 (2)(2)构造函数可以构造函数可以有有任意类型的任意类型的参数参数,但,但不能不能具有具有返回类型返回类型 (3)
23、(3)定义对象时,编译系统会定义对象时,编译系统会自动地调用自动地调用构造函数。构造函数。本讲稿第三十二页,共八十六页本讲稿第三十三页,共八十六页 构造函数不能像其它成员函数那样被构造函数不能像其它成员函数那样被显式地调用,它是在定义对象的同时调显式地调用,它是在定义对象的同时调用的,其一般格式为:用的,其一般格式为:类名类名 对象名对象名(实参表实参表),这里的这里的“类名类名”与与构造函数名相同构造函数名相同,“实参表实参表”是为构造函数提供的实际参数。是为构造函数提供的实际参数。本讲稿第三十四页,共八十六页本讲稿第三十五页,共八十六页本讲稿第三十六页,共八十六页本讲稿第三十七页,共八十六
24、页构造函数的几点说明构造函数的几点说明 (1)(1)构造函数的名字必须与类名相同,否构造函数的名字必须与类名相同,否则编译程序将把它当作一般的成员函数来处则编译程序将把它当作一般的成员函数来处理。理。(2)(2)构造函数没有返回值,在声明和定义构造函数没有返回值,在声明和定义构造函数时,是不能说明它的类型的,甚至构造函数时,是不能说明它的类型的,甚至说明为说明为voidvoid类型类型也不行。也不行。(3)(3)在实际应用中,通常需要给每个类定在实际应用中,通常需要给每个类定义构造函数。如果没有给类定义构造函数,义构造函数。如果没有给类定义构造函数,则编译系统自动地生成一个缺省的构造函数。则编
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 对象 精选 文档
限制150内