《c++讲义:第五章类和对象.ppt》由会员分享,可在线阅读,更多相关《c++讲义:第五章类和对象.ppt(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第五章第五章 类和对象类和对象湖南商学院 信息系 曹伟本章内容:本章内容:类和对象的定义类和对象的定义 成员函数的特性成员函数的特性 静态函数静态函数 有元函数有元函数 类的作用域类的作用域 局部类和嵌套类局部类和嵌套类 对象的生存周期对象的生存周期5.1类的定义类的定义一一.类的概念类的概念 类是一种复杂的数据类型,它是将不同类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的运算封装类型的数据和与这些数据相关的运算封装在一起的集合体。类的结构是用来确定一在一起的集合体。类的结构是用来确定一类对象的行为,他们是通过类的内部数据类对象的行为,他们是通过类的内部数据结构和相关的运算来确
2、定的。这些行为是结构和相关的运算来确定的。这些行为是通过一种运算接口来描述的,使用者关心通过一种运算接口来描述的,使用者关心的是接口的功能。的是接口的功能。二二.类的定义格式类的定义格式 1.组成:组成:说明部分和实现部分。说明部分和实现部分。2.定义格式:定义格式:class public :private:;3.举例:举例:1)所有成员函数都是在类中实现。所有成员函数都是在类中实现。class A private:int i;protected:int j;public:int k;int Geti()return i;int Getj()return j;int Getk()return
3、 k;2)成员函数在类体外定义成员函数在类体外定义 int A:Geti()return i;int A:Getj()return j;int A:Getk()return k;三三.定义时应注意定义时应注意:1.在类体中不允许对所定义的数据成员进行初始化。在类体中不允许对所定义的数据成员进行初始化。2.类中数据成员的类型可以是任意的。也可包含对象。同时另类中数据成员的类型可以是任意的。也可包含对象。同时另一个对象可以作为该类的成员。但自身类的对象是不可以的,一个对象可以作为该类的成员。但自身类的对象是不可以的,而自身类的指针或引用则是可以的。而自身类的指针或引用则是可以的。5.2 对象的定义
4、对象的定义一一.对象的格式定义(对象的格式定义(在类说明之后在类说明之后)1.格式:格式:类名类名 对象表列;对象表列;2.举例:举例:A a1,a2,*p,*q;二二.对象成员的表示方法对象成员的表示方法 1.格式:格式:对象名对象名.成员名成员名 对象名对象名.成员函数名(参数表列)成员函数名(参数表列)对象指针名对象指针名-成员名成员名 或或 (*对象指针名)对象指针名).成员名成员名 2.举例:举例:a1.i a2.k p-i (*p).i a1.Geti()q-Getk()(*q).Getk()/score.h class Tscore private:float average;p
5、ublic:void Newscore(floar avg)average=avg;void Printscore()cout“AVE=”averageendl;/score.cpp#include#include“score.h”void main()Tscore s1,s2;s1.Newscore(75);s2.Newscore(82);cout“student1:”;s1.Printscore();cout“student2:”;s2.Printscore();5.3对象的初始化对象的初始化一一.构造函数和析构函数构造函数和析构函数 构造函数的功能是在创建对象时,使用给定的值构造函数的功
6、能是在创建对象时,使用给定的值来将对象初始化。析构函数的功能是用来释放一个来将对象初始化。析构函数的功能是用来释放一个对象的,在对象删除前,用它来做一些清理工作,对象的,在对象删除前,用它来做一些清理工作,它与构造函数的功能正好相反。它与构造函数的功能正好相反。构造函数和析构函数都没有返回值,并且定义构造函数和析构函数都没有返回值,并且定义它们时不需要显示写没有返回值。构造函数可以带它们时不需要显示写没有返回值。构造函数可以带参数,可以重载;而析构函数不能有参数,也不能参数,可以重载;而析构函数不能有参数,也不能重载。重载。例:例:class COUNT int num;public:COUN
7、T();COUNT();void process();COUNT :COUNT()num=0;COUNT COUNT()cout“字符的个数:字符的个数:”numendl;Void COUNT:process()while(getche()!=r)num+;coutendl;Void main()COUNT c;c.process();二二.带参数的构造函数带参数的构造函数 例:例:Point:Piont(int a,int b)x=a;y=b;三三.拷贝初始化构造函数拷贝初始化构造函数 功能:是用一个已知的对象来初始化一个被创功能:是用一个已知的对象来初始化一个被创建的同类的对象。它实质上也
8、是构造函数,在初始建的同类的对象。它实质上也是构造函数,在初始化时被调用来将一个已知对象的数据成员的值拷贝化时被调用来将一个已知对象的数据成员的值拷贝给正在创建的另一个同类的对象。给正在创建的另一个同类的对象。例:例:class TAdd private:int x,y;public:Tadd(int a,int b)x=a;y=b;cout“fun1:”endl;TAdd(TAdd&p)x=p.x;y=p.y;cout“fun2:”endl;Tadd()cout“调用析构函数调用析构函数:”endl;Int add()return x+y;Void main()TAdd p1(2,3);TA
9、dd p2(p1);Coutp2.add()endl;5.4成员函数的特性成员函数的特性一一.内联函数和外联函数内联函数和外联函数 内联函数是指那些定义在类体内的成员函数内联函数是指那些定义在类体内的成员函数,即即该函数的函数体在放在类体内。该函数的函数体在放在类体内。外联函数是说明在类体内,定义在类体外的成外联函数是说明在类体内,定义在类体外的成员函数叫外联函数。外联函数的函数体在类的实现员函数叫外联函数。外联函数的函数体在类的实现部分。外联函数要转化成内联函数只需要在函数头部分。外联函数要转化成内联函数只需要在函数头加上加上inline.inline.例:例:class TA privat
10、e:int i;public :int add(int a,int b)return a+b;int geti();int TA:geti()return i;二二.重载函数重载函数#include class TAddpublic:int add(int a,int b)return a+b;double add(double x,double y)return x+y;void main()TAdd c;cout“s1=”c.add(2,3)endl;cout“s2=”c.add(2.5,3.3)endl;三三.设置函数的默认值设置函数的默认值#include Class Tcprivat
11、e:int A,B;public:Tc(int a=1,int b=2);int acount()return A;int bcount()return B;Tc:Tc(int a,int b)A=a;B=b;void main()Tc c1,c2(5),c3(10,20);coutc1.acountc1.bcountendl;coutc2.acountc2.bcountendl;coutc3.acountc2.bcountendl;5.5静态成员静态成员 静态成员的提出是为了解决数据共享的问题。静态成员的提出是为了解决数据共享的问题。在类中,静态成员分为静态成员和静态成员函数。在类中,静态成
12、员分为静态成员和静态成员函数。一一.静态数据成员静态数据成员 静态数据成员是类的所有对象共享的成员,静态数据成员是类的所有对象共享的成员,而不是某个对象的成员,它可以供所有对象公用。而不是某个对象的成员,它可以供所有对象公用。1.定义:定义:static 数据类型数据类型 静态数据成员;静态数据成员;2.成员初始化:成员初始化:数据类型数据类型 类名:静态数据成员名类名:静态数据成员名=值;值;注意:注意:静态数据成员必须进行初始化。静态数据成员必须进行初始化。3.静态数据成员的引用静态数据成员的引用 类名:静态数据成员名类名:静态数据成员名#include Class Tc private:
13、int I;static int k;public:Tc()I=0;I+;k+;void print()coutI“”kendl;int Tc:k=0;void main()Tc A,B;A.print();B.print();执行该程序的结果为:执行该程序的结果为:1 2 1 2二二.静态成员函数静态成员函数 和静态数据成员一样,它们都属于类的和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。故引用时静态成员,它们都不是对象成员。故引用时不需用对象名。不需用对象名。例:例:#include class Tc private:int A;static int B;public:T
14、c(int a)A=a;B+=a;Static void print(Tc C)cout“A=”C.A“B=”Bendl;int Tc:B=2;void main()Tc M(2),N(4);Tc:print(M);Tc:print(N);执行后的结果为:执行后的结果为:A=2B=8 A=4B=8 5.6 友元函数友元函数 友元可以是一个函数,也可以是一个类。有元友元可以是一个函数,也可以是一个类。有元的作用在于提高程序的运行效率,但是它破坏了类的作用在于提高程序的运行效率,但是它破坏了类的封装和隐藏性。的封装和隐藏性。一一.有元函数有元函数 友元函数的特点是能够访问类中的私有成员的友元函数的
15、特点是能够访问类中的私有成员的非成员函数。从语法上看,在定义和调用上与普通非成员函数。从语法上看,在定义和调用上与普通函数一样函数一样。例:例:#include#include class Tpiont private :double x,y;public :Tpoint(double a,double b)x=a;y=b;friend double distance(Tpiont&a,Tpiont&b)return sqrt(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);void main()Tpiont p1(2,2),p2(5,5);cout“distan
16、ce=”distance(p1,p2)endl;执行结果:执行结果:distance=4.24264二二.有元类有元类 当一个类作为另一个类的有元时,就意味着这个类当一个类作为另一个类的有元时,就意味着这个类的所有成员函数都是另一个类的有元函数。的所有成员函数都是另一个类的有元函数。#include#include class A private:int x;public:A()x=5;friend class B;clss B public:void print1(A m)m.x+;coutm.xendl;void print2(A m)m.x-;coutm.xendl;void main(
17、)A obj1;B obj2;obj2.print1(obj1);obj2.print2(obj1);执行结果:6 45.7局部类和嵌套类局部类和嵌套类一一.局部类局部类 在一个函数体内定义的类。在一个函数体内定义的类。例如:例如:int a;void fun()static int s;class A public:void Geti(int i)s=i;A m;m.Geti(8);在定义局部类时需要注意:局部类中不能说明静态成员函在定义局部类时需要注意:局部类中不能说明静态成员函数,并且所有成员函数都必须定义在类体内。数,并且所有成员函数都必须定义在类体内。二二.嵌套类嵌套类 在类中嵌套的
18、类称为嵌套类,定义嵌套类的类称为外围类。在类中嵌套的类称为嵌套类,定义嵌套类的类称为外围类。例如:例如:class A public:class B public:.private:.;void f();private:int a;类类B是一个嵌套类,类是一个嵌套类,类A是外围类,类是外围类,类B定义在类定义在类A的类体内。的类体内。例如:例如:#include class student int no;char name10;class cdegree public:int chinese;int english;int phy;degree;public:void getdata()cou
19、tno;.cindegree.chinese;cindegree.english;void print()cout“学号:学号:”noendl;.coutdegree.chineseendl;void main()student st;st.getdata();st.print();5.9对象的生存周期对象的生存周期 对象的生存期是指对象从被创建开始到被释放为止的时间。对象的生存期是指对象从被创建开始到被释放为止的时间。按生存期的不同对象可分为如下三种:按生存期的不同对象可分为如下三种:1.局部对象:在程序体局部对象:在程序体 程序块中程序块中 2.静态对象:在一个文件中静态对象:在一个文件中 3.全局对象:整个文件的所有程序中全局对象:整个文件的所有程序中例如:例如:class A public:A(char *st);A();.;void fun()static A getdata();/静态成员静态成员 A object();全局对象全局对象 void main()a bin();局部对象局部对象 .
限制150内