怎样使用类和对象ppt课件.ppt

上传人:小飞机 文档编号:1937083 上传时间:2022-12-27 格式:PPT 页数:81 大小:1.92MB
返回 下载 相关 举报
怎样使用类和对象ppt课件.ppt_第1页
第1页 / 共81页
怎样使用类和对象ppt课件.ppt_第2页
第2页 / 共81页
怎样使用类和对象ppt课件.ppt_第3页
第3页 / 共81页
怎样使用类和对象ppt课件.ppt_第4页
第4页 / 共81页
怎样使用类和对象ppt课件.ppt_第5页
第5页 / 共81页
点击查看更多>>
资源描述

《怎样使用类和对象ppt课件.ppt》由会员分享,可在线阅读,更多相关《怎样使用类和对象ppt课件.ppt(81页珍藏版)》请在三一办公上搜索。

1、第3章 怎样使用类和对象,授课内容,3.1 利用构造函数对对象进行初始化3.2 利用析构函数进行清理工作3.3 调用构造函数和析构函数的顺序3.4 对象数组3.5 对象指针3.6 公用数据的保护3.7 对象的动态创建和释放3.8 对象的赋值和复制2.9 静态成员3.10 友元3.11 类模板,3.1 利用构造函数对对象进行初始化,3.1 利用构造函数对对象进行初始化,作用构造函数:当一个对象被定义时会自动调用,用来对对象进行初始化。,class Point int m_nX; int m_nY;public: Point( int x, int y ) m_nX = x; m_nY = y;

2、cout con endl; void SetXY( int a, int b ) m_nX = a; m_nY = b; void PrintXY() cout m_nX , m_nY; ;,p1,m_nY:,m_nX:,int main() Point p1( 10, 20 ); Point p2( 13, 15 ); p1.SetXY( 20,10 ); p2.PrintXY(); return 0; ,10,20,p2,m_nY:,m_nX:,13,15,20,10,3.1 利用构造函数对对象进行初始化,声明格式:();程序中不能直接调用构造函数,在定义对象时,系统会自动调用构造函数,

3、3.1 利用构造函数对对象进行初始化,构造函数与类同名没有返回值,原型中也没有void。,3.1 利用构造函数对对象进行初始化,构造函数可以重载。class Pointprivate:int m_nX;int m_nY;public:Point(int a, int b) m_nX = a; m_nX = b; void SetXY( int a, int b ) m_nX = a; m_nY = b; void PrintXY() cout m_nX , m_nY; Point();,Point() m_nX = 0; m_nX = 0; ,Point p1;,Point p2( 10, 2

4、0 );,Point p4( 20 );,Point p3();,在创建对象时,必须有可匹配的构造函数被调用,如果无匹配的构造函数,则报错。,3.1 利用构造函数对对象进行初始化,构造函数可以带有默认参数。class Pointprivate:int m_nX;int m_nY;public:Point() m_nX = 0; m_nX = 0; Point(int a, int b) m_nX = a; m_nX = b; void SetXY( int a, int b ) m_nX = a;m_nY = b;void PrintXY()cout m_nX , m_nY;Point();,

5、Point( int a = 0, int b = 0 ) m_nX = a; m_nX = b; ,Point p1;,Point p2( 10, 20 );,Point p3( 20 );,3.1 利用构造函数对对象进行初始化,构造函数是成员函数,函数体可写在类体内也可以写在类体外。class Pointprivate:int m_nX;int m_nY;public:Point(int a = 0, int b = 0);void SetXY( int a, int b );void PrintXY();Point();,/point.cpp的内容Point:Point(int a =

6、0, int b = 0) m_nX = a; m_nY = b; void Point:SetXY(int a , int b ) m_nX = a; m_nY = b;void Point:PrintXY() cout m_nX,m_nY; ,( int a, int b ),/point.h的内容,3.1 利用构造函数对对象进行初始化,class Pointprivate:int m_nX;int m_nY;public:void SetXY( int a, int b ) m_nX = a;m_nY = b;void PrintXY()cout m_nX , m_nY;Point();

7、,/系统为我们自动产生的构造函数,我们看不见它,int main()Point p;p.PrintXY();return 0;,Point(),3.1 利用构造函数对对象进行初始化,class Pointprivate:int m_nX;int m_nY;public:Point(int a, int b ) m_nX = a; m_nX = b; void SetXY( int a, int b ) m_nX = a;m_nY = b;void PrintXY()cout m_nX , m_nY;Point();,int main()Point p;p.PrintXY();return 0;

