第4章 深入类和对象(1)_第1页
第4章 深入类和对象(1)_第2页
第4章 深入类和对象(1)_第3页
第4章 深入类和对象(1)_第4页
第4章 深入类和对象(1)_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第4章章 深入类和对象深入类和对象(I)4.1 构造函数构造函数【设置目的】 在建立相应类对象时,对对象进行初始化;在建立相应类对象时,对对象进行初始化;4.1 构造函数构造函数class Circleprivate: int x; int y; float fRadius;public: Circle() /构造函数 x=0; y=0; void SetXY(int x,int y); void SetRadius(float r); void Move(int newx,int newy);Circle a;l一种创建对象的特殊的成员函数l创建一个类的新对象时,自动调用构造函数,完成初始

2、化工作l 构造函数的作用:l构造函数为一个对象分配数据成员的存储空间l 构造函数初始化一个对象的部分或全体数据成员l 构造函数为类对象请求其他资源class Circleprivate: int x; int y; float fRadius;public: Circle(int xc,int yc) /构造函数 x=xc; y=yc; void SetXY(int x,int y); void SetRadius(float r); void Move(int newx,int newy);Circle a(10,10);class Circleprivate: int x; int y;

3、float fRadius;public: Circle(int xc=0,int yc=0) /构造函数 x=xc; y=yc; void SetXY(int x,int y); void SetRadius(float r); void Move(int newx,int newy);Circle a(10,10);Circle b;4.1 构造函数构造函数l对于一些特殊的数据成员,如常量成员、引用成员等,不能在构造函数体内用赋值语句初始化(为什么?)l用构造函数的初始化列表的方式进行初始化 构造函数名(参数列表):成员名(表达式)l成员被初始化的次序是成员定义的次序而不是初始化列表中的次

4、序struct structClasspublic: const int a; const int & r; structClass() a=9; /错误 r=a; /错误 ;struct structClass const int a; const int & r; structClass():a(9),r(a) ;class X int i; int j;public: X(int val):j(val), i(j);4.1 构造函数构造函数l创建对象时,自动调用构造函数l创建对象的方式:没有参数 类名 对象名;仅有一个参数 类名 对象名参数值; 类名 对象名(参数值);有一个或多个参数

5、类名 对象名(参数列表);Class Date private: int day,month,year; public: Date(int d,int m,int y) day=d;month=m.year=y; ;Void main() Date today(1,7,2002); Date my_birthday; /错误 Date release1(10,12); /错误Class Date private: int day,month,year; public: Date() day=1;month=1;year=2010; ;Void main() Date my_birthday;

6、Class Date private: int day,month,year; public: Date(int y) day=1;month=1;year=y; ;Void main() Date today(2010); Date today=2010; Class Date private: int day,month,year; public: Date(int d,int m,int y) day=d;month=m.year=y; ;Void main() Date today(1,7,2002); Date my_birthday; /错误 Date release1(10,12

7、); /错误重载构造函数重载构造函数l提供多个构造函数,用于不同情况下对象的初始化。创建类 X 的对象时,C+会根据参数选择调用其中一个。构造函数的重载:参数列表必须互不相同class X public: X ( ) ; X( int ) ; X ( int, char ) ; X ( float, char ) ; . ; void f ( ) X a ; / 调用构造函数 X() X b ( 1 ) ; / 调用构造函数 X(int) X c ( 1, c ) ; / 调用构造函数 X(int, char) X d ( 2.3 , d ) ; / 调用构造函数 X(float, char)

8、 . 重载的构造函数重载的构造函数问题:如果一个类有一个所有参数都是缺省参数的构造函数,能否重载一个不带任何参数的构造函数?class X public: X ( ) ; X( int i = 0 ) ; . ;main ( ) X one(10) ; / 正确 X two ;/ 存在二义性。调用X:X(),还是调用X:X(int = 0) ? .不同构造函数的匹配不同构造函数的匹配class Tdate public: Tdate(); Tdate(int d); Tdate(int m, int d); Tdate(int m, int d, int y); protected: int

9、month; int day; int year;Tdate : Tdate() month = 10 ; day = 1; year = 2000 ; cout month /” day /” year endl ; Tdate : Tdate ( int d ) month = 10 ; day = d ; year = 2000 ; cout month /” day /” year endl ; Tdate : Tdate ( int m, int d ) month = m ; day = d; year = 2000 ; cout month /” day /” year endl

10、 ; Tdate : Tdate ( int m, int d, int y ) month=m; day=d; year=y; coutmonth/day/yearendl;void main ( ) Tdate aday ; Tdate bday ( 5 ) ; Tdate cday ( 2, 12 ) ; Tdate dday ( 1, 2, 1998 ) ;使使用默认参数的构造函数用默认参数的构造函数# include class Tdate public: Tdate ( int m=10, int d=1, int y=2000 ) ; protected: int month;

