欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    【教学课件】第五章类和对象(一).ppt

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

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

    【教学课件】第五章类和对象(一).ppt

    第五章 类和对象(一),5.1 类的定义5.2 对象的定义5.3 对象的初始化5.4 成员函数的特性5.5 静态成员5.6 友员5.7 类的作用域5.8 局部类和嵌套类5.9 对象的生存期,5.1 类的定义,类是面向对象程序设计的核心,是一种新的数据类型,一、什么是类,二、类的定义格式,三、定义类时注意事项,用户定义的抽象数据类型,是实现数据封装的工具;,一种复杂的数据类型,是不同类型的数据以及对这些数据的相关操作的封装体。,通过类的内部数据结构和相关操作确定一类对象的行为,行为通过操作接口来描述。,创建对象的模板;,一、什么是类,二、类的定义格式,注:如果所有成员函数都在类体内定义,实现部分可省略!但 那是内联函数,1.类中成员的访问权限,公有的public:通常是一些成员函数(操作/方法),作为类的对外接口,可以被类体内外的程序访问;私有的private:通常是数据成员,描述对象的属性,用来隐藏的部分,类体外不可见,只有成员函数和友员函数可以访问;保护的protected:类内及派生类的成员函数可以访问。,访问权限修饰符private、public、protected 在类体内出现的先后次序无关,允许多次出现,缺省访问权限控制符:private,例:日期类 TDate,class TDate public:void SetDate(int y,int m,int d);int IsLeapYear();void Print();private:int year,month,day;,类名,成员函数,数据成员,例:日期类 Tdate,void TDate:Print()coutyear“-”month“-”dayendl;,int TDate:IsLeapYear()return(year%4=0,void TDate:SetDate(int y,int m,int d)year=y;month=m;day=d;,类名,成员函数,作用域运算符,2.作用域运算符,成员函数定义在类体外时,应标识成员函数所属的类,:(),void Tdate:SetDate(int y,int m,int d)year=y;month=m;day=d;,作用域运算符,若成员函数定义在类体内,则无需标识所属类;若所有成员函数都在类体内定义,则“实现部分”省略!定义在类体内的成员函数是inline函数。,class TDate public:void SetDate(int y,int m,int d)year=y;month=m;day=d;int IsLeapYear()return(year%4=0,三、定义类时应注意事项,1.类体中不允许对所定义的数据成员初始化,整形、浮点型、字符型、数组、指针、引用;另一个类的对象;自身类的指针或引用,但自身类的对象不可以!,class N;,/类N的提前说明,2.类中数据成员的类型任意,4.习惯上将类的说明部分或整个定义部分(包括实现部分)放在一个头文件中比较方便。,如:定义日期类TDate的头文件 tdate.h,3.一般在类体内先说明公有成员,后说明私有成员;比较方便。,程序中引用时:#include“tdate.h”,5.2 对象的定义,一、对象的定义格式,二、对象成员的表示方法,对象是类的具体实例定义对象前,先定义该对象所属的类,一、对象的定义格式,中可以是一般的对象名、指向对象的指针或引用名、对象数组名等,例:TDate date1,date2,*Pdate,date31;,例:TStack stack1,stack2,*Pstack,对象指针,对象引用,对象数组,二、对象成员的表示,注:引用对象的成员表示与一般对象的成员表示相同,数据成员:.成员函数:.(),例:date1.year,date1.month,date1.day例:date1.SetDate(int y,int m,int d)例:rstack.number,一般对象,成员运算符,例:Pdateyear,Pdatemonth,Pdateday例:PdateSetDate(int y,int m,int d),2.指向对象的指针,成员运算符作用对象:指针,例:Pdateyear(*Pdate).year,例5.1,#include#include“tdate.h”/文件包含命令 void main()TDate date1,date2;/定义Tdate类的两个对象date1.SetDate(1996,5,4);/通过成员函数为对象赋值date2.SetDate(1998,4,9);int leap=date1.IsLeapYear();coutleapendl;date1.Print();date2.Print();/调用成员函数显示数据成员值,1,1996-5-4,1998-4-9,例5.2,头文件tpoint.h,class TPoint public:void SetPoint(int x,int y);int Xcoord()return X;/成员函数定义在类体内 int Ycoord()return Y;void Move(int xOffset,int yOffset);private:int X,Y;void TPoint:SetPoint(int x,int y)/成员函数定义在类体外 X=x;Y=y;void TPoint:Move(int xOffset,int yOffset)X+=xOffset;Y+=yOffset;,例5.2,#include#includetpoint.h void main()TPoint p1,p2;p1.SetPoint(3,5);p2.SetPoint(8,10);p1.Move(2,1);p2.Move(1,-2);coutx1=p1.Xcoord(),y1=p1.Ycoord()endl;coutx2=p2.Xcoord(),y2=p2.Ycoord()endl;,x1=5,y1=6,x2=9,y2=8,class TPoint public:int Xcoord()return X;int Ycoord()return Y;,例5.2,#include#includetpoint.hvoid main()TPoint p1,p2;p1.SetPoint(3,5);p2.SetPoint(8,10);p1.Move(2,1);p2.Move(1,-2);coutx1=p1.X,y1=p1.Ycoord()endl;coutx2=p2.X,y2=p2.Ycoord()endl;,Error:can not access private member!,class TPoint public:private:int X,Y;,5.3 对象的初始化,一、构造函数和析构函数,二、缺省构造函数和缺省析构函数,三、拷贝初始化构造函数,定义一个对象时,系统通过调用构造函数对该对象进行初始化,一、构造函数和析构函数,在类体中说明的两种特殊的成员函数;函数体可以写在类体内或类体外;,class TDate1 public:TDate1(int y,int m,int d);/构造函数说明 TDate1();/析构函数说明 void Print();private:int year,month,day;TDate1:TDate1(int y,int m,int d)/构造函数定义 year=y;month=m;day=d;coutConstructor called.n;/无法声明不初始化的对象,否则必须有不初始化的构造函数TDate1:TDate1()/析构函数定义 cout Destructor called.n;void TDate1:Print()coutyear-month-dayendl;,例:,头文件tdate1.h,析构函数的自动调用:函数体内定义的对象,当函数结束时,自动调用析构函数;new动态创建的对象,用delete释放时,自动调用析构函数。,#include#includetdate1.hvoid main()TDate1 today(1998,4,6),tomorrow(1998,4,7);couttoday is;today.Print();couttomorrow is;tomorrow.Print();,TDate1:TDate1(int y,int m,int d)year=y;month=m;day=d;coutConstructor called.n;TDate1:TDate1()coutDestructor called.n;,例5.3,思考:析构函数调用的顺序?,TDate1:TDate1()/析构函数 coutyear“-month“-day“Destructor.n;,1998-4-6 Constructor.,1998-4-7 Constructor.,1998-4-7 Destructor.,1998-4-6 Destructor.,TDate1:TDate1(int y,int m,int d)/构造函数 year=y;month=m;day=d;coutyear-month-dayConstructor.n;,例5.3 修改,析构函数的调用顺序与构造函数的调用顺序相反!,二、缺省构造函数和缺省析构函数,1.缺省构造函数,1)未定义任何构造函数时,编译器自动生成;,2)用户可自定义缺省构造函数;,2.缺省析构函数,:(),1)未定义析构函数时,由编译器自动生成;,2)空函数。,二、缺省构造函数和缺省析构函数,无参数,三、拷贝初始化构造函数,是一种构造函数,不指定返回值类型;只有一个参数,是对某个对象的引用;每个类必有;若无,编译器自动生成。,2.特点:,用一个已知对象来初始化一个被创建的同类对象,(拷贝已知对象的数据成员的值),1.功能:,:(&),例5.4,class TPoint public:TPoint(int x,int y)X=x;Y=y;/构造函数TPoint(TPoint,头文件tpoint1.h,TPoint:TPoint(TPoint,用已知对象初始化被创建的同类对象,#include#includetpoint1.hvoid main()TPoint P1(5,7);TPoint P2(P1);coutP2=P2.Xcoord(),P2.Ycoord()endl;,TPoint:TPoint(TPoint,Copy_ initialization Constructor.P2=5,7 Destructor Called.Destructor Called.,例5.4,是一种构造函数,不指定返回值类型;只有一个参数,是对某个对象的引用;每个类必有;若无,编译器自动生成。无法在新对象内改变被拷贝的原对象属性(见前例),2.特点:,用一个已知对象来初始化一个被创建的同类对象,(拷贝已知对象的数据成员的值),1.功能:,:(const&),三、拷贝初始化构造函数,所引用的对象不可更新,#include#includetpoint1.h“void main()TPoint P1(5,7);TPoint P2(P1);coutP2=P2.Xcoord(),P2.Ycoord()endl;,TPoint:TPoint(const TPoint,例5.4,所引用的对象不可更新,明确表示由一个对象初始化另一对象时:如:TPoint P2(P1);对象作函数实参传递给函数形参时:如:P=fun(N);用实参N初始化被调用函数的形参对象作函数返回值时:如:return R;系统用对象R初始化一个匿名对象,拷贝初始化函数使用场合,例5.5,#include#include tpoint1.hTPoint f(TPoint Q)coutokn;int x,y;x=Q.Xcoord()+10;y=Q.Ycoord()+20;TPoint R(x,y);return R;void main()TPoint M(20,35),P(0,0);TPoint N(M);/由一个对象初始化另一对象P=f(N);/对象作函数实参传递给形参coutP=P.Xcoord(),P.Ycoord()endl;,Copy_initialization Constructor.,Copy_initialization Constructor.,ok,Copy_initialization Constructor.,Destructor Called.,Destructor Called.,Destructor Called.,P=30,55,Destructor Called.,Destructor Called.,Destructor Called.,11.拷贝初始化构造函数共使用了三次:Tpoint N(M);时、调用函数f(),实参N给形参对象Q初始化时、执行f()中的返回语句return R;系统用返回值初始化一个匿名对象2.析构函数调用三次:退出f()时,释放该函数中定义的对象Q,R,调用两次。返回main()时,用赋值运算将匿名对象赋值给对象P,然后释放匿名对象时调用。最后退出整个程序,又调用三次析构函数,分别释放main()中定义的对象M,P和N。,5.4 成员函数的特性,一、内联函数和外联函数,二、重载性,三、设置参数的缺省值,一、内联函数和外联函数,1.内联函数,注:在函数头前加“inline”,使外联函数变内联函数。,例5.6,class A public:A(int x,int y)X=x;Y=y;int a()return X;int b()return Y;int c();int d();private:int X,Y;inline int A:c()return a()+b();inline int A:d()return c();,二、重载性,一个函数名对应多个函数的实现一般成员函数可以,构造函数可以,析构函数不可重载!,例5.7,#includevoid main()M a(10,20),b(4);couta=a.Xout(),a.Yout()endl;coutb=b.Xout(),b.Yout()endl;int i=a.Add();/i=10+20int j=a.Add(3,9);/j=3+9int k=b.Add(5);/k=5+5coutiendljendlkendl;,a=10,20,b=4,16,30,12,10,M(int x,int y)X=x;Y=y;M(int x)X=x;Y=x*x;,三、设置参数的缺省值,class N public:N(int a=3,int b=5,int c=7);/构造函数缺省值 int Aout()return A;int Bout()return B;int Cout()return C;private:int A,B,C;N:N(int a,int b,int c)A=a;B=b;C=c;,一般成员函数和构造函数都可以设置参数缺省值,例5.8,例5.8,#includevoid main()N X,Y(9,11),Z(13,15,17);coutX=X.Aout(),X.Bout(),X.Cout();coutendl;coutY=Y.Aout(),Y.Bout(),Y.Cout();coutendl;coutZ=Z.Aout(),Z.Bout(),Z.Cout();coutendl;,class N public:N(int a=3,int b=5,int c=7);;,X=3,5,7,Y=9,11,7,Z=13,15,17,5.5 静态成员,一、静态数据成员,二、静态成员函数,数据共享问题:,#includeint g=5;/全局变量void f1(),f2();void main()g=10;f1();f2();coutgendl;void f1()g=15;void f2()g=20;,例5.9,20,全局量:可见范围无法控制,在整个程序内都可见,不仅仅限定在同一个类的对象内(不安全),一、静态数据成员,2.特点:只存储一次,节省内存,供类的所有对象共享;,1.作用:实现多个对象间的数据共享,不破坏隐藏原则,保证安全性(值属于整个类,不仅仅是某个对象的);,静态数据成员的值对每个对象都是一样的;任何一个对象都可以改变静态数据成员的值;只要静态数据成员的值更新一次,则所有对象存取更新后相同的值!,使用方法、注意事项:定义时,加“static”;初始化,:=;,不在类体内,不在构造函数内,例5.10,#include class Myclass public:Myclass(int a,int b,int c);void GetNumber();void GetSum();private:int A,B,C;Static int sum;/定义;,void Myclass:GetNumber()coutNumber=;coutA,B,Cendl;void Myclass:GetSum()coutSum=sumendl;,Myclass:Myclass(int a,int b,int c)A=a;B=b;C=c;sum+=A+B+C;,void main()Myclass M(3,7,10),N(14,9,11);M.GetNumber();N.GetNumber();M.GetSum();N.GetSum();,Number=3,7,10,Number=14,9,11,Sum=54,Sum=54,int Myclass:sum=0;/初始化,二、静态成员函数,1.调用格式,用途一般用于直接操作静态数据成员,属于类的静态成员,不是对象的成员,:(),可以直接引用类中的静态数据成员;不能直接引用类中定义的非静态成员(通过“对象”来引用非静态成员)静态数据成员可以通过对象来引用,例5.11,#include class M public:M(int a)A=a;B+=a;Static void f1(M m);private:int A;static int B;,void main()M P(5),Q(10);M:f1(P);/不用对象 M:f1(Q);/直接引用 P.f1(P);/可以吗?对,A=5,B=15,A=10,B=15,int M:B=0;/初始化,void M:f1(M m)cout“A=”m.Aendl;/非静态成员 cout“B=”Bendl;/静态成员/cout“B=”m.Bendl;/也可以,5.6 友元,定义在类体外的普通函数;,在类体内用“friend”说明;,非成员函数,但可以访问类中的私有成员;,提高程序的运行效率,但破坏了类的封装性和隐藏性。,一、友元函数,#include#include class Point public:Point(double xx,double yy)x=xx;y=yy;void Getxy();friend double Distance(Point,能够访问类中私有成员的非成员函数(普通函数),例5.12,私有数据成员,例5.12,void main()Point p1(3.0,4.0),p2(6.0,8.0);p1.Getxy();p2.Getxy();/成员函数调用 double d=Distance(p1,p2);/友元函数调用 coutDistance is dendl;,(3.0,4.0),(6.0,8.0),Distance is 5,void Point:Getxy()cout(x,y)endl;,double Distance(Point,友元函数,类外的普通函数,访问类中私有数据成员,成员函数,例5.13#include,class Time public:Time(int new_hours,int new_minutes)hours=new_hours;minutes=new_minutes;friend void Time24(Time time);friend void Time12(Time time);private:int hours,minutes;,私有成员,例5.13,void main()Time Time1(20,30),Time2(10,45);Time12(Time1);Time24(Time1);Time12(Time2);Time24(Time2);,8:30 PM,20:30,10:45 AM,10:45,void Time12(Time time)if(time.hours12)time.hours-=12;couttime.hours:time.minutes PMendl;else couttime.hours:time.minutes AMendl;,友元函数,例5.13修改,class Time public:Time(int new_hours,int new_minutes)hours=new_hours;minutes=new_minutes;friend void Time24(Time,友元函数的形参变“引用”,例5.13修改,void Time12(Time,友元函数,void main()Time Time1(20,30),Time2(10,45);Time12(Time1);Time24(Time1);/此时的Time1是被 Time12(Time2);/Time12()改过的了 Time24(Time2);,8:30 PM,8:30,10:45 AM,10:45,二、友元类,#include class X friend class Y;public:void Set(int i)x=i;void Display()coutx=x,;couty=yendl;private:int x;static int y;,一个类作为另一个类的友员友员类的所有成员函数都是另一个类的友员函数,例5.14,私有成员,说明友元类Y,例5.14,x=5,y=1,x=6,y=9,x=5,y=9,void Y:Display()coutx=a.x,;couty=X:y endl;,class Y public:Y(int i,int j);void Display();private:X a;,int X:y=1;/初始化,Y:Y(int i,int j)a.x=i;X:y=j;,友元类,访问X类中私有成员x、y,5.7 类的作用域,简称“类域”,指类的作用范围,即类定义和相应的成员函数定义范围;,类域一般介于文件域和函数域之间;,类域中定义的变量和函数可用static修饰;,void A:Move(int dx,int dy)/成员函数定义 X+=dx;Y+=dy;,类域中,该类的成员函数对该类的数据成员具有无限制的访问权,class A public:A(int x,int y)X=x;Y=y;int Xcoord()return X;int Ycoord()return Y;void Move(int dx,int dy);/成员函数说明 private:int X,Y;,标识符“可见性”与声明次序无关,5.8 局部类和嵌套类,一、局部类 定义在函数体内的类;局部类的类名隐藏在函数体内,该类的所有 成员函数都定义在类体内;,二、嵌套类 定义在类体内的类;/这在C中是不可想象的 定义嵌套类的类称外围类(主从关系);注:局部类和嵌套类较少使用。,5.9 对象的生存期,生存期:从被创建开始到被释放为止的时间,程序开始时,创建;程序结束时,释放;作用域:整个程序。,局部对象,对象被定义时,调用构造函数,创建;退出定义该对象的函数体或程序块时,调用析构函数,释放;作用域:定义该对象的函数体或程序块内;,静态对象,程序第一次执行定义的静态对象时,创建;程序结束时,释放;作用域:从定义起到文件结束止;,全局对象,例5.15,#include#includeclass A public:A(char*st);A();private:char string50;,A:A(char*st)strcpy(string,st);coutConstructor forstringendl;,A:A()coutDestructor forstringendl;,例5.15,void main()A MainObject(MainObject);coutIn Main(),before calling funn;fun();coutIn Main(),after calling funn;,Constructor for GlobalObject,Constructor for MainObject,In Main(),before calling fun,Constructor for FunObject,Constructor for StaticObject,In fun().,Destructor for FunObject,In Main(),after calling fun,Destructor for MainObject,Destructor for StaticObject,Destructor for GlobalObject,void fun()A FunObject(FunObject);static A staticObject(StaticObject);coutIn fun().endl;,A GlobalObject(GlobalObject);,作 业 题,三(1),#include class A public:A();A(int i,int j);void print();private:int a,b;A:A()a=b=0;coutDefault constructor.n;A:A(int i,int j)a=i;b=j;coutConstructor calledn;,void A:print()couta=a,b=bendl;void main()A m,n(4,8);m.print();n.print();,Default constructor.,Constructor called.,a=0,b=0,a=4,b=8,三(2),#include class B public:B()B(int i,int j);void printb();private:int a,b;class A public:A();A(int i,int j);void printa();private:B c;/子对象;,void main()A m(7,9);m.printa();,a=7,b=9,A:A(int i,int j):c(i,j)/成员初始化表 void A:printa()c.printb();,B:B(int i,int j)a=i;b=j;void B:printb()couta=a,b=bendl;,三(3)静态成员,#include class Count public:Count()count+;static int HM()return count;Count()count-;private:static int count;,void main()Count c1,c2,c3,c4;coutCount:HM()endl;,104,int Count:count=100;,三(4)友元函数,1035,789.504,#include class Apublic:A(double t,double r)Total=t;Rate=r;friend double Count(A,void main()A a1(1000.0,0.035),a2(768.0,0.028);coutCount(a1),Count(a2)endl;,三(4)友元函数,1035,789.504,Test Test:fun()Test tp;return tp;,void main()Test a;a=a.fun();,#include class Test public:Test()coutConstructing.n;Test(const Test,阅读下面程序,如果程序中有错误,说明错误原因并改正;如果没有错误,请写出程序运行结果。,实 验 二,调试例5.5,做如下修改并分析其语法现象:将函数 f()的形参改为:TPoint&Q写一个圆柱体类,计算并输出其体积和表面积;设计用静态成员实现学生班费管理的程序:用静态数据成员money存放班费;用函数getmoney()实现学生缴纳班费;用函数spendmoney()实现班费支出;用静态成员函数display()显示余额。,实 验 二,已知学生类Student,包括学号、姓名、三门课的成绩。设计一个友元函数,输出按平均成绩对应的等级:大于等于90为优8089为良7079为中6069为及格小于60为不及格,

    注意事项

    本文(【教学课件】第五章类和对象(一).ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开