8、,3.1 利用构造函数对对象进行初始化,如果一个类你没有定义构造函数,那么系统会为你定义一个构造函数,该构造函数的参数表和函数体为空;如果你定义了一个构造函数,则系统不会为你定义任何构造函数。,数据成员的初始化,在构造函数的函数体中初始化class Pointprivate:int m_nX; int m_nY;public:Point(int a = 0, int b = 0) m_nX = a; m_nY = b; void PrintXY()cout m_nX , m_nY;,p1,m_nY:,m_nX:,10,20,int main()Point p1( 10, 20 ); p1.Pr

9、intXY();return 0;,数据成员的初始化,在构造函数头部初始化格式:类名:构造函数(参数表) : m1(v1), m2(v2), 函数体 ,初始化列表,class Pointprivate:int m_nX;int m_nY;public:Point( int a = 0, int b = 0) m_nX = a; m_nY = b; void SetXY( int a, int b ) m_nX = a;m_nY = b;void PrintXY() cout m_nX , m_nY; ;,Point( int a = 0, int b = 0) : m_nX( a ), m_n

10、Y(b) ,数据成员的初始化,class Person private:char m_strName20;int m_nAge;bool m_nSex;public:Person() : m_strName(XXX), m_nAge( 0), m_nSex(0);,Person() : m_nAge( 0), m_nSex(0) strcpy(m_strName, XXX);,规则:能在初始化列表中初始化的成员,尽量在初始化列表中初始化。,3.2 利用析构函数进行清理工作,3.2 利用析构函数进行清理工作,作用:将要释放某个对象所占据的存储空间之前,该对象的析构函数会被自动调用,来进行一些清理

11、工作。声明格式:类名();,class Point int m_nX; int m_nY;public: Point( int x, int y ) m_nX = x; m_nY = y; cout con endl; void SetXY( int a, int b ) m_nX = a; m_nY = b; void PrintXY() cout m_nX , m_nY; Point() cout destroy endl; ;,p1,m_nY:,m_nX:,int main() Point p1( 10, 20 ); Point p2( 13, 15 ); p1.SetXY( 20,10

12、 ); p2.PrintXY(); return 0; ,10,20,p2,m_nY:,m_nX:,13,15,20,10,concon13,15destroydestroy,3.2 利用析构函数进行清理工作,class Arrayprivate:int *m_pArray;int m_nSize;public:Array( int n )m_nSize = n;m_pArray = new intn; Array();,int main()Array a(4);return 0;,0X1000,a,m_nSize:,m_pArray:,0X1000,4,3.2 利用析构函数进行清理工作,cl

13、ass Arrayprivate:int *m_pArray;int m_nSize;public:Array( int n )m_nSize = n;m_pArray = new intn; ;,int main()Array a(4);return 0;,Array() delete m_pArray; ,0X1000,a,m_nSize:,m_pArray:,0X1000,4,3.2 利用析构函数进行清理工作,析构函数与类同名,只是在前面添加了符号。析构函数没有返回值,原型中也没有void。析构函数没有参数,一个类只能有一个析构函数,析构函数不能被重载析构函数的函数体可写在类体内,也可写

14、在类体外。将要释放某个对象所占据的存储空间之前,系统自动调用析构函数。析构函数也可以被程序显示调用。,析构函数,class Pointprivate:int m_nX;int m_nY;public:Point( int a = 0, int b = 0) m_nX = a; m_nY = b; void SetXY( int a, int b ) m_nX = a;m_nY = b;void PrintXY() cout m_nX , m_nY; ;对于一个类,如果没有显示定义析构函数,编译器自动产生一个函数体为空的析构函数。,3.2 利用析构函数进行清理工作,对于一个类,如果没有显示定义构