11、int day; int year;Tdate : Tdate ( int m, int d, int y ) month = m; day = d; year = y ; cout month “/” day “/” year endl ;void main() Tdate aday ; Tdate bday ( 5 ) ; Tdate cday ( 2 , 12 ) ; Tdate dday ( 1 , 2 , 1998 ) ;4.1.3 缺省的构造函数缺省的构造函数l编译器自动给用户定义的没有定义构造函数的类生成一个无参数的构造函数,称为缺省构造函数l缺省构造函数的工作:l类类型成员:运

12、行各自的缺省构造函数进行初始化l内置和复合类型成员:只对全局对象才初始化,当对象定义在局部作用域中时,不进行初始化l如果有常量成员或引用成员,不能使用缺省的构造函数4.2 析构函数析构函数【设置目的】类对象退出作用域时,回收存贮,作善后工作。类对象退出作用域时,回收存贮,作善后工作。4.2 析构函数析构函数l没有返回类型,没有参数,函数名是 类名l退出对象作用域时,自动调用析构函数释放对象存储空间释放对象所占用的资源l缺省的析构函数:用户没有定义析构函数时,系统自动生成class X public: X() cout“In constructor”endl; X() cout“In destr

13、uctor”0) Table cc; Table dd; 调用aa的构造函数调用bb的构造函数调用cc的构造函数调用cc的析构函数调用dd的构造函数调用dd的析构函数调用bb的析构函数调用aa的析构函数#include using namespace std; class Teacher private: char * name; public: Teacher(char *input_name) /有参数的构造函数 name=new char10; name=input_name; /这样赋值是错误的 strcpy(name,input_name); Teacher() delete nam

14、e; void show(); ; void Teacher:show() coutnameendl; void main() Teacher a; /*这里是错误的,因为没有 无参数的构造函数*/ Teacher a(test); a.show(); 4.3 拷贝构造函数拷贝构造函数l需要用按值传递的方式传递类对象时,用到拷贝构造函数创建一个新对象,希望用一个用类型的已存在对象初始化这个新对象时调用函数实参形参结合时函数返回值传递给对象时class Point;Point func(Point P) Void mainPoint pt1,pt2(pt1);Point pt3=func(pt1

15、);拷贝构造函数拷贝构造函数l是一个构造函数,系统自动调用l实现用已有对象创建新对象l参数是对象的引用(为什么?)l缺省的拷贝构造函数,用位拷贝方式将拷贝对象的内存一个字节一个字节地拷贝给被拷贝的对象Class Point private: int x; int y; public: Point(int intx=0, int inty=0) x=intx; y=inty; Point(const Point & pt) x=pt.x; y=pt.y; ;Point a(10,20);Point b(a); /or Point b=a;Class Point private: int x; i

16、nt y; public: Point(int intx=0, int inty=0) x=intx; y=inty;Point a(10,20);Point b(a); /or Point b=a;拷贝构造函数拷贝构造函数l有些对象的传值,不不能能够通过简单的位拷贝实现l禁止拷贝 可以在类内声明一个私有的拷贝构造函数,不必定义 Class aClassprivate: int * p; public: aClass() ;l用已有对象初始化新创建对象class Location public : Location ( int xx = 0 , int yy = 0 ) X = xx ; Y

17、= yy ; int GetX ( ) return X ; int GetY ( ) return Y ; private : int X , Y ;main ( ) Location A ( 1 , 2 ) ; Location B ( A ) ;/调用缺省构造函数 cout “B:” B.GetX ( ) “,” B.GetY ( ) endl ;l用已有对象初始化新创建对象class Location public : Location ( int xx = 0 , int yy = 0 ) X = xx ; Y = yy ; Location ( Location & p ) ; L

18、ocation ( ) cout X “,” Y “ Object destroyed.” endl ; int GetX ( ) return X ; int GetY ( ) return Y ; private : int X , Y ; ;Location : Location ( Location & p) X = p . X + 2 ; Y = p . Y + 2 ; cout “Copy_constructor called.” endl ; main ( ) Location A ( 1 , 2 ) ; Location B ( A ) ; / 等价于 B ( 3, 4 ) c

19、out “B:” B . GetX ( ) “,” B . GetY ( ) endl ;class Location public : Location ( int xx = 0 , int yy = 0 ) X = xx ; Y = yy ;cout“Object constructed”endl; Location ( Location & p ) ; Location ( ) cout X “,” Y “ Object destroyed.” endl ; int GetX ( ) return X ; int GetY ( ) return Y ; private : int X , Y ; ;Location : Location ( Location & p)/ 拷贝构造函数 X = p.X ; Y = p.Y ; cout “Copy_constructor called.” endl ; void f ( Location p ) cout “Funtion:” p.GetX() “,” p.GetY() endl ; main ( ) Location A ( 1 , 2 ) ; f ( A ) ; 当对象作函数参数时,因为要用实参初始化形参,也要调用拷 贝构造函数class Location public :

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论