《C大学基础教程第8章总结用.ppt》由会员分享,可在线阅读,更多相关《C大学基础教程第8章总结用.ppt(72页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-1-8.1 8.1 类是一种数据类型类是一种数据类型数据类型约束了变量所能参加的运算范围。例如,整型变量数据类型约束了变量所能参加的运算范围。例如,整型变量可以进行取模可以进行取模“%”运算,而实型变量则不可以进行该运算;运算,而实型变量则不可以进行该运算;数据类型限定了变量所能取到的数值范围。例如,整型变量数据类型限定了变量所能取到的数值范围。例如,整型变量可以取值为可以取值为1,21,2.,100,.,100,,而不能取值,而不能取值3.14153.1415这样的实型这样的实型数。数。在在C+C+中,中,类实际上相当于一种用户自定义的数据类型类实际上相当于一种用户自定义的数据类型,对象对
2、象就是该数据类型的一个变量就是该数据类型的一个变量;类类-数据类型数据类型 对象对象-变量变量-2-8.8.2 2 类的定义类的定义一个类表示现实生活中的一类事物,比如一个类表示现实生活中的一类事物,比如“学生学生”.n事物有相应的特征或属性,它们就是类的事物有相应的特征或属性,它们就是类的成员数据成员数据;n事物可能有行为动作,也可能被某些行为动作所操作,事物可能有行为动作,也可能被某些行为动作所操作,这些都用函数来实现,是构成类的函数成员,或者叫这些都用函数来实现,是构成类的函数成员,或者叫成员函数成员函数。-3-8.8.2 2 类的定义类的定义类的声明具体说明类的组成,声明类的语法形式为
3、:类的声明具体说明类的组成,声明类的语法形式为:class class 类的名称类的名称 public:public:公有成员数据公有成员数据;公有成员函数公有成员函数;protected:protected:保护成员数据保护成员数据;保护成员函数保护成员函数;private:private:私有成员数据私有成员数据;私有成员函数私有成员函数;-4-其中,其中,“成员成员”既可以是数据,也可以是函数。既可以是数据,也可以是函数。n成员数据的声明方式与一般变量相同。成员数据的声明方式与一般变量相同。n成员函数是描述类的对象可以进行的操作,一般在成员函数是描述类的对象可以进行的操作,一般在类中类中
4、声明原型声明原型,在类声明的外面定义函数的具体实,在类声明的外面定义函数的具体实现。现。8.8.2 2 类的定义类的定义-5-类类的的成成员员函函数数描描述述的的是是类类的的行行为为或或操操作作。函函数数的的原原型型声声明明要要在在类类的的主主体体中中,原原型型说说明明了了函函数数的的参参数数表表和和返返回回值值类类型型。而而函函数数的的具具体体实实现现一一般是写在类声明之外的。般是写在类声明之外的。在类的外部定义成员函数的语法形式为:在类的外部定义成员函数的语法形式为:返回值类型返回值类型 类名类名:成员函数名成员函数名(参数表参数表)函数体函数体 8.8.2 2 类的定义类的定义-6-定义
5、一个类后,只是有了描述该类事物的数据定义一个类后,只是有了描述该类事物的数据类型。当我们使用类型。当我们使用“类类”这个数据类型定义一这个数据类型定义一个变量时,就生成了一个该个变量时,就生成了一个该“类类”的对象。对的对象。对象有时又称为实例。象有时又称为实例。例如,例如,Student stu(1,Student stu(1,“wangwang”,M M););定定义了一个对象名字为义了一个对象名字为stustu的的StudentStudent类型的对象。类型的对象。8.3 8.3 对象的定义对象的定义-7-定义一个对象和定义一个一般变量相同。定义一个对象和定义一个一般变量相同。定定义义变
6、变量量时时要要分分配配存存储储空空间间,同同样样,定定义义一一个个对对象象时时要要分分配配存存储储空空间间,一一个个对对象象所所占占的的内内存存空空间间是是类类的的数数据据成成员员所所占占的的空空间间总总和和。类类的的成成员函数存放在代码区员函数存放在代码区。类类的的成成员员是是抽抽象象的的,对对象象的的成成员员才才是是具具体体的的。类类的的数数据据成成员员都都不不会会有有具具体体的的属属性性值值。只只有有对对象的成员才会有具体的属性值。象的成员才会有具体的属性值。8.3 8.3 对象的定义对象的定义-8-8.3 8.3 对象的定义对象的定义类中成员互访类中成员互访n直接使用成员名直接使用成员
7、名类外访问类外访问n使用使用“对象名对象名.成员名成员名”方式访问方式访问 public public 属性的属性的成员成员-9-类的成员函数可以有多种特殊形式,包括带默类的成员函数可以有多种特殊形式,包括带默认参数值的成员函数、内联成员函数和重载成认参数值的成员函数、内联成员函数和重载成员函数。员函数。8.4 8.4 类的成员函数类的成员函数-10-class Studentpublic:Student(int pId,char*pName,char pSex);/构造函数构造函数 void printStudent();/printStudent函数声明函数声明 void setNatio
8、nality(char*pNationality);/设置国籍函数设置国籍函数private:int id;/定义学号变量定义学号变量 char*name;/定义姓名字符指针变量定义姓名字符指针变量 char sex;/定义性别变量定义性别变量 char*nationality;/定义国籍字符指针变量定义国籍字符指针变量;8.4.1 8.4.1 带默认参数值的成员函数带默认参数值的成员函数-11-void Student:setNationality(char*pNationality=China)nationality=new charstrlen(pNationality)+1;if(na
9、tionality!=0)strcpy(nationality,pNationality);调用:调用:Student stu(1,wang,M);stu.setNationality();8.4.1 8.4.1 带默认参数值的成员函数带默认参数值的成员函数-12-如果在类的内部定义成员函数的具体实现,则如果在类的内部定义成员函数的具体实现,则该成员函数为该成员函数为内联内联成员函数。成员函数。函数定义时没有任何的附加说明,所以称为隐函数定义时没有任何的附加说明,所以称为隐式声明的内联成员式声明的内联成员。8.4.2 8.4.2 内联成员函数内联成员函数-13-8.4.2 8.4.2 内联成员
10、函数内联成员函数在类中说明原形,可以在类外给出函数体实在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函以直接在类中给出函数体,形成内联成员函数。数。在类中在类中声明内联成员函数声明内联成员函数的方式:的方式:n将函数体放在类的声明中(将函数体放在类的声明中(隐式隐式)。)。n使用使用inlineinline关键字(关键字(显示显示)。)。-14-class Studentpublic:void printStudent();/打印所有信息打印所有信息 /根据根据flag取值打印不同信息取值打
11、印不同信息 /flag=1,打印打印id /flag=2,打印打印name /flag=3,打印打印sex /flag=4,打印打印nationalityvoid printStudent(int flag);private:;8.4.3 8.4.3 重载成员函数重载成员函数-15-关键字关键字publicpublic、protectedprotected、privateprivate说明类成说明类成员的访问控制属性。私有(员的访问控制属性。私有(privateprivate)成员成员只只允许本类的成员函数来访问允许本类的成员函数来访问;公有(;公有(publicpublic)成员是类对外的接
12、口,在成员是类对外的接口,在类声明和类(函数)类声明和类(函数)实现之后,外部对象可以访问公有成员实现之后,外部对象可以访问公有成员。保护。保护型(型(protectedprotected)成员的可访问性和私有成员成员的可访问性和私有成员的性质相似,与继承有关。的性质相似,与继承有关。8.5 8.5 类成员的访问属性类成员的访问属性-16-关于访问控制属性,注意:关于访问控制属性,注意:在在类类声声明明中中,三三种种访访问问控控制制属属性性,可可以以按按任任意意次次序序出出现现,也也可可以以不不出出现现。publicpublic等等关关键键字字也也可可以以多多次次出出现现,但是一个成员只能具有
13、一种访问控制属性。但是一个成员只能具有一种访问控制属性。如如果果不不写写访访问问控控制制属属性性关关键键字字,默默认认的的是是privateprivate。在在书书写写时时通通常常习习惯惯将将publicpublic放放在在最最前前面面,这这样样便便于于阅阅读读,因为它们是外部访问时所要了解的。因为它们是外部访问时所要了解的。一一般般情情况况下下,一一个个类类的的数数据据成成员员应应该该声声明明为为私私有有成成员员,这这样样封封装装性性较较好好。一一个个类类应应该该有有一一些些公公有有的的函函数数成成员员,作为对外的接口,否则别的代码无法访问类作为对外的接口,否则别的代码无法访问类 8.5 8
14、.5 类成员的访问属性类成员的访问属性-17-8.5 8.5 类成员的访问属性类成员的访问属性公有成员数据公有成员数据私有成员数据私有成员数据公有成员函数公有成员函数私有成员函数私有成员函数类的内部类的内部的可访的可访问性:同一问性:同一个类的成员个类的成员函数函数可以访问可以访问可以访问可以访问可以访问可以访问可以访问可以访问类的外部类的外部的可访的可访问性:另一问性:另一个类的成员个类的成员函数或一般函数或一般函数函数可以访问可以访问不可访问不可访问可以访问可以访问不可访问不可访问-18-8.8.6 6 对象的使用对象的使用对象是类的一个具体的实例,类和对象的关系对象是类的一个具体的实例,
15、类和对象的关系相当于普遍与特殊的关系。在相当于普遍与特殊的关系。在C+C+中,类是一中,类是一个自定义的数据类型,对象是该数据类型的一个自定义的数据类型,对象是该数据类型的一个变量。个变量。所以,可以定义一个所以,可以定义一个全局的对象全局的对象,也可以在函,也可以在函数体中定义一个数体中定义一个局部的对象局部的对象,或者动态地从,或者动态地从堆堆中申请空间来创建一个对象,还可以定义对象中申请空间来创建一个对象,还可以定义对象数组,以及使用对象作为函数的参数与返回值。数组,以及使用对象作为函数的参数与返回值。-19-8.6.1 8.6.1 对象指针对象指针声明对象指针的一般语法形式为:声明对象
16、指针的一般语法形式为:类名类名*对象指针名;对象指针名;使用对象指针访问对象的成员,语法形式为:使用对象指针访问对象的成员,语法形式为:对象指针名对象指针名-公有成员;公有成员;例如:例如:Clock c;Clock c;Clock*pc1=new Clock;Clock*pc1=new Clock;Clock*pc2=&c;Clock*pc2=&c;pc1-SetTime(12,5,0);pc1-SetTime(12,5,0);-20-8.6.2 this8.6.2 this指针指针问:一个类中所有对象调用的成员函数都执行同问:一个类中所有对象调用的成员函数都执行同一段代码。那么,成员函数又
17、是怎么识别当前一段代码。那么,成员函数又是怎么识别当前是那个对象在访问呢?是那个对象在访问呢?答:答:thisthis指针指出了成员函数当前所操作的数据指针指出了成员函数当前所操作的数据所属的对象所属的对象。不同的对象调用成员函数时,。不同的对象调用成员函数时,thisthis指针将指向不同的对象,也就可以访问不指针将指向不同的对象,也就可以访问不同对象的数据成员。同对象的数据成员。-21-8.6.3 8.6.3 对象数组对象数组对象数组的元素是对象,不仅具有数据成员,对象数组的元素是对象,不仅具有数据成员,而且还有函数成员,可以通过数组元素调用成而且还有函数成员,可以通过数组元素调用成员函数
18、。员函数。例:student stu10;-22-8.6.4 8.6.4 对象用做函数的参数和返回值对象用做函数的参数和返回值可以将对象作为参数传递给一个函数或从函数可以将对象作为参数传递给一个函数或从函数返回一个对象。返回一个对象。直接用对象作为参数直接用对象作为参数,调用函数时,进行,调用函数时,进行值传值传递递,实参的值要复制给形参,实参的值要复制给形参,如果类的数据成如果类的数据成员较多时,需要一一复制员较多时,需要一一复制.但是,这种参数传递方式效率不高,可以使用但是,这种参数传递方式效率不高,可以使用对象指针或对象引用对象指针或对象引用方式来传递函数参数。方式来传递函数参数。-23
19、-8.7 8.7 构造函数构造函数构造函数的作用是在对象被创建时使用特定构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象的值构造对象,或者说将对象初始化初始化为一个为一个特定的状态。特定的状态。在对象创建时在对象创建时由系统自动调用由系统自动调用。如果程序中未声明,则系统自动产生出一个如果程序中未声明,则系统自动产生出一个缺省形式缺省形式的构造函数的构造函数允许为允许为内联内联函数、函数、重载重载函数、函数、带缺省形参值带缺省形参值的函数的函数-24-8.7 8.7 构造函数构造函数class Clockclass Clock public:public:Clock(int N
20、ewH,int NewM,int NewS);/Clock(int NewH,int NewM,int NewS);/构造函数构造函数 Clock()/Clock()/缺省构造函数缺省构造函数void SetTime(int NewH,int NewM,int NewS);void SetTime(int NewH,int NewM,int NewS);void ShowTimevoid ShowTime();private:private:int Hour,Minute,Second;int Hour,Minute,Second;-25-构造函数的实现:构造函数的实现:Clock:Clock
21、(int H,int M,int S)Clock:Clock(int H,int M,int S)Hour=H;Hour=H;Minute=M;Minute=M;Second=S;Second=S;建立对象时构造函数的作用:建立对象时构造函数的作用:void mainvoid main()Clock c(0,0,0);/Clock c(0,0,0);/隐含调用构造函数,将初始值作为实参。隐含调用构造函数,将初始值作为实参。c.ShowTimec.ShowTime();-26-8.7 8.7 构造函数构造函数每每个个对对象象区区别别于于其其他他对对象象的的地地方方主主要要有有两两个个,外外在在的
22、的区区别别就就是是对对象象的的标标识识符符,即即对对象象的的名名称称,而而内内在在的的区区别就是对象自身的属性值,即数据成员的值。别就是对象自身的属性值,即数据成员的值。在在定定义义一一个个对对象象的的时时候候要要给给它它分分配配存存储储空空间间,也也可可以以同时给它的数据成员赋初值,称为对象的初始化。同时给它的数据成员赋初值,称为对象的初始化。C+C+程程序序中中的的对对象象初初始始化化工工作作由由一一个个特特殊殊的的成成员员函函数数来来完成,就是构造函数完成,就是构造函数。因因为为不不同同类类型型的的对对象象的的初初始始化化工工作作是是不不一一样样的的,因因此此构构造造函函数数从从属属于于
23、某某个个类类的的,即即每每个个类类都都要要定定义义它它自自己己的构造函数,它是类的成员函数。的构造函数,它是类的成员函数。-27-定义构造函数的一般形式为:class class 类名类名 public:public:类名(形参表)类名(形参表);/构造函数的原型构造函数的原型/类的其它成员类的其它成员;类名类名:类名(形参表)类名(形参表)/构造函数的实现构造函数的实现/函数体函数体 8.7 8.7 构造函数构造函数-28-构造函数的特点是:构造函数的特点是:构构造造函函数数的的函函数数名名与与类类名名相相同同;而而且且没没有有返返回回值值。构造函数一定是公有函数构造函数一定是公有函数。作作
24、为为类类的的成成员员函函数数,构构造造函函数数可可以以直直接接访访问问类类的所有数据成员。的所有数据成员。在在类类的的内内部部定定义义的的构构造造函函数数是是内内联联函函数数。构构造造函数可以带默认形参值,也可以重载。函数可以带默认形参值,也可以重载。8.7 8.7 构造函数构造函数-29-在在声声明明类类时时如如果果没没有有定定义义类类的的构构造造函函数数,编编译译系系统统就就会会在在编编译译时时自自动动生生成成一一个个默默认认形形式式的的构构造函数造函数;默认构造函数是不提供参数的构造函数默认构造函数是不提供参数的构造函数。8.7 8.7 构造函数构造函数-30-8.8 8.8 析构函数析
25、构函数完成对象被删除前的一些清理工作完成对象被删除前的一些清理工作。在对象的生存期结束的时刻系统自动调用它,在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。然后再释放此对象所属的空间。如果程序中未声明析构函数,编译器将自动产如果程序中未声明析构函数,编译器将自动产生生一个缺省的析构函数一个缺省的析构函数。-31-构造函数和析构函数举例#includeclass Point public:Point(int xx,int yy);Point();/.其它函数原形其它函数原形 private:int X,int Y;-32-Point:Point(int xx,int yy)X
26、=xx;Y=yy;Point:Point()/.其它函数的实现略其它函数的实现略-33-与与构构造造函函数数相相反反,当当对对象象生生存存期期结结束束时时,需需要要调用析构函数,释放对象所占的内存空间。调用析构函数,释放对象所占的内存空间。与与构构造造函函数数一一样样,析析构构函函数数也也是是类类的的一一个个公公有有成成员员函函数数,它它的的名名称称是是在在类类名名前前加加“”构构成成,没没有有返返回回值值,和和构构造造函函数数不不同同的的是是析析构构函函数数不不接受任何参数,析构函数是不可重载的。接受任何参数,析构函数是不可重载的。析析构构函函数数是是在在对对象象生生存存期期即即将将结结束束
27、的的时时刻刻由由系系统统自自动动调调用用的的。如如果果程程序序员员没没有有定定义义析析构构函函数数,系统将系统将自动生成和调用一个默认析构函数自动生成和调用一个默认析构函数。8.8.8 8 析构函数析构函数-34-拷拷贝贝构构造造函函数数就就是是函函数数的的形形参参是是类类的的对对象象的的引引用的构造函数。用的构造函数。通通过过等等于于号号复复制制对对象象时时,系系统统会会自自动动调调用用拷拷贝贝构造函数。构造函数。如如果果程程序序在在类类定定义义时时没没有有显显式式定定义义拷拷贝贝构构造造函函数数,系系统统也也会会自自动动生生成成一一个个默默认认的的拷拷贝贝构构造造函函数数,把成员值一一复制
28、。,把成员值一一复制。拷拷贝贝构构造造函函数数与与原原来来的的构构造造函函数数实实现现了了函函数数的的重载。重载。8.8.9 9 拷贝构造函数拷贝构造函数-35-以下三种情况系统会自动调用拷贝构造函数:以下三种情况系统会自动调用拷贝构造函数:当当用用类类的的一一个个对对象象去去初初始始化化该该类类的的另另一一个个对对象象时时 如如果果函函数数的的形形参参是是类类的的对对象象,为为值值传传递递,调调用用函数时,进行形参和实参结合时函数时,进行形参和实参结合时 如如果果函函数数的的返返回回值值是是类类的的对对象象,函函数数执执行行完完成成返回调用者时返回调用者时 8.8.9 9 拷贝构造函数拷贝构
29、造函数-36-拷贝构造函数拷贝构造函数是一种特殊的构造函数,其形参为本类的对拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。象引用。class class 类名类名 public:public:类名(形参);类名(形参);/构造函数构造函数 类名(类名类名(类名&对象名);对象名);/拷贝构造函数拷贝构造函数 .;类名类名:类名(类名类名(类名&对象名)对象名)/拷贝构造函数的实现拷贝构造函数的实现 函数体函数体 -37-例 拷贝构造函数举例当用类的一个对象去初始化该类的另一个对象当用类的一个对象去初始化该类的另一个对象时系统自动调用它实现拷贝赋值。时系统自动调用它实现拷贝赋值。vo
30、id main(void)Point A(1,2);Point B(A);/拷贝构造函数被调用拷贝构造函数被调用 coutB.GetX()endl;-38-拷贝构造函数举例若函数的形参为类对象,调用函数时,实参若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。赋值给形参,系统自动调用拷贝构造函数。例如:例如:void fun1(Point p)coutp.GetX()endl;void main()Point A(1,2);fun1(A);/调用拷贝构造函数调用拷贝构造函数 -39-拷贝构造函数举例当函数的返回值是类对象时,系统自动调用拷贝构当函数的返回值是类对象时,
31、系统自动调用拷贝构造函数。例如:造函数。例如:Point fun2()Point A(1,2);return A;/调用拷贝构造函数调用拷贝构造函数void main()Point B;B=fun2();-40-完完成成简简单单的的一一一一对对应应的的复复制制的的拷拷贝贝构构造造函函数数称称为为浅拷贝浅拷贝。如如果果类类的的数数据据成成员员包包括括指指针针变变量量,类类的的构构造造函函数数用用newnew运运算算符符为为这这个个指指针针动动态态申申请请空空间间。如如果果通通过过浅浅拷拷贝贝进进行行了了对对象象的的复复制制。最最后后,在在退退出出运运行行时时,程程序序会会报报错错。这这时时需需要
32、要用用“深深拷拷贝贝”的的方方式式恰当定义类的拷贝构造函数。恰当定义类的拷贝构造函数。一一般般来来讲讲,如如果果一一个个类类需需要要析析构构函函数数来来释释放放资资源源,则则它它也也需需要要定定义义一一个个显显式式拷拷贝贝构构造造函函数数来来实实现现深深拷贝拷贝。8.10 8.10 浅拷贝与深拷贝浅拷贝与深拷贝-41-静态成员静态数据成员静态数据成员n用关键字用关键字staticstatic声明声明n该类的所有对象维护该成员的同一个拷贝该类的所有对象维护该成员的同一个拷贝n必须在类外定义和初始化,用必须在类外定义和初始化,用(:)(:)来指明所属来指明所属的类。的类。静态成员函数静态成员函数n
33、类外代码可以使用类名和作用域操作符来调用类外代码可以使用类名和作用域操作符来调用静态成员函数静态成员函数。n静态成员函数只能引用属于该类的静态成员函数只能引用属于该类的静态数据成静态数据成员或静态成员函数。员或静态成员函数。-42-8.11.1 8.11.1 静态成员数据静态成员数据静静态态成成员员数数据据是是类类的的数数据据成成员员的的一一种种特特例例,采采用用staticstatic关键字来声明。关键字来声明。类类的的数数据据成成员员在在类类的的每每一一个个对对象象中中分分别别存存储储不不同同的的数数值值,但但是是静静态态成成员员数数据据则则不不同同,它它在在整整个个类类中中只只有有一一个
34、个拷拷贝贝,由由该该类类的的所所有有对对象象共共同同维维护护和和使使用用,从从而而实实现了同一类的不同对象之间的数据共享。现了同一类的不同对象之间的数据共享。静态数据成员具有静态数据成员具有静态生存期静态生存期。在在类类的的声声明明中中只只能能声声明明静静态态成成员员数数据据的的存存在在。由由于于类类的的声声明明是是抽抽象象的的,静静态态成成员员数数据据的的初初始始化化需需要要在在类类的的外部进行,通过类名对它进行访问。外部进行,通过类名对它进行访问。-43-8.11.2 8.11.2 静态成员函数静态成员函数可可以以通通过过定定义义和和使使用用静静态态成成员员函函数数来来访访问问静静态态数据
35、成员。数据成员。所所谓谓静静态态成成员员函函数数就就是是使使用用staticstatic关关键键字字声声明明函函数数成成员员。同同静静态态数数据据成成员员一一样样,静静态态成成员员函函数数也也属属整整个个类类,由由同同一一个个类类的的所所有有对对象象共共同同维维护,为这些对象所共享。护,为这些对象所共享。-44-8.11.2 8.11.2 静态成员函数静态成员函数静静态态成成员员函函数数作作为为成成员员函函数数,它它的的访访问问属属性性可可以以受受到到类类的的严严格格控控制制。对对公公有有静静态态成成员员函函数数,可可以以通通过过类类名名或或对对象象名名来来调调用用;而而一一般般的的非非静静态
36、公有成员函数只能通过态公有成员函数只能通过对象名对象名来调用。来调用。静静态态成成员员函函数数可可以以直直接接访访问问该该类类的的静静态态数数据据成成员员和和函函数数成成员员;而而访访问问非非静静态态数数据据成成员员,必必须须通通过过参参数数传传递递方方式式得得到到对对象象名名,然然后后通通过过对对象象名来访问。名来访问。-45-8.12 8.12 友元友元在在程程序序设设计计中中,将将数数据据与与操操作作数数据据的的行行为为进进行行有机地结合,这就是有机地结合,这就是封装封装。C+C+语语言言提提供供类类实实现现封封装装,类类是是属属性性和和操操作作的的结结合合体体,并并且且在在定定义义类类
37、的的属属性性和和操操作作时时,规规定定了它们的可见性。了它们的可见性。通通过过封封装装将将一一部部分分成成员员作作为为类类与与外外部部的的接接口口,而而将将其其它它的的成成员员隐隐藏藏起起来来,以以防防外外界界的的干干扰扰和和误误操操作作,使使程程序序的的不不同同模模块块之之间间的的相相互互影影响响减减小到最低限度。小到最低限度。-46-8.12.1 8.12.1 友元函数友元函数友元函数是在类声明中由关键字友元函数是在类声明中由关键字friendfriend修饰修饰说明的说明的非成员函数非成员函数,在它的函数体中能够通,在它的函数体中能够通过对象名访问过对象名访问 private priva
38、te 和和 protectedprotected成员成员作用:增加灵活性,使程序员可以在封装和作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择。快速性方面做合理选择。访问对象中的成员必须通过对象名。访问对象中的成员必须通过对象名。-47-例.使用友元函数计算两点距离#include#include#include#include class Pointclass Point/Point/Point类声明类声明public:public:/外部接口外部接口Point(int xx=0,int yy=0)X=xx;Y=yy;Point(int xx=0,int yy=0)X=xx;Y=y
39、y;int GetXint GetX()return X;return X;int GetYint GetY()return Y;return Y;friend double Distance(Point&a,Point&b);private:private:/私有数据成员私有数据成员int X,Y;int X,Y;-48-double Distance(Point&a,Point&b)double Distance(Point&a,Point&b)double dx=double dx=a a.X.X-b-b.X;.X;double dy=double dy=a a.Y-.Y-b b.Y;.
40、Y;return sqrt(dx*dx+dy*dy);return sqrt(dx*dx+dy*dy);int mainint main()Point p1(3.0,5.0),p2(4.0,6.0);Point p1(3.0,5.0),p2(4.0,6.0);double d=Distance(p1,p2);double d=Distance(p1,p2);coutThe distance is dendl;coutThe distance is dendl;return 0;return 0;-49-8.12.1 8.12.1 友元类友元类若一个类为另一个类的友元,若一个类为另一个类的友元,
41、则此类的所有成则此类的所有成员都能访问对方类的私有成员员都能访问对方类的私有成员。声明语法:将友元类名在另一个类中使用声明语法:将友元类名在另一个类中使用friendfriend修饰说明。修饰说明。-50-友元类举例class A friend class B;public:void Display()coutxendl;private:int x;class B public:void Set(int i);void Display();private:A a;-51-void B:Set(int i)a.x=i;void B:Display()a.Display();-52-关于友元类,要
42、注意:关于友元类,要注意:友友元元关关系系是是不不能能传传递递的的。B B类类是是A A类类的的友友元元,C C类类是是B B类类的的友友元元,C C类类和和A A类类之之间间,如如果果没没有有声声明,就没有任何友元关系,不能进行数据共享。明,就没有任何友元关系,不能进行数据共享。友友元元关关系系是是单单向向的的。如如果果声声明明B B类类是是A A类类的的友友元元,B B类类的的成成员员函函数数就就可可以以访访问问A A类类的的私私有有和和保保护护数数据据,但但A A类类的的成成员员函函数数却却不不能能访访问问B B类类的的私私有有和和保护数据。保护数据。8.13 8.13 常对象常对象-5
43、4-8.13 8.13 常对象常对象定定义义对对象象时时用用constconst进进行行修修饰饰,称称为为常常对对象象,它它的的数数据据成成员员值值在在对对象象的的整整个个生生存存期期间间内内不不能能被被改改变变。也也就就是是说说,常常对对象象在在定定义义时时必必须须进进行行初始化,而且不能被更新。初始化,而且不能被更新。使使用用常常量量,既既实实现现了了数数据据共共享享、又又可可以以保保证证数数据不会被改变。据不会被改变。class A public:A(int i,int j)x=i;y=j;.private:int x,y;A const a(3,4);/a是常对象,不能被更新是常对象,
44、不能被更新 8.14 8.14 常成员常成员-56-8.14 8.14 常成员常成员对对于于类类的的某某个个成成员员函函数数,使使用用constconst关关键键字字修修饰饰,称称为为常常成成员员函函数数。常常对对象象只只能能调调用用常常成成员员函数,函数,保证常对象的数据成员不能被修改。保证常对象的数据成员不能被修改。使使用用constconst说说明明的的数数据据成成员员称称为为常常数数据据成成员员。如如果果在在一一个个类类中中说说明明了了常常数数据据成成员员,那那么么任任何何函数中都不能对该成员赋值。函数中都不能对该成员赋值。常成员函数说明格式:常成员函数说明格式:类型说明符类型说明符
45、函数名(参数表)函数名(参数表)const;1)const是函数类型的一个组成部分,因此在实现是函数类型的一个组成部分,因此在实现部分也要带部分也要带const关键字。关键字。2)const关键字可以被用于参与对重载函数的区分关键字可以被用于参与对重载函数的区分3)常对象只能调用常成员函数;但是普通对象也可以常对象只能调用常成员函数;但是普通对象也可以调用常成员函数调用常成员函数使用使用const说明的数据成员。格式如下:说明的数据成员。格式如下:const 类型说明符类型说明符 数据成员名;数据成员名;-57-例 常成员函数举例#includeincludeclass Rclass R pu
46、blic:public:R(int r1,int r2)R1=r1;R2=r2;R(int r1,int r2)R1=r1;R2=r2;void print void print();void print void print()constconst;private:private:int R1,R2;int R1,R2;-58-例 常数据成员举例#include#includeclass Aclass Apublic:public:A(int i);A(int i);void printvoid print();const int&r;const int&r;private:private:
47、const int a;const int a;static const int b;/static const int b;/静态常数据成员静态常数据成员,只能初始化只能初始化,不能赋值;不能赋值;;8.15 8.15 组合关系组合关系-62-8.15 8.15 组合关系组合关系-63-8.15 8.15 组合关系组合关系#include using namespace std;class Tyre /轮胎类轮胎类Tyre的定义的定义public:Tyre()coutConstructing one Tyre.endl;private:float maxSpeed;/最大速度最大速度int
48、loadIndex;/载重指数载重指数float diameter;/直径直径char spec20;/规格规格char company20;/生产厂家生产厂家;-64-8.15 8.15 组合关系组合关系class SteeringWheel /方向盘类方向盘类SteeringWheel的定义的定义public:SteeringWheel()coutConstructing one SteeringWheel.endl;private:int color;/颜色颜色 char material20;/材质材质char type10;/类型类型 char company20;/生产厂家生产厂家
49、;-65-8.15 8.15 组合关系组合关系class Motor /发动机类发动机类Motor的定义的定义public:Motor()coutConstructing one Motor.endl;private:float gasDischarge;/排气量排气量float oilConsume;/耗油量耗油量float power;/功率功率float zip;/压缩比压缩比char company20;/生产厂家生产厂家;-66-8.15 8.15 组合关系组合关系class Car /汽车类汽车类Car的定义的定义public:Car()coutConstructing one C
50、ar.endl;private:Tyre t44;/四个轮台四个轮台SteeringWheel sw;/一个方向盘一个方向盘Motor m;/一个发动机一个发动机;int main()Car car;return 0;8.16 8.16 类模板类模板-68-8.16 8.16 类模板类模板类模板是一个可以生成类的类模板是一个可以生成类的“超级数据类型超级数据类型”。定义类模板的语法如下:定义类模板的语法如下:template class template n -69-8.16 8.16 类模板类模板#include using namespace std;template class Maxp