怎样使用类和对象ppt课件.ppt
《怎样使用类和对象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 利用构造函数对对象进行初始
2、化利用构造函数对对象进行初始化 作用作用构造函数构造函数:当一个对象被定义时会自动:当一个对象被定义时会自动调用,用来对对象进行初始化。调用,用来对对象进行初始化。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; ;p1m_nY: m_nX:int main() Point p1( 10, 20
3、); Point p2( 13, 15 ); p1.SetXY( 20,10 ); p2.PrintXY(); return 0; 1020p2m_nY: m_nX:131520103.1 利用构造函数对对象进行初始化利用构造函数对对象进行初始化 声明格式:声明格式:(); 程序中不能直接调用构造函数,在定程序中不能直接调用构造函数,在定义对象时,系统会自动调用构造函数义对象时,系统会自动调用构造函数3.1 利用构造函数对对象进行初始化利用构造函数对对象进行初始化 构造函数与类同名构造函数与类同名 没有返回值,原型中也没有没有返回值,原型中也没有void。3.1 利用构造函数对对象进行初始利用
4、构造函数对对象进行初始化化 构造函数可以重载。构造函数可以重载。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, 20 );Point p4( 20 );Point p3();在创建对象时,必须有可匹配的
5、在创建对象时,必须有可匹配的构造函数被调用,如果无匹配的构造函数被调用,如果无匹配的构造函数,则报错。构造函数,则报错。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
6、, m_nY;Point();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
7、 PrintXY();Point();/point.cpp的内容的内容Point:Point(int a = 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
8、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; 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
9、 ) m_nX = a;m_nY = b;void PrintXY()cout m_nX , m_nY;Point();int main()Point p;p.PrintXY();return 0; 3.1 利用构造函数对对象进行初始化利用构造函数对对象进行初始化 如果一个类你没有定义构造函数,那么系如果一个类你没有定义构造函数,那么系统会为你定义一个构造函数,该构造函数统会为你定义一个构造函数,该构造函数的参数表和函数体为空;如果你定义了一的参数表和函数体为空;如果你定义了一个构造函数,则系统不会为你定义任何构个构造函数,则系统不会为你定义任何构造函数。造函数。数据成员的初始化数据成员的初始
10、化 在构造函数的函数体中初始化在构造函数的函数体中初始化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;p1m_nY: m_nX:1020int main()Point p1( 10, 20 ); p1.PrintXY();return 0;数据成员的初始化数据成员的初始化 在构造函数头部初始化在构造函数头部初始化格式:格式:类名类名:构造函数构造函数(参数表参数表) : m1(v1), m2(v
11、2), 函数体函数体 初始化列表初始化列表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_nY(b) 数据成员的初始化数据成员的初始化class Person private:char m_strName20;int
12、 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 利用析构函数进行清理工作利用析构函数进行清理工作 作用:作用:将要释放某个对象所占据的存储空间之将要释放某个对象所占据的存储空间之前,该对象的析构函
13、数会被自动调用,前,该对象的析构函数会被自动调用,来进行一些清理工作。来进行一些清理工作。 声明格式:声明格式:类名类名();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; ;p1m_nY: m_nX:int main() Point p1(
14、 10, 20 ); Point p2( 13, 15 ); p1.SetXY( 20,10 ); p2.PrintXY(); return 0; 1020p2m_nY: m_nX:13152010concon13,15destroydestroy3.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;0X1000am_nS
15、ize: m_pArray: 0X100043.2 利用析构函数进行清理工作利用析构函数进行清理工作class 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; 0X1000am_nSize: m_pArray: 0X100043.2 利用析构函数进行清理工作利用析构函数进行清理工作析构函数与类同名,只是在前面添加了符号析构函数与类同名,只是在前面添
16、加了符号。析构函数没有返回值,原型中也没有析构函数没有返回值,原型中也没有void。析构函数没有参数,析构函数没有参数,一个类只能有一个析构函数,析构函数不能被一个类只能有一个析构函数,析构函数不能被重载重载析构函数的函数体可写在类体内,也可写在类析构函数的函数体可写在类体内,也可写在类体外。体外。将要释放某个对象所占据的存储空间之前,系将要释放某个对象所占据的存储空间之前,系统自动调用析构函数。统自动调用析构函数。析构函数也可以被程序显示调用。析构函数也可以被程序显示调用。析构函数析构函数class Pointprivate:int m_nX;int m_nY;public:Point( i
17、nt 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 利用析构函数进行清理工作利用析构函数进行清理工作对于一个类,如果没有显示定义构造函数,编对于一个类,如果没有显示定义构造函数,编译器自动为该类产生一个构造函数。译器自动为该类产生一个构造函数。对
18、于一个类,如果没有显示定义析构函数,编对于一个类,如果没有显示定义析构函数,编译器自动产生为该类一个析构函数。译器自动产生为该类一个析构函数。一个设计合理的类,一般至少要显示定义一个一个设计合理的类,一般至少要显示定义一个构造函数。至于是否要显示定义析构函数,可构造函数。至于是否要显示定义析构函数,可根据需要确定,如果该类的对象占据的存储空根据需要确定,如果该类的对象占据的存储空间释放时不必要做什么清理工作,可以不必定间释放时不必要做什么清理工作,可以不必定义析构函数。义析构函数。3.8 对象的赋值与复制对象的赋值与复制拷贝构造函数拷贝构造函数 在创建对象时,必须有一个匹配的构造函数被调在创建
19、对象时,必须有一个匹配的构造函数被调用,如果无匹配的构造函数,则报错。用,如果无匹配的构造函数,则报错。class Pointprivate:int m_nX; int m_nY;Point p2; Point p1( 10, 30 ); int a = 5;int b( a );Point p3( 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)Poin
20、t( const Point &p ) m_nX = p.m_nX; m_nY = p.m_nY; ;Point p1( 10, 30 ); Point p2( p1 );Point p3 = p1; 等价于等价于 Point p3( p1 ); Point( const Point &p ):m_nX(p.m_nX),m_nY(p.m_nX) 拷贝构造函数拷贝构造函数 拷贝构造函数拷贝构造函数拷贝构造函数是一种特殊的构造函数,拷贝构造函数是一种特殊的构造函数,其形参是其形参是本类对象的常引用本类对象的常引用。它的作。它的作用是用一个已经存在的对象初始化一用是用一个已经存在的对象初始化一个新的
21、同类对象。个新的同类对象。拷贝构造函数拷贝构造函数 格式:格式: :(const &) 特点:特点:是一种构造函数。是一种构造函数。参数为本类对象的常引用。参数为本类对象的常引用。类名类名拷贝构造函数拷贝构造函数 拷贝构造函数的调用拷贝构造函数的调用:明确表示由另一个对象对要创建的对象明确表示由另一个对象对要创建的对象进行初始化时。进行初始化时。Point p2(p1); Point p3 = p1; Point p4; p4 = p1; /调用构造函数调用构造函数/不调用构造函数不调用构造函数拷贝构造函数拷贝构造函数class Pointprivate:int m_nX; int m_nY;
22、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 ); Point p2( p1 ); p2.Show(); return 0;拷贝构造函数拷贝构造函数 每个类都必须有一个拷贝构造函数,如果没有显每个类都必须有一个拷贝构造函数,如果没有显式定义拷贝构造函数,则编译系统自动生成一个式定义拷贝构造函数,则编译系统自动生成一个拷贝构造函数,作为公有成员。拷贝构造函数,作为公有成员。 系统自动生成的拷贝构造函数的函数体不为空,系统自动
23、生成的拷贝构造函数的函数体不为空,拷贝的策略是逐个成员依次拷贝。拷贝的策略是逐个成员依次拷贝。 所以对所以对一些简单的类一些简单的类我们没有必要写拷贝构造函我们没有必要写拷贝构造函数,系统自动生成的拷贝构造函数就可以以达到数,系统自动生成的拷贝构造函数就可以以达到我们的目的。(前面的我们的目的。(前面的Point类)类)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 =
24、 i; Array() delete m_pArray; ;int main()Array p1(4);Array p2(p1);return 0;0X1000p1m_nSize: m_pArray:p2m_nSize: m_pArray:031 24 0X10004 0X1000拷贝构造函数拷贝构造函数 p1到到p2的浅拷贝的浅拷贝拷贝构造函数拷贝构造函数 p1到到p2的深拷贝的深拷贝拷贝构造函数拷贝构造函数 在系统自动生成的拷贝构造函数中,拷贝在系统自动生成的拷贝构造函数中,拷贝的策略是逐个成员依次拷贝。的策略是逐个成员依次拷贝。 但是,当一个类拥有资源但是,当一个类拥有资源(例如堆内存例
25、如堆内存)的时的时候,默认拷贝构造函数只能进行浅拷贝候,默认拷贝构造函数只能进行浅拷贝,并不能拷贝资源。并不能拷贝资源。 解决方法:解决方法:定义自己的拷贝构造函数,不使用默认定义自己的拷贝构造函数,不使用默认拷贝构造函数,使之不但拷贝成员,也拷贝构造函数,使之不但拷贝成员,也拷贝资源拷贝资源。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( c
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 怎样 使用 对象 ppt 课件
限制150内