面向对象程序设计第6章类与对象.ppt
《面向对象程序设计第6章类与对象.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计第6章类与对象.ppt(72页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、面向对象程序设计面向对象程序设计(C+C+)第第6 6章章 类与对象类与对象6.1 类的定义类的定义n类构成了实现类构成了实现C+面向对象程序设计的基础,面向对象程序设计的基础,在在C+语言面向对象程序设计中占据着核心语言面向对象程序设计中占据着核心地位。它把数据和作用在这些数据上的操地位。它把数据和作用在这些数据上的操作组合在一起,是封装的基本单元。对象作组合在一起,是封装的基本单元。对象是类的实例,类定义了属于该类的所有对是类的实例,类定义了属于该类的所有对象的共同特性。象的共同特性。n一个类是对一种概念的描述,或者说是对某一类一个类是对一种概念的描述,或者说是对某一类具体事物的抽象具体事
2、物的抽象。nC语言中对语言中对“点点”的描述的描述:struct Point double x;double y;n上述描述说明了点由两个坐标组成这样的概念。上述描述说明了点由两个坐标组成这样的概念。不过,它没有说明所描述概念的操作特性。不过,它没有说明所描述概念的操作特性。6.1.1 类的含义与表述类的含义与表述nC+丰富了丰富了C语言的结构并称之为类,使其能够描述出完整语言的结构并称之为类,使其能够描述出完整的概念。例如:的概念。例如:struct Point double x;double y;void display()cout x ,”操作符。操作符。#include using n
3、amespace std;class Date public:int year,month,day;void print()coutyear-month-d.yeard.monthd.day;/输入数据 d.print();/显示日期 cout the dates year/判断是否闰年 (d.isLeapYear()?is:is not)a leap year.;例:下面的程序从键盘输入一个日期并判断其年份是否例:下面的程序从键盘输入一个日期并判断其年份是否为闰年。为闰年。6.2.3 对象存储对象存储n在生成对象时,每个对象都占用包括所有数据成在生成对象时,每个对象都占用包括所有数据成员在内
4、的存储空间(静态属性除外,参见员在内的存储空间(静态属性除外,参见8.1),),即每个对象保存着一份所有数据成员的即每个对象保存着一份所有数据成员的“拷贝拷贝”,但所有对象的成员函数只有一份公用的拷贝,但所有对象的成员函数只有一份公用的拷贝,单独存储。因此,一个对象占用的存储空间是所单独存储。因此,一个对象占用的存储空间是所有数据成员占用的存储空间之和,不包括成员函有数据成员占用的存储空间之和,不包括成员函数。数。cout sizeof(Date),sizeof(d);/d是上述代码中的是上述代码中的Date型变量型变量n上述语句的输出结果为上述语句的输出结果为“12,12”,对应于,对应于3
5、个个int类型数据成员的存储空间之和(有时会因内部调类型数据成员的存储空间之和(有时会因内部调整而多占用一些空间)。整而多占用一些空间)。6.3 类的方法类的方法n通常,类定义中需要提供相当数量的方法,通常,类定义中需要提供相当数量的方法,可以分为两类:可以分为两类:其一是处理属性的方法其一是处理属性的方法其二是反映对象行为的方法其二是反映对象行为的方法 6.3.1 为类提供必要的方法为类提供必要的方法n首先,由于类对成员的隐藏特点,使得类外常常首先,由于类对成员的隐藏特点,使得类外常常不能直接访问对象的属性。不能直接访问对象的属性。n如果希望外界能够得到或修改一个属性,需要提如果希望外界能够
6、得到或修改一个属性,需要提供相应的公开方法。因此,每个与外界发生联系供相应的公开方法。因此,每个与外界发生联系的属性常常伴随着两个公开的方法。的属性常常伴随着两个公开的方法。n其次,提供允许外界其次,提供允许外界“调用调用”的公开方法,使对的公开方法,使对象产生应有的行为,如象产生应有的行为,如displaydisplay和和movemove。此外,还此外,还可能需要定义一些类内使用的可能需要定义一些类内使用的privateprivate方法以及为方法以及为其派生类准备的其派生类准备的protectedprotected方法。方法。class Point int x,y;public:int
7、getx()return x;/与属性相关的方法与属性相关的方法 int gety()return y;int setx(int x1)x=x1;int sety(int y1)y=y1;void display()cout x,成员成员 的方式的方式,只,只不过在类内,若是直接访问成员的方不过在类内,若是直接访问成员的方 式式,实际就是实际就是 this-成员成员 的方式。的方式。n访问成员函数的形式为:访问成员函数的形式为:对象对象.成员函数();成员函数();n或或 指向对象的指针指向对象的指针成员函数();成员函数();n实际上,还需要另一个参数,作为实际上,还需要另一个参数,作为th
8、is的实参,格的实参,格式为:式为:对象对象.成员函数成员函数(&对象,参数表);对象,参数表);n或或 指向对象的指针指向对象的指针成员函数(成员函数(指向对象的指针,指向对象的指针,参数表);参数表);n总之,成员函数通过总之,成员函数通过this指针,指针,“知道知道”访问的数访问的数据是哪个对象的。据是哪个对象的。n例例 class INTEGER int anint;public:void set_int(int intnum)anint=intnum;int get_int()return anint;void main()INTEGER Anint,*Pint;Pint=&Ani
9、nt;Anint.set_int(120);coutget_int();n实际上,系统将上述程序改造为:实际上,系统将上述程序改造为:class INTEGER int anint;public:void set_int(INTEGER*const this,int intnum)this-anint=intnum;int get_int(INTEGER*const this)return this-anint;void main()INTEGER Anint,*Pint;Pint=&Anint;Anint.set_int(&Anint,120);coutget_int(Pint);nthis
10、指针是一个常指针,还可以使用指针是一个常指针,还可以使用const说说明符将明符将this声明为指向常量的常指针。声明为指向常量的常指针。nconst成员函数中成员函数中this的类型是:的类型是:const X*const thisnconst成员函数的特点是它不能修改成员函数的特点是它不能修改this所指所指的对象成员。的对象成员。class INTEGER int anint;public:int crease()return+anint;int decrease()const return-anint;/错误 ;例例n在类在类INTEDER中,成员函数中,成员函数decrease()的
11、原型后跟的原型后跟一个一个const,它说明此时该函数的它说明此时该函数的this的类型是:的类型是:const INTEGER*const thisn由于由于const成员函数不能修改成员函数不能修改this所指的对象的成员,所指的对象的成员,因此在因此在decrease()函数体中的语句函数体中的语句 anint 试试图改变图改变this指向的对象的成员指向的对象的成员anint,这是不允许的。但在这是不允许的。但在crease()中,修改中,修改anint是完全许可的。是完全许可的。nthis指针主要用在运算苻重载、自引用等场合。指针主要用在运算苻重载、自引用等场合。6.3.6 类的模板
12、函数方法类的模板函数方法n类方法也可以是一个函数模板。例如:类方法也可以是一个函数模板。例如:class X public:template void print(T x)coutx;n这与普通模板函数的使用没有什么不同,只要在这与普通模板函数的使用没有什么不同,只要在调用方法时指定数据类型作为模板类型参数调用方法时指定数据类型作为模板类型参数T的实的实参数值即可,如:参数值即可,如:X a;a.print(10);a.print才是一个真正的方法名。才是一个真正的方法名。6.4 构造函数与构造函数与对象初始化象初始化 n通常,一个对象在生成时应该被初始化,通常,一个对象在生成时应该被初始化,
13、它的属性不应是它的属性不应是0或随机值。或随机值。n尝试下面的两种初始化方式:尝试下面的两种初始化方式:1 Date d=2007,1,2;2 Date d;d.setDate(2007,1,2);6.4.1 构造函数构造函数n解决对象初始化问题的方法是为类定义一解决对象初始化问题的方法是为类定义一种特殊的方法:构造函数,语法形式为:种特殊的方法:构造函数,语法形式为:类名类名(参数列表参数列表);例如:例如:class Date int year,month,day;public:Date(int y=2007,int m=1,int d=30)year=y;month=m;day=d;.;
14、n1.构造函数的特殊性构造函数的特殊性语法上,构造函数名与类名语法上,构造函数名与类名必须必须相同,且不能相同,且不能有返回类型(也意味着有返回类型(也意味着无返回值无返回值),除此之),除此之外与普通方法相同,如可以有参数列表、可以外与普通方法相同,如可以有参数列表、可以重载和设置参数的缺省值等。重载和设置参数的缺省值等。构造函数在生成对象时由系统构造函数在生成对象时由系统自动调用自动调用。构造函数必须是构造函数必须是公有公有的,否则系统也无法在构的,否则系统也无法在构造对象时调用它。造对象时调用它。n2.缺省的构造函数缺省的构造函数 在在C+中,每个类必须有构造函数,否则不能中,每个类必须
15、有构造函数,否则不能生成类对象。生成类对象。n如果用户没有定义,则系统自动生成一个构造函数,如果用户没有定义,则系统自动生成一个构造函数,称为缺省构造函数称为缺省构造函数。n缺省构造函数没有任何参数,形式为:缺省构造函数没有任何参数,形式为:类名类名();n需要特别注意的是,只要用户自己定义了一个构造需要特别注意的是,只要用户自己定义了一个构造函数,无论有无参数,系统将不再提供缺省构造函函数,无论有无参数,系统将不再提供缺省构造函数。数。n3.构造函数的重载与对象定义构造函数的重载与对象定义 创建一个对象意味着一次构造函数调用,因此,对象创建一个对象意味着一次构造函数调用,因此,对象后面的实参
16、数列表必须与某一个构造函数的形参列表后面的实参数列表必须与某一个构造函数的形参列表相对应,使得系统能找到对应的构造函数并调用它,相对应,使得系统能找到对应的构造函数并调用它,否则将产生找不到适当匹配的错误。否则将产生找不到适当匹配的错误。见例见例P101特殊情况说明:特殊情况说明:构造函数只有一个参数,则下面两个对象定义语句的构造函数只有一个参数,则下面两个对象定义语句的作用相同作用相同nStudent s2(Tom);nStudent s2=“Tom”;/初始化而非赋值初始化而非赋值无参构造函数定义对象时不能带有括号无参构造函数定义对象时不能带有括号n Student s1();n4.单参数
17、构造函数的类型转换作用单参数构造函数的类型转换作用 n一个类的单参数构造函数为由类类型到其一个类的单参数构造函数为由类类型到其它类型的转换提供了依据。它类型的转换提供了依据。void print(Student s)cout s.getname();int main()print(Tom);/调用Student(const char*)cout(static_cast(J).getname();/调用Student(char)注意注意:只有包含一个参数的构造函数具有类型转换的功能,:只有包含一个参数的构造函数具有类型转换的功能,且在有二义性时会产生错误。且在有二义性时会产生错误。6.4.2 用
18、构造函数生成对象用构造函数生成对象n除了直接定义一个对象会导致系统调用构除了直接定义一个对象会导致系统调用构造函数外,还存在着其它一些需要调用构造函数外,还存在着其它一些需要调用构造函数的情况。造函数的情况。n1.无名对象无名对象 n可以用直接指定一个构造函数的形式来定义无名可以用直接指定一个构造函数的形式来定义无名对象,如:对象,如:Student(Tom);Student();n无名对象主要有如下二种作用:无名对象主要有如下二种作用:作函数参数作函数参数void fn(string s);fn(string(Mary);初始化对象初始化对象nstring s=string(Mary);ns
19、tring s=Mary;nstring s(Mary);系统将根据无名对象的参数值直接调用构造函系统将根据无名对象的参数值直接调用构造函数构造对象数构造对象s,而不是先构造临时对象再拷贝而不是先构造临时对象再拷贝给给s。n2.临时对象临时对象 n在一些特殊情况下,系统可能生成临时对在一些特殊情况下,系统可能生成临时对象。例如,有如下函数原型:象。例如,有如下函数原型:Student getStudent(.).return s;若以下述方式调用函数:若以下述方式调用函数:Student sx=getStudent();系统在函数返回时要创建临时对象保存系统在函数返回时要创建临时对象保存get
20、Student的返回的返回值,再用临时对象拷贝构造值,再用临时对象拷贝构造sx。在没有为类提供适当的拷贝在没有为类提供适当的拷贝构造函数时应注意这些问题。构造函数时应注意这些问题。n3.对象数组对象数组定义对象数组时,系统为每个数组元素对象调定义对象数组时,系统为每个数组元素对象调用一次用一次无参无参构造函数以构造这些元素。构造函数以构造这些元素。Student ss4;n以不同的构造方式初始化对象数组以不同的构造方式初始化对象数组 利用临时对象利用临时对象Student ss4=Student(),Student(hello),Student(J);在在提提供供了了单单参参数数的的构构造造函
21、函数数时时,也也可可以以依依赖赖构构造函数的类型转换作用实现数组初始化,如:造函数的类型转换作用实现数组初始化,如:Student sx6=C+,Basic,C;Student sx6=Student(C+),Student(Basic),Student(C);传统的结构方式传统的结构方式如如果果类类没没有有任任何何构构造造函函数数,C+仍仍允允许许用用C语语言言的的结结构构方方式为数组赋初值,如:式为数组赋初值,如:class Point int x,y;public:void print()cout x ,y;Point ps10=10,20,23,45;定义单个对象时不能以这种初始化方式
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计
限制150内