15、造函数,编译器自动为该类产生一个构造函数。对于一个类,如果没有显示定义析构函数,编译器自动产生为该类一个析构函数。一个设计合理的类,一般至少要显示定义一个构造函数。至于是否要显示定义析构函数,可根据需要确定,如果该类的对象占据的存储空间释放时不必要做什么清理工作,可以不必定义析构函数。,3.8 对象的赋值与复制,拷贝构造函数,在创建对象时,必须有一个匹配的构造函数被调用,如果无匹配的构造函数,则报错。class Pointprivate:int m_nX; int m_nY;Point p2; Point p1( 10, 30 );,int a = 5;int b( a );Point p3(

16、 p1 );,public: Point(int a=0, int b=0 ) : m_nX(a), m_nY(b),class Pointprivate:int m_nX; int m_nY;public:Point( int a=0, int b=0 ) : m_nX(a), m_nY(b)Point( const Point ,Point( const Point &p ):m_nX(p.m_nX),m_nY(p.m_nX) ,拷贝构造函数,拷贝构造函数拷贝构造函数是一种特殊的构造函数,其形参是本类对象的常引用。它的作用是用一个已经存在的对象初始化一个新的同类对象。,拷贝构造函数,格式:

17、 :(const &)特点:是一种构造函数。参数为本类对象的常引用。,类名,拷贝构造函数,拷贝构造函数的调用:明确表示由另一个对象对要创建的对象进行初始化时。Point p2(p1); Point p3 = p1;Point p4; p4 = p1;,/调用构造函数,/不调用构造函数,拷贝构造函数,class Pointprivate:int m_nX; int m_nY;public:Point(int a = 0, int b = 0)m_nX = a; m_nY = b;void Show() cout m_nX m_nY; ;,int main() Point p1( 10, 30 )

18、; Point p2( p1 ); p2.Show(); return 0;,拷贝构造函数,每个类都必须有一个拷贝构造函数,如果没有显式定义拷贝构造函数,则编译系统自动生成一个拷贝构造函数,作为公有成员。系统自动生成的拷贝构造函数的函数体不为空,拷贝的策略是逐个成员依次拷贝。所以对一些简单的类我们没有必要写拷贝构造函数,系统自动生成的拷贝构造函数就可以以达到我们的目的。(前面的Point类),class Arrayprivate:int *m_pArray;int m_nSize;public:Array( int n ) : m_nSize( n ) m_pArray = new intn;

19、for( int i = 0; i n; +i ) m_pArrayi = i; Array() delete m_pArray; ;,int main()Array p1(4);Array p2(p1);return 0;,0X1000,p1,m_nSize:,m_pArray:,p2,m_nSize:,m_pArray:,0,3,1,2,4,0X1000,4,0X1000,拷贝构造函数,1到p2的浅拷贝,拷贝构造函数,1到p2的深拷贝,拷贝构造函数,在系统自动生成的拷贝构造函数中,拷贝的策略是逐个成员依次拷贝。但是,当一个类拥有资源(例如堆内存)的时候,默认拷贝构造函数只能进行浅拷贝,并不

20、能拷贝资源。解决方法:定义自己的拷贝构造函数,不使用默认拷贝构造函数,使之不但拷贝成员,也拷贝资源。,class Arrayprivate:int *m_pArray; int m_nSize;public:Array( int n ) : m_nSize( n ) m_pArray = new intn;for( int i = 0; i n; +i ) m_pArrayi = i; Array( const Array ,int main()Array p1(4); Array p2(p1); return 0;,p1,m_nSize:,m_pArray:,p2,m_nSize:,m_pA

21、rray:,4,0X1000,4,0X2000,0X1000,0,3,1,2,0X2000,0,3,1,2,class Stackint *m_Elem;int m_nTop;const int m_nSize; public:Stack( int size ) : m_nTop(0), m_nSize(size) m_Elem = new intsize; Stack() delete m_Elem; bool IsEmpty() return m_nTop =0; bool IsFull() return m_nTop = m_nSize; bool Push( int e );bool

22、Pop( int ,s1,m_nSize:5,m_Elem:,0X1000,Stack s1(5);,m_nTop:0,0X1000,Stack s2(s1);,Stack( const Sattic ,3.9 静态成员,静态数据成员,/test.h的内容class Testpublic:int a;int b;Test( int x, int y );,/test.cpp的内容#include test.hTest:Test( int x, int y ) : a( x ), b( y ),/main.cpp的内容#include test.hint main() Test t1(1,2),

23、 t2(3,4); cout t1.a t2.a; cout t1.b t2.b; return 0; ,static int b;,Test( int x );,Test:Test( int x ) : a( x ),b(10),t1,a(1),t2,a(3),Test t1(1), t2(3);,cout Test:b;,int Test:b = 10; /必需,静态数据成员,使用静态数据成员可以实现多个对象之间的数据共享。使用静态数据成员可以节省内存,对多个对象来说,静态数据成员只存储一处,供所有对象使用。使用静态数据成员还不会破坏封装性的原则,保证了安全性。如果静态数据成员是公有的,在

24、类外面可以通过类名:静态数据成员名直接访问。静态数据成员的值对每个对象都是一样的,但它的值是可以更新的。,静态数据成员,class Acount /帐户double amount;;Class CurrentAcount : public Acount /活期static double interest;Class TimeAcount : public Acount /定期static double interest;double CurrentAcount :interest = 0.3;double TimeAcount :interest = 0.7;,class Myclassint

25、 a, b;static int sum;public:Myclass(int x, int y);void Get();int Myclass:Sum = 0;Myclass:Myclass( int x, int y ) : a(x), b(y) sum += a+b; void Myclass:Get() coutabsumendl; int main() Myclass M( 1, 2 ); Myclass N(7, 8 ); M.Get(); N.Get(); return 0; ,静态成员函数,在成员函数原形前面加上static,就为静态成员函数。非静态成员函数和静态成员函数的区别

26、:非静态成员函数里有this指针,既可以访问非静态数据成员,又可以访问静态数据成员。静态成员函数里无this指针,只可以访问静态数据成员。,静态成员函数,/test.h的内容class Testprvate: int a static int b;public:Test( int x );,/main.cpp的内容int main() Test t1( 1 ); cout t1.a;/错 cout t1.b;/错 return 0;,/test.cpp的内容#include test.hint Test:b = 10; /必需Test:Test( int x ) : a( x ),int Ge

27、tA();static int GetB();,int Test:GetA() return a; ,coutt1.GetA();coutt1.GetB();coutTest:GetB();coutTest:GetA();,int Test:GetB() return b; ,return a+b;,return a+b;,错误,静态成员函数,当一个类里有静态数据成员时,一般会定义相应的访问该静态数据成员的静态成员函数,静态成员,静态数据成员对于非静态数据成员,类的每个对象都拥有自己的拷贝,而对于静态数据成员,整个类只有一个拷贝,该拷贝为类的所有对象共享。静态数据成员的唯一性:独立于类的任何对

28、象而存在的惟一实例静态成员函数静态成员函数没有this指针,静态成员函数只能访问静态数据成员。当一个类有静态数据成员时,一般会定义相应的访问该静态数据成员的静态成员函数,静态成员,为一个类设置一个计数器,用以记录当前已经存在的该类的对象个数。,静态成员,class Mint a;static int count;public:M( int x ) : a( x ) +count; M( const M ,int M:count = 0;int main() M m1(1), m2(m1); M *m3 = new M(3); coutM:GetCount(); delete m3; coutM

29、:GetCount(); return 0;,静态成员,单件模式意图:保证一个类仅有一个实例,并提供一个访问该实例的全局访问点。,设计模式可复用面向对象软件的基础,静态成员,class Mint a;public:M( int x ) : a( x );,int main() M m1(1), m2(2); return 0;,class Mint a; M( int x ) : a( x )public:;,M* M:p = 0;,static M* p;,static M* GetInstance() if( p = 0 ) p = new M(3); return p;,M* s1 =

30、M:GetInstance();M* s2 = M:GetInstance();return 0;,3.3 调用构造函数和析构函数的顺序,调用构造函数和析构函数的顺序,在一般情况下,调用析构函数的次序与调用构造函数的次序恰好相反:最先调用构造函数的对象,最后调用析构函数。而最后调用构造函数的对象,最先调用析构函数。可简记为:先构造的后析构,后构造的先析构,它相当一个栈,后进先出。,class Point int m_nX; int m_nY;public: Point( int x, int y ) : m_nX(x), m_nY(y) cout con endl; void SetXY( i

31、nt a, int b ) m_nX = a; m_nY = b; void PrintXY() cout m_nX , m_nY; Point() cout destroy m_nX , m_nY endl; ;,int main() Point p1( 10, 20 ); Point p2( 13, 15 ); p1.SetXY( 20,10 ); p2.PrintXY(); return 0; ,3.4 对象数组,对象数组,可以定义对象的数组。定义一个长度为n的对象数组会创建n个对象,这n个对象占据连续的存储空间。定义一个长度为n的对象数组会调用n次构造函数。对象数组的使用方式和普通数组

32、一样。,class Pointint m_nX; int m_nY;public: Point() : m_nX( 0 ), m_nY( 0 )Point( int x, int y = 0 ) : m_nX(x), m_nY(y);Point a15; Point a22 = Point(10, 20), Point( 30, 40 ) ;Point a23 = Point(10, 20) ;Point a23 = Point(10), Point(30), Point(40) ;Point *p = new Point4;,/创建5个对象,调用5次默认构造函数,3.5 对象与指针,对象与指

33、针,创建一对象后,对象要占据一定的存储空间,所以对象也有地址,对象的地址就是对象所占据存储空间的首地址。可以定义指针变量来存储对象的地址。,对象与指针,class Pointint m_nX; int m_nY;public: Point( int x, int y ) : m_nX(x), m_nY(y)void PrintXY() const cout m_nX , m_nY endl; void SetXY( int x, int y ) m_nX = x; m_nY = y; ;,对象与指针,int main()Point p( 10, 20 );p.PrintXY();Point*

34、ptr = ,对象与指针,可以用new运算符在堆空间中创建对象int main()Point p( 10, 20 );p.PrintXY();Point* ptr = new Point( 20, 40 );ptr-PrinXY();delete ptr;return 0;,Point* ptr = new Point;,/编译错误,对象与指针,可以让对象的地址作为函数的参数void f( Point *p )p-SetXY(10,10);int main()Point p1( 20, 20 );f( ,对象与指针,this指针每个非static成员函数都被包含一个this指针,指向调用这个成

35、员函数的对象。class Xint a;public:void set( int b ) a = b; ;X x1; x1.set( 3 ); X x2; x2.set( 4 );, this-a = b; ,对象与指针,双向链表class Nodeint value;Node* pre;Node* suc;public:void append( Node *p ) p-suc = suc; p-pre = this; suc-pre = p; suc = p; ;,p1,p2,p2-append( p1 );,3.6 const对象与const成员,const修饰符的用法,格式1:修饰普通常

36、量const 类型 常量名 = 值;const double PI = 3.1415; 格式2:修饰引用const 类型 / Error!,const修饰符的用法,格式3: 修饰指针变量,放在类型前面const 类型* 指针变量;int a = 6, b = 7;const int* p = ,/错误,/正确,/正确,const修饰符的用法,格式4: 修饰指针变量,放在指针变量前面类型* const 指针变量;int a = 6, b = 7;int* const p = ,/正确,/正确,/错误,const修饰符的用法,const修饰函数中的参数void fun(const int &x);

37、表示形参x的值在fun函数中不能被修改void fun(const int *x);表示不能通过形参x改变x指向的内容。,const修饰符的用法,void fun( int ,void fun( const int &x ),/错误,const修饰符的用法,void fun( int *x )+x;*x = 4;int main()int a3 = 1, 3, 5;fun( a ); return 0; ,void fun( const int *x ),/错误,const修饰符的用法,当引用作为函数的形参时,如果在函数体里面没有修改形参,最好在形参前面加const修饰。当指针作为函数的形参时

38、,如果在函数体里面没有修改指针指向的内容,最好在形参前面加const修饰。void print( int *a, int n )for( int i = 0; in; +i ) cout ai; ,const,在类中使用const修饰符,const成员函数(只读成员函数)const成员函数不能修改的数据成员的值。,在类中使用const修饰符,const成员函数(只读成员函数)/Person.h的内容Class Person int m_nAge;public:void SetAge( int age ) m_nAge = age; int GetAge() return m_nAge; ;,c

39、onst,int GetAge() const;,/ Person.cpp的内容int Person:GetAge() const return m_nAge;,在类中使用const修饰符,const成员函数(只读成员函数)当一个类的某一成员函数肯定不会改变对象的数据成员值时,最好把该成员函数定义成const成员函数。 const加在函数原型后面,是函数原型的一个组成部分,因此函数实现部分也要带const。,在类中使用const修饰符,const成员函数和同名的非const成员函数可以重载class M int m_nX;public:M( int a = 0 ) : m_nX( a )int

40、 F() +m_nX; return +m_nX; int F() const return m_nX; ;,int main() M m1( 10 ); cout m1.F() return 0;,在类中使用const修饰符,const数据成员class Point int m_nX; int m_nY;public: Point( int x, int y) : m_nX(x), m_nY(y)void PrintXY() const cout m_nX m_nY; void SetX( int x ) m_nX = x; void SetY( int y ) m_nY = y; ;,co

41、nst,int main() Point p1( 10, 30 ); p1.SetX(100); p1.SetY(200); Point p2( 50, 70 ); return 0;,在类中使用const修饰符,const数据成员任何成员函数都不能修改const数据成员的值。如果对象的某个属性值一直保持不变,可以把该属性抽象为const数据成员。人的出生日期。,在类中使用const修饰符,const对象const对象不能被修改,只能访问const成员函数class M int m_nX;public:M( int a = 0 ): m_nX( a )void Set( int a ) m_nX=a; int F() +m_nX; return m_nX; int F() const return m_nX; void Show()cout m_nX;,int main() const M m1(2); m1.Set( 10 ); m1.F(); M m2(3); m2.Set( 20 ); m2.F(); m1.Show(); m2.Show(); return 0;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号