版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四章第四章 类和对象类和对象面向对象程序设计及面向对象程序设计及C+C+计算机系计算机系本章主要本章主要内容内容l类概念和定义类概念和定义l对象的声明对象的声明l构造函数构造函数l析构函数析构函数l拷贝构造函数拷贝构造函数l对象数组和对象指针对象数组和对象指针l向函数传递对象向函数传递对象l静态成员静态成员l友元友元l类的聚集类的聚集( (类对象为成员类对象为成员) )结构和类结构和类1 1、结构的扩充。、结构的扩充。C C中,只有可能包含不同类型的数据中,只有可能包含不同类型的数据C+C+中,还有可能包含函数中,还有可能包含函数P50P50例例3.13.1C+C+中,一个结构的成员通常分为
2、:中,一个结构的成员通常分为:l私有成员(内部细节的对外隐藏)私有成员(内部细节的对外隐藏)l公有成员(对外提供的服务功能窗口)公有成员(对外提供的服务功能窗口)C+C+中的类中的类 更安全的数据类型更安全的数据类型l类是具有相同属性和行为的一组对象类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属供了统一的抽象描述,其内部包括属性和行为两个主要部分。性和行为两个主要部分。l利用类可以实现数据的封装、隐藏、利用类可以实现数据的封装、隐藏、继承与派生。其模块化程度比继承与派生。其模块化程度比C C中采中采用函数更高。用
3、函数更高。类的定义格式:类的定义格式:class public: ; private: ; protected: ; 类的说明部分类的说明部分关键字关键字访问权限关键字访问权限关键字类的实现部分类的实现部分公有类型成员公有类型成员在关键字在关键字publicpublic后面声明,它们是类后面声明,它们是类与外部的接口,任何外部函数都可以访与外部的接口,任何外部函数都可以访问公有类型数据和函数。问公有类型数据和函数。私有类型成员私有类型成员在关键字在关键字privateprivate后面声明,后面声明,只允许只允许本类中的函数访问,而类外部的任何函本类中的函数访问,而类外部的任何函数都不能访问。
4、数都不能访问。如果如果紧跟在类名称的后面声明私有成员,紧跟在类名称的后面声明私有成员,则则关键字关键字privateprivate可以可以省略。省略。保护类型保护类型在关键字在关键字protectedprotected后面声明后面声明与与privateprivate类似,其差别表现在继承类似,其差别表现在继承与派生时对派生类的影响不同。与派生时对派生类的影响不同。数据成员数据成员 格式: 类型 变量列表;描述对象的内部数据结构描述对象的内部数据结构1、与一般的变量定义相同,但需要将它放在类、与一般的变量定义相同,但需要将它放在类的定义体中。的定义体中。 2 2、类中所有成员不可用、类中所有成员
5、不可用externextern(外部变量(外部变量) )、autoauto、registregist(寄存器变量)进(寄存器变量)进 行修饰。行修饰。3 3、在类中不允许对所定义的数据成员进在类中不允许对所定义的数据成员进行初始化。行初始化。基本类型、已声明的派生类型基本类型、已声明的派生类型说明:说明:成员函数成员函数 操作数据成员操作数据成员格式格式 返回类型返回类型 类名类名 : : 成员函数名(参数说明)成员函数名(参数说明) 函数体 在类中说明原形,在类外定义函数体实现,并在函在类中说明原形,在类外定义函数体实现,并在函数名前使用类名加以限定。也可以直接在类中定义函数数名前使用类名加
6、以限定。也可以直接在类中定义函数体,形成内联成员函数。体,形成内联成员函数。说明:说明:1. 在类中可以直接访问类中说明的成员以在类中可以直接访问类中说明的成员以描述该成员函描述该成员函数对它们所进行的操作;数对它们所进行的操作;2. 2. 一般成员函数可以重载。一般成员函数可以重载。3. 3. 成员函数可以设置参数的缺省值。成员函数可以设置参数的缺省值。4. 4. 函数体可写在类体内(函数体可写在类体内(内联函数内联函数),也可写在类体外),也可写在类体外这时有两种情况:有这时有两种情况:有inlineinline引导的显式内联函数、普引导的显式内联函数、普通非内联函数。通非内联函数。5.
7、5. 在在C+C+中,类和结构类似,但区别在于:缺省值不同中,类和结构类似,但区别在于:缺省值不同, ,缺省情况下,类中的所有成员均为缺省情况下,类中的所有成员均为私有成员私有成员 内联成员函数内联成员函数l为了提高运行时的效率,对于较简单为了提高运行时的效率,对于较简单的函数可以声明为内联形式。的函数可以声明为内联形式。l在类中声明内联成员函数的方式:在类中声明内联成员函数的方式:将函数体放在类的声明中。将函数体放在类的声明中。使用使用inlineinline关键字。关键字。例例: :一个关于日期类的定义一个关于日期类的定义Class TDatepublic :void SetDate(in
8、t y,int m,int d)int IsLeapYear();void Print();private:int year,month,day;/私有数据成员私有数据成员/公有成员函数公有成员函数日期类的实现部分:日期类的实现部分:inline void TDate:SetDate(int y,int m,int d) year=y; month=m; day=d; int TDate:IsLeapYear() return(year% 4=0&year%100!=0)|(year%400=0); inline void TDate:Print()() coutyear“.”mont
9、h“.”dayendl; 例题:例题:#include#includevoid main()() TDate date1; date1.SetDate(1996,5,4); int leap=date1.IsLeapYear(); coutleapendl; date1.Print;说明:程序由三部分组成说明:程序由三部分组成1、类的定义、类的定义2、类成员函数的具体实现、类成员函数的具体实现3、声明对象并传递消息、声明对象并传递消息对象的定义对象的定义定义格式:定义格式:对象成员的访问方法对象成员的访问方法; 一个或多个对象名,以逗号分割;可以是一个或多个对象名,以逗号分割;可以是指向对象指
10、向对象的指针的指针或或引用名引用名,或对象数组名,或对象数组名例:例:TDate date1,date2,*Pdate,date31,&date3=date1; 类的对象是该类的某一特定实体,即类类型的变类的对象是该类的某一特定实体,即类类型的变量。定义对象之前,一定要先说明该对象的类。量。定义对象之前,一定要先说明该对象的类。类中成员的访问方式类中成员的访问方式l类中成员互访类中成员互访l类外访问类外访问P57例例3.3直接使用成员名直接使用成员名一般对象的成员表示方法:使用一般对象的成员表示方法:使用“对象对象名名.成员名成员名”方式访问方式访问 public 属性的成员属性的成员
11、指向对象的指针的成员表示方法:使用指向对象的指针的成员表示方法:使用“对象指针名对象指针名成员名成员名”或或“*对象指针对象指针名名.成员名成员名”方式访问方式访问 public 属性的成员属性的成员几种特殊的成员函数几种特殊的成员函数: 对数据成员进行初始化。(赋值语句、初始化表)对数据成员进行初始化。(赋值语句、初始化表) 缺省构造函数缺省构造函数 拷贝初始化构造函数(制造复制品)拷贝初始化构造函数(制造复制品) 专门做扫尾工作的,完成对象被删除前的一些清理专门做扫尾工作的,完成对象被删除前的一些清理工作。工作。 缺省析构函数缺省析构函数构造函数:构造函数:析构函数析构函数:创建类的对象时
12、系统自动调用。创建类的对象时系统自动调用。构造函数构造函数作用:作用:在对象被创建时使用特定的值构造对象,或者在对象被创建时使用特定的值构造对象,或者说将对象说将对象初始化初始化为一个特定的状态。为一个特定的状态。 特点:特点: 1 1、构造函数名与类名相同。、构造函数名与类名相同。 函数体可写在类体内,也可写在类体外函数体可写在类体内,也可写在类体外 2 2、不指明类型说明。、不指明类型说明。 可以有一个或多个参数,不可用可以有一个或多个参数,不可用void void 修饰修饰 3 3、可、可重载重载定义。表示类对象的不同初始化方式。定义。表示类对象的不同初始化方式。 允许为允许为内联内联函
13、数、函数、带缺省形参值带缺省形参值的函数的函数 4 4、如果程序中未定义,则系统自动产生出、如果程序中未定义,则系统自动产生出一个缺省形一个缺省形式式的无参构造函数(的无参构造函数(只创建对象,不会给对象的数据成员只创建对象,不会给对象的数据成员赋初值)赋初值)。但只要程序中定义过了任何一个不管是有参)。但只要程序中定义过了任何一个不管是有参或无参的构造函数,系统都不会再产生缺省的构造函数了。或无参的构造函数,系统都不会再产生缺省的构造函数了。 初始化方式说明初始化方式说明P64:l在构造函数体内用赋值语句给对象的数据成员在构造函数体内用赋值语句给对象的数据成员赋初值。赋初值。Tdate:TD
14、ate(int y,int m,int d)year=y;month=m;day=d;l通过初始化表的机制进行初始化。通过初始化表的机制进行初始化。初始化表:位于构造函数的首部,形式如下:初始化表:位于构造函数的首部,形式如下:构造函数名:数据成员构造函数名:数据成员( (初始值初始值) ),数据成员,数据成员( (初始值初始值) )如:如:Tdate:TDate(int y,int m,int d):year(y),month(m),day(d)说明:说明:l有些特殊类型的数据成员(有些特殊类型的数据成员(常量类型常量类型声明声明const和引用类型声明和引用类型声明type &),
15、),在构造函数中不能通过赋值语句直接在构造函数中不能通过赋值语句直接赋值,只能通过初始化表进行赋值。赋值,只能通过初始化表进行赋值。l而有些数据成员,如果是需要存放在而有些数据成员,如果是需要存放在堆中或数组中,则必须在构造函数中堆中或数组中,则必须在构造函数中使用赋值语句,不要用初始化表的方使用赋值语句,不要用初始化表的方式式P83例例 题:题:#includeclass initi_data int x; int ℞ const float pi; public: initi_data(int x1):rx(x),pi(3.14) x=x1; void display() c
16、outx=x rx=rx pi=pi; ;void main() initi_data id(100); id.display();执行结果:执行结果: x=100 rx=100 pi=3.14说明:初始化表实现对引用类型变量说明:初始化表实现对引用类型变量rx和常量和常量pi的初始化的初始化析构函数析构函数 具有特定有意义的成员函数具有特定有意义的成员函数特点 1 1、函数名与类名相同,加前缀、函数名与类名相同,加前缀 2 2、无重载、无重载 3 3、不指明数据类型,无参数、不可用、不指明数据类型,无参数、不可用void void 修饰修饰 4 4、当对象生存期结束,系统自动调用。、当对象生
17、存期结束,系统自动调用。1、如果一个对象被定义在一个函数体内,则当、如果一个对象被定义在一个函数体内,则当该函数结束时,自动调用析构函数该函数结束时,自动调用析构函数2 2、当一个对象是使用、当一个对象是使用newnew运算符被动态创建的,运算符被动态创建的,在使用在使用deletedelete释放它时,自动调用析构函数。释放它时,自动调用析构函数。撤消对象,返回内存空间撤消对象,返回内存空间缺省构造函数和缺省析构函数缺省构造函数和缺省析构函数说明:说明:当在程序中定义了一个对象而没有指明初始化时:当在程序中定义了一个对象而没有指明初始化时:1 1、类中没有定义构造函数,则编译器便按缺省构造函
18、数、类中没有定义构造函数,则编译器便按缺省构造函数来初始化该对象,这时该对象的所有数据成员初始值是来初始化该对象,这时该对象的所有数据成员初始值是任意的。任意的。2 2、在类中显式定义了没有参数的构造函数,则编译器调、在类中显式定义了没有参数的构造函数,则编译器调用该函数。用该函数。缺省构造函数格式:缺省构造函数格式: : ()()缺省析构函数格式:缺省析构函数格式: : ()() 重载构造函数重载构造函数class A / public: A(); A(int); A(int,char); A(float,char); / ;viod main() A x; A y(23); A m(12,
19、M); A w(3.4,W); / A (int i=0);warning C4520: A : multiple default constructors specifiederror C2668: A:A : ambiguous call to overloaded function二义性二义性拷贝构造函数拷贝构造函数- -自行复制本类对象自行复制本类对象class class 类名类名 public : public : 类名(形参);类名(形参);/构造函数构造函数 类名(类名类名(类名 & &对象名);对象名);/拷贝构造函数拷贝构造函数 . ;类名类名: : 类名(
20、类名类名(类名 & &对象名)对象名)/拷贝构造函数的实现拷贝构造函数的实现 函数体函数体 拷贝构造函数是一种特殊的构造函数,拷贝构造函数是一种特殊的构造函数,其形参其形参为本类的对象引用。为本类的对象引用。( (功能:把初始值对象的每一个功能:把初始值对象的每一个数据成员度复制到新建立的对象中去数据成员度复制到新建立的对象中去) )拷贝构造函数拷贝构造函数class Point public: Point(in xx=0,int yy=0)X=xx; Y=yy; Point(Point& p); int GetX() return X; int GetY() retu
21、rn Y; private: int X,Y;Point:Point (Point& p) X=p.X; Y=p.Y; cout拷贝构造函数被调用拷贝构造函数被调用endl;拷贝构造函数的调用(一拷贝构造函数的调用(一)例例:int main(void) Point A(1,2); Point B(A); /拷贝构造函数被调用拷贝构造函数被调用 coutB.GetX()endl; return 0; 当用类的一个对象去初始化该类的另一当用类的一个对象去初始化该类的另一个对象时系统自动调用它实现拷贝赋值。个对象时系统自动调用它实现拷贝赋值。拷贝构造函数的调用(二)拷贝构造函数的调用(二)
22、l例如:例如:void f(Point p) coutp.GetX()endl; /调用析构函数调用析构函数int main() Point A(1,2); f(A); /调用拷贝构造函数调用拷贝构造函数 return 0; 若函数的形参为类对象,调用函数时,实若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。参赋值给形参,系统自动调用拷贝构造函数。拷贝构造函数的调用(三)拷贝构造函数的调用(三)l例如:例如:Point g() Point A(1,2); return A; /调用拷贝构造函数调用拷贝构造函数int main() Point B; B=g(); re
23、turn 0; 当函数的返回值是类对象时,系统自动调用拷当函数的返回值是类对象时,系统自动调用拷贝构造函数。贝构造函数。拷贝构造函数拷贝构造函数如果程序员没有为类声明拷贝初始如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个拷化构造函数,则编译器自己生成一个拷贝构造函数。贝构造函数。这个构造函数执行的功能是:用作这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员初始化将要建立的对象的对应数据成员。例:例:Class Tdatepublic :TDate(int y,int m,int d);TDate
24、(TDate &date); TDate() cout“Destructor called.n”;void Print();private:int year,month,day;Tdate:TDate(int y,int m,int d)year=y;month=m;day=d; cout“Constructor called.n”;Tdate:TDate(TDate &date)year=date.year;month=date.month;day=date.day; cout“Constructor called.n”;void Tdate:Print()coutyear“
25、.”;coutmonth“.”;coutdayendl;#include#includevoid main()TDate day1(1998,5,26),day3;TDate day2(day1);day3f(day2);day3.print();();TDate f(TDate Q)int y,m,d;yQ.year1;mQ.month+1;d=Q.day+1;TDate R(y,m,d);return R;思考:思考:该程序共调用拷贝初始化函数该程序共调用拷贝初始化函数几次,调用析构函数几次?几次,调用析构函数几次?说明:拷贝初始化函数的使用说明:拷贝初始化函数的使用:1 1、明确表示由一
26、个对象初始化另一个对象时;明确表示由一个对象初始化另一个对象时; 如如:TDateTDate day2 day2(day1day1););2 2、当对象作为函数参数传递给函数形参时、当对象作为函数参数传递给函数形参时;如如:day3day3f f(day2day2););3 3、当对象作为函数返回值时;、当对象作为函数返回值时; 如如:return Rreturn R;对象数组和对象指针对象数组和对象指针l对象数组:数组里的每个元素都是某个对象数组:数组里的每个元素都是某个类类型的对象。类类型的对象。l创建对象数组时对数组元素的初始化。创建对象数组时对数组元素的初始化。对象与数组对象与数组/例
27、例3.12#includeclass exam int x;public: void set_x(int n) x=n; int get_x() return x;void main() int i; for (i=0;i4;i+) for (i=0;i4;i+) cout endl;有四个对象: ob0, ob1 ob2, ob3对象名.成员名有参构造函数,数组对象赋值有参构造函数,数组对象赋值#includeclass examint x;public:exam(int n) x=n;int get_x() return x;void main() exam ob4= 11,22,33,4
28、4; int i; for (i=0;i4;i+) outobi.get_x() ; cout endl;定义对象数组、 赋值执行结果:执行结果:11 22 33 44 对象数组元素例:例:#includeclass pointprivate: int x,y;public: point() x=5;y=5; /无参构造函数无参构造函数point(int a, int b) /有参构造函数有参构造函数 x=a;y=b;int getx() return x;int gety() return y;void main() point op(3,4); coutop x=op.getx(); co
29、ut op y=op.gety()endl; point op_array20; coutop_array15 x=op_array15.getx(); coutop_array15 y=op_array15.gety()endl; 对象数组元素.成员函数 对象名.成员函数执行结果执行结果 op x=3 op y=4op_array15 x=5 op_array15 y=5/例例 对二维数组对象进行初始化对二维数组对象进行初始化#includeclass exampleprivate: int x,y;public: example(int n, int m) /有参构造函数有参构造函数 x=
30、n; y=m; example( ) cout“Destructor called.n”; int getx( ) return x;int gety( ) return y;main()example op32=example(1,2), example(3,4), example(5,6), example(7,8), example(9,10), example(11,12) ;int i;for (i=0;i3;i+)coutopi0.get_x ;coutopi0.get_y“n”; coutopi1.get_x ; coutopi1.get_y“n”; cout“n”;return
31、 0;阅读程序阅读程序#includeclass Apublic:A(int i=0)x=i;cout构造函数调用构造函数调用endl;A(const A &p) x=p.x; cout拷贝初始化构造函数调用拷贝初始化构造函数调用endl; void print() coutx=xendl;private: int x; main()A a1(10),a2; A arr12=a1,a2; int i; A arr23=A(10),A(20),A(30),arr33; for (i=0;i2;i+) arr1i.print (); for (i=0;i3;i+) arr2i.print
32、(); arr30=A(90); arr31=arr10; arr32=arr11; for (i=0;i-成员名成员名 ob-get_x() ob-get_x() /例例3_15#includeclass exe int x; public: void set_a(int a) x=a; void show_a() coutxshow_a(); 执行结果执行结果: 2 2 对象指针引用对象数组对象指针引用对象数组复习:复习: int array10, *p;数组名为数组的首地址数组名为数组的首地址p=array; 指针指向数组的第一个元素指针指向数组的第一个元素array0p+; 指针指向数
33、组的第二个元素指针指向数组的第二个元素array1对象数组与对象指针如同数组与指针的关系对象数组与对象指针如同数组与指针的关系exe ob4 , exe ob4 , * *p;p;p=ob; p=ob; 对象指针指向对象数组的第一个元素对象指针指向对象数组的第一个元素 ob0ob0p+; p+; 对象指针指向对象数组的第二个元素对象指针指向对象数组的第二个元素 ob1ob1/3_15_2#includeclass exe int x;public:void set_a(int a)x=a; void show_a()coutxshow_a(); p+; /指向数组的第二个元素指向数组的第二个元
34、素 p-show_a();执行结果:执行结果: 10 20this 指针指针this隐含在每个类的成员函数中。即:某个成员函数被调用时系统会自动向它传递一个即:某个成员函数被调用时系统会自动向它传递一个隐含的参数,该参数是指向函数操作对象的指针(地隐含的参数,该参数是指向函数操作对象的指针(地址),该指针用址),该指针用this来引用,称为来引用,称为this指针。指针。当一个对象调用成员函数时:当一个对象调用成员函数时: 1、编译程序将、编译程序将this指针指向当前对象的地址指针指向当前对象的地址 2、调用成员函数、调用成员函数 3、每次成员函数存取数据成员时,将隐含使用、每次成员函数存取
35、数据成员时,将隐含使用 this指针。指针。例:例:#includeclass exth int i;public:void load(int val)this-i=val; int get()return this-i; ;void main() exth obj1,obj2; obj1.load(100); obj2.load(200); coutobj1.get()endl; coutobj2.get()endl;exth obj1,obj2; obj.load(100); obj.load(200); coutobj1.get()endl; coutobj2.get()iobj1,th
36、is-i,指向,指向obj1obj1的的i=100i=100对象对象 obj2obj2调用调用load() load() 和和get()get()时,时, thisthis指针指向指针指向obj2, this-i , obj2, this-i , 指向指向obj2obj2的的i=200i=200阅读下面程序,观察运行结果,理解阅读下面程序,观察运行结果,理解this指针的含义指针的含义 #includeclass Apublic: A(int i=0,int j=0)x=i;y=j; void print( )cout调用该函数的对象的调用该函数的对象的this指针是指针是thisendl;
37、coutx=x ,y=yendl;private: int x,y;main()A a1(10,20),a2;cout“a1地址地址:&a1endl;a1.print();cout“a2地址地址:&a2endl;a2.print (); a1a1地址:地址:0 x0065FDF00 x0065FDF0调用该函数的对象的调用该函数的对象的thisthis指针是:指针是:0 x0065FDF00 x0065FDF0 x=10 ,y=20 x=10 ,y=20a2a2地址:地址:0 x0065FDE80 x0065FDE8调用该函数的对象的调用该函数的对象的thisthis指针是:指
38、针是:0 x0065FDE80 x0065FDE8x=0 ,y=0 x=0 ,y=0本章主要内容本章主要内容l类概念和定义类概念和定义l对象的声明对象的声明l构造函数构造函数l析构函数析构函数l拷贝构造函数拷贝构造函数l对象数组和对象指针对象数组和对象指针l向函数传递对象向函数传递对象l静态成员静态成员l友元友元l类的聚集类的聚集(类对象为成员类对象为成员)向函数传递对象向函数传递对象l对象可以作为参数传递给函数,其方对象可以作为参数传递给函数,其方法与传递系统自定义类型的数据相同,法与传递系统自定义类型的数据相同,在向函数传递对象时,可以通过传值在向函数传递对象时,可以通过传值调用方式,也可
39、以使用对象指针作为调用方式,也可以使用对象指针作为参数实现传地址调用,为了更直接体参数实现传地址调用,为了更直接体现传地址,大多数情况下使用对象引现传地址,大多数情况下使用对象引用作为函数参数。用作为函数参数。向函数传递对象向函数传递对象对象作为参数传递给函数对象作为参数传递给函数1、传值调用方式传值调用方式函数对对象的任何修改不影响调用该函数函数对对象的任何修改不影响调用该函数的对象本身。的对象本身。对象地址作为参数传递给函数对象地址作为参数传递给函数2 2、传地址调用方式传地址调用方式函数对对象的修改影响调用该函数的对象本身。函数对对象的修改影响调用该函数的对象本身。/3_19/3_19#
40、includeiostream.h#include class trclass tr int int i; i; public: public: tr(int tr(int n)i=n; n)i=n; void set_i(int void set_i(int n)i=n; n)i=n; int int get_i()return i; get_i()return i; ;void sqr_it(void sqr_it(tr tr ob ob) ) / /形参为形参为tr tr类类型类类型 ob.set_i(ob.get_i()ob.set_i(ob.get_i()* *ob.get_i();
41、ob.get_i(); coutcopy of obj has i vaule coutcopy of obj has i vaule of of ob.get_i();ob.get_i(); cout coutn;n; void main()void main() tr tr obj(10); obj(10); sqr_it(obj sqr_it(obj); ); / /传值的方式传给函数的形参传值的方式传给函数的形参 coutBut,obj.icoutBut,obj.i is unchanged in main:; is unchanged in main:; coutobj.get_i(
42、)endl coutobj.get_i()endl; ; 执行结果:执行结果:copy of obj has i vaule of 100But,obj.i is unchanged in main: 10/3_20/3_20#includeiostream.h#include class trclass tr int int i; i;public:public:tr(inttr(int n)i=n; n)i=n;void set_i(intvoid set_i(int n)i=n; n)i=n;intint get_i()return i; get_i()return i; ;void v
43、oid sqr_it(trsqr_it(tr * *ob)ob) / /形参为类形参为类tr tr的对象指针的对象指针 ob-set_i(ob-get_i() ob-set_i(ob-get_i()* *ob-get_i();ob-get_i(); coutcopy of obj has i vaule coutcopy of obj has i vaule of get_i(); of get_i(); cout coutn;n; void main()void main() tr tr obj(10); obj(10); sqr_it(&objsqr_it(&obj); )
44、; / /传地址的方式传给函数的形参传地址的方式传给函数的形参 coutNow,obj.icoutNow,obj.i in main has been in main has been changed:;changed:; coutobj.get_i()endl coutobj.get_i()endl; ; 执行结果:执行结果:copy of obj has i vaule of 100New,obj.i in main has been changed:100/3_21/3_21#includeiostream.h#include class trclass tr int int i; i;
45、public:public:tr(inttr(int n)i=n; n)i=n;void set_i(intvoid set_i(int n)i=n; n)i=n;intint get_i()return i; get_i()return i; ;void void sqr_it(trsqr_it(tr &ob) &ob) / /形参为类形参为类tr tr的对象引用的对象引用 ob-set_i(ob-get_i() ob-set_i(ob-get_i()* *ob-get_i();ob-get_i(); coutcopy of obj has i vaule coutcopy
46、of obj has i vaule of get_i(); of get_i(); cout coutn;n; void main()void main() tr tr obj(10); obj(10); sqr_it(objsqr_it(obj); ); coutNow,obj.i coutNow,obj.i in main has been in main has been changed:;changed:; coutobj.get_i()endl coutobj.get_i()endl; ; 执行结果:执行结果:copy of obj has i vaule of 100New,ob
47、j.i in main has been changed:100本章主要内容本章主要内容l类概念和定义类概念和定义l对象的声明对象的声明l构造函数构造函数l析构函数析构函数l拷贝构造函数拷贝构造函数l对象数组和对象指针对象数组和对象指针l向函数传递对象向函数传递对象l静态成员静态成员l友元友元l类的聚集类的聚集(类对象为成员类对象为成员)静态成员静态成员 lC+还有一种数据成员,称作还有一种数据成员,称作“静态静态”成员,成员,静态成员是所有对象公有的。静态成员有静态静态成员是所有对象公有的。静态成员有静态数据成员和静态函数成员之分。数据成员和静态函数成员之分。l静态数据成员静态数据成员l说明
48、静态数据成员的语句格式是:说明静态数据成员的语句格式是: static 类型说明符类型说明符 成员名;成员名;#includeiostream.h#include class jtcyclass jtcy int int a; a; static intstatic int b b; ;/ /静态数据成员静态数据成员 public:public: jtcy( int jtcy( int n) a=n;b+=n; n) a=n;b+=n; static void display(jtcystatic void display(jtcy c) c) / /静态成员函数,对象为静态成员函数,对象为形
49、参形参 couta=c.a,b=bendl couta=c.a,b=bendl; ; ;int jtcy:bint jtcy:b=2; =2; / /静态数据成员初始化静态数据成员初始化void main( )void main( ) jtcy jtcy AA(2), BB(4); AA(2), BB(4); jtcy:display(AAjtcy:display(AA); ); / /对象作为调用函数的参数对象作为调用函数的参数 jtcy:display(BBjtcy:display(BB); ); / /对象作为调用函数的参数对象作为调用函数的参数 执行结果:执行结果:a=2,b=8 a=
50、4,b=8静态成员静态成员l(1)主要用途:定义类的各个对象所公用的数据,如主要用途:定义类的各个对象所公用的数据,如平均数、统计总数平均数、统计总数l(2) 在一个类的对象空间内,不包含静态成员的空间,在一个类的对象空间内,不包含静态成员的空间,所以静态成员所占空间所以静态成员所占空间不会不会随着对象的产生而分配,随着对象的产生而分配,或随着对象的消失而回收。或随着对象的消失而回收。l(3) 静态数据成员的存储空间的分配是在程序静态数据成员的存储空间的分配是在程序一开始一开始运行时运行时就被分配。并不是在程序运行过程中在某一函就被分配。并不是在程序运行过程中在某一函数内分配空间和初始化。数内
51、分配空间和初始化。l(4) 静态数据成员的赋值语句,既不属于任何类,也静态数据成员的赋值语句,既不属于任何类,也不属于包括主函数在内的任何函数,不属于包括主函数在内的任何函数,静态变量赋初值静态变量赋初值语句应当写在程序的全局区域中,并且必须指明其数语句应当写在程序的全局区域中,并且必须指明其数据类型与所属的类名,并用如下格式:据类型与所属的类名,并用如下格式: 类型类型 类名:变量名类名:变量名=值;值; 如:例如:例3_22中的中的:int Student:count=0; 静态成员静态成员l(5) 对于在类的对于在类的public部分说明的静态数据部分说明的静态数据成员,可以不使用成员函
52、数而直接访问,即成员,可以不使用成员函数而直接访问,即使未定义类的对象,同样也可以直接访问,使未定义类的对象,同样也可以直接访问,但在使用时也必须但在使用时也必须用类名指明所属的类用类名指明所属的类,如,如例例3.23P87;而而private和和protected部分的静部分的静态成员态成员只能通过类的成员函数访问。只能通过类的成员函数访问。静态成员函数静态成员函数与静态数据成员一样,静态成员函数与类相与静态数据成员一样,静态成员函数与类相联系,不与类的对象相联系,联系,不与类的对象相联系,不存在不存在thisthis指指针,针,所以访问静态成员函数时,不需要对象。所以访问静态成员函数时,不
53、需要对象。如:如:P89P89例例3.243.24静态成员函数的定义:静态成员函数的定义:static static 类型类型 函数名(形参)函数名(形参) 函数体函数体 本章主要内容本章主要内容l类概念和定义类概念和定义l对象的声明对象的声明l构造函数构造函数l析构函数析构函数l拷贝构造函数拷贝构造函数l对象数组和对象指针对象数组和对象指针l向函数传递对象向函数传递对象l静态成员静态成员l友元友元l类的聚集类的聚集(类对象为成员类对象为成员)友员友员 friend Private:成员public:pf();f();不可访问不可访问Private:成员public:pf();friend f
54、();f();指明友员关系可访问可访问可访问可访问可访问可访问作用:提高程序的运行效率。作用:提高程序的运行效率。友元友元l友元是友元是C+提供的一种破坏数据封装和提供的一种破坏数据封装和数据隐藏的机制。数据隐藏的机制。l通过将一个模块声明为另一个模块的友通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中元,一个模块能够引用到另一个模块中本是被隐藏的信息。本是被隐藏的信息。l可以使用友元函数和友元类。可以使用友元函数和友元类。l为了确保数据的完整性,及数据封装与为了确保数据的完整性,及数据封装与隐藏的原则,建议尽量不使用或少使用隐藏的原则,建议尽量不使用或少使用友元。友元。友
55、元函数友元函数l友元函数是在类定义中由关键字友元函数是在类定义中由关键字friend修饰说明修饰说明的的非成员函数非成员函数,在它的函数体中能够通过对象名,在它的函数体中能够通过对象名访问访问 对象的所有成员。对象的所有成员。l在类定义中使用关键字friend声明;l是非成员函数,可出现在类的私有、公有、保护部 分、在类定义之外定义;l使用类对象引用作参数,通过该引用对象名访问对象中的所有成员。l作用:增加灵活性,使程序员可以在封装和快速作用:增加灵活性,使程序员可以在封装和快速性方面做合理选择。性方面做合理选择。说明说明:l特点:可以访问该类中的可以访问该类中的所有所有成员。成员。l声明形式
56、:friend type func_name ;友员函数类型友员函数类型:普通函数友元成员: 当一个类的友元函数正好是另一个类的成员函数时.友元函数为一普通函数友元函数为一普通函数class ex int x; public: ex (int a)x=a; int getx()return x; friend long cube(ex &);long cube(ex &s) return (s.x*s.x*s.x);/友员函数友员函数ex 类类型类类型 /访问访问 ex类的私有成员类的私有成员void main() ex a(5); coutcube(a)endl; couta
57、.getx()*a.getx()*a.getx()endl;执行结果:执行结果: 125 125求两点间的距离求两点间的距离#include #include class Point public: Point(double xi, double yi) X=xi; Y=yi; double GetX() return X; double GetY() return Y; friend double Distance( Point& a, Point& b); private: double X, Y;double Distance( Point& a, Point&a
58、mp; b) double dx=a.X-b.X; double dy=a.Y-b.Y; return sqrt(dx*dx+dy*dy);int main() Point p1(3.0, 5.0), p2(4.0, 6.0); double d=Distance(p1, p2); coutThe distance is dendl; return 0;友元成员友元成员 -友元函数是其它类的成员函数友元函数是其它类的成员函数例:例:/3.27 当友员函数为其它类的成员函数时注意:当友员函数为其它类的成员函数时注意:l该友员函数不仅应当在它所在的类定义中声明,且应该友员函数不仅应当在它所在的类定义中声明,且
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度房地产销售代理合同:别墅销售代理
- 机器拉带市场发展现状调查及供需格局分析预测报告
- 2024年度常州消防工程电气设备安装合同
- 榻榻米专用座椅市场需求与消费特点分析
- 膝上桌市场发展预测和趋势分析
- 2024年度企业信息安全监测与预警合同
- 2024年度商业保理合同保理融资额度与利率
- 赛车市场发展预测和趋势分析
- 科学用棱镜市场需求与消费特点分析
- 2024年度国际餐饮文化交流活动策划合同
- 唱游子吟小儿垂钓课件小学音乐苏少01课标版三年级上册课件1
- 北京科技大学第二批非教学科研岗位招考聘用(必考题)模拟卷和答案
- 社团面试评分表
- 智慧园区 物流基地集装箱货堆场智能管理平台建设方案
- 血清转氨酶异常病因分析
- PDCA提高护理管道标识规范率
- 世界未解之谜英文版
- 中小跨径公路桥梁设计课件
- 放射培训考试习题及答案
- 译林牛津版9A-Unit8-Detective-Stories-Reading-2公开课优质课件
- 邯郸市政府采购办事指南
评论
0/150
提交评论