C第八次课ppt课件

上传人:ni****g 文档编号:567917385 上传时间:2024-07-22 格式:PPT 页数:46 大小:283KB
返回 下载 相关 举报
C第八次课ppt课件_第1页
第1页 / 共46页
C第八次课ppt课件_第2页
第2页 / 共46页
C第八次课ppt课件_第3页
第3页 / 共46页
C第八次课ppt课件_第4页
第4页 / 共46页
C第八次课ppt课件_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《C第八次课ppt课件》由会员分享,可在线阅读,更多相关《C第八次课ppt课件(46页珍藏版)》请在金锄头文库上搜索。

1、第十次课第十次课合 肥 学 院 计 科 系华 珊 珊E-mail: 1.上机情况上机情况上机情况上机情况 重大错误:形式参数,实际参数。重大错误:形式参数,实际参数。重大错误:形式参数,实际参数。重大错误:形式参数,实际参数。 类定义的结束符。类定义的结束符。类定义的结束符。类定义的结束符。 类外定义函数,类内部定义函数。类外定义函数,类内部定义函数。类外定义函数,类内部定义函数。类外定义函数,类内部定义函数。 类成员(变量、函数)的使用。类成员(变量、函数)的使用。类成员(变量、函数)的使用。类成员(变量、函数)的使用。 坐标的表示。坐标的表示。坐标的表示。坐标的表示。( (数学表达和程序语

2、言的区别数学表达和程序语言的区别数学表达和程序语言的区别数学表达和程序语言的区别) )2例:设计并测试一个名为例:设计并测试一个名为Rectangle的矩形类,其属性为矩形左下角和右上角两个的矩形类,其属性为矩形左下角和右上角两个点的坐标,能计算矩形面积。点的坐标,能计算矩形面积。数据抽象:数据抽象:左下角坐标:左下角坐标:int leftx, lefty右上角坐标:右上角坐标:int rightx, righty行为抽象:行为抽象:计算矩形面积:计算矩形面积:Area()输入坐标值:输入坐标值:Set()问题:如何输入坐标值?问题:如何输入坐标值?3Class RectangleClass

3、Rectangleprivate:private:int leftx,lefty,rightx,righty;int leftx,lefty,rightx,righty;public:public:void Area();void Area();void Set();void Set(); ;4void Rectangle:area()void Rectangle:area() int width=rightx-righty; int width=rightx-righty; int height=righty-rightx;int height=righty-rightx;return(wi

4、dth*height);return(width*height); void Rectangle:set()void Rectangle:set() int rx,ry,lx,ly; cinrxrylxly;int rx,ry,lx,ly; cinrxrylxly;rightx=rx; righty=ry; leftx=lx; lefty=ly;rightx=rx; righty=ry; leftx=lx; lefty=ly; 5void main()void main() int Area;int Area;Rectangle myRectangle;Rectangle myRectangl

5、e;myRectangle.set();myRectangle.set();area=myRectangle.getArea();area=myRectangle.getArea();cout“Area:”areaendl;cout“Area:”areaendl; 6上次课内容上次课内容上次课内容上次课内容 OOPOOP的特征:抽象、封装、继承、多态。的特征:抽象、封装、继承、多态。的特征:抽象、封装、继承、多态。的特征:抽象、封装、继承、多态。 类类类类 成员函数体成员函数体成员函数体成员函数体 类对象类对象类对象类对象7本次课内容本次课内容本次课内容本次课内容 4.3 4.3 构造函数和析

6、构函数构造函数和析构函数构造函数和析构函数构造函数和析构函数84.3 4.3 构造函数和析构函数构造函数和析构函数构造函数和析构函数构造函数和析构函数就就就就像像像像声声声声明明明明基基基基本本本本类类类类型型型型变变变变量量量量时时时时可可可可以以以以同同同同时时时时进进进进行行行行初初初初始始始始化化化化一一一一样样样样,在在在在声声声声明明明明对对对对象象象象的的的的时时时时候候候候,也也也也可可可可以以以以同同同同时时时时对对对对它它它它的的的的数数数数据据据据成成成成员员员员赋赋赋赋初初初初值值值值。在在在在声声声声明明明明对对对对象象象象的的的的时时时时候候候候进进进进行行行行的的

7、的的数数数数据据据据成成成成员员员员设设设设置置置置,称称称称为对象的初始化。对象数据成员的初始化需要通过类的特殊成员函数来进行。为对象的初始化。对象数据成员的初始化需要通过类的特殊成员函数来进行。为对象的初始化。对象数据成员的初始化需要通过类的特殊成员函数来进行。为对象的初始化。对象数据成员的初始化需要通过类的特殊成员函数来进行。9在特定对象使用结束时,还经常需要进行一些清理工作。在特定对象使用结束时,还经常需要进行一些清理工作。在特定对象使用结束时,还经常需要进行一些清理工作。在特定对象使用结束时,还经常需要进行一些清理工作。C C C C程序中的初始化和程序中的初始化和程序中的初始化和程

8、序中的初始化和清理工作,分别由两个特殊的成员函数来完成,它们就是构造函数和析构函数。清理工作,分别由两个特殊的成员函数来完成,它们就是构造函数和析构函数。清理工作,分别由两个特殊的成员函数来完成,它们就是构造函数和析构函数。清理工作,分别由两个特殊的成员函数来完成,它们就是构造函数和析构函数。10构造函数和析构函数是在类体中说明的两种特殊的成员函数。构造函数和析构函数是在类体中说明的两种特殊的成员函数。构造函数和析构函数是在类体中说明的两种特殊的成员函数。构造函数和析构函数是在类体中说明的两种特殊的成员函数。构构构构造造造造函函函函数数数数的的的的作作作作用用用用就就就就是是是是在在在在对对对

9、对象象象象被被被被创创创创建建建建时时时时利利利利用用用用特特特特定定定定的的的的值值值值构构构构造造造造对对对对象象象象, , , ,将将将将对对对对象象象象初初初初始始始始化为一个特定的状态。构造函数在对象被创建时被自动调用。化为一个特定的状态。构造函数在对象被创建时被自动调用。化为一个特定的状态。构造函数在对象被创建时被自动调用。化为一个特定的状态。构造函数在对象被创建时被自动调用。11析析析析构构构构函函函函数数数数的的的的功功功功能能能能是是是是用用用用来来来来释释释释放放放放一一一一个个个个对对对对象象象象的的的的已已已已分分分分配配配配空空空空间间间间,并并并并可可可可在在在在对

10、对对对象象象象被被被被清清清清除除除除前前前前,完成一些清理工作。析构函数在对象生存期即将结束时刻被自动调用。完成一些清理工作。析构函数在对象生存期即将结束时刻被自动调用。完成一些清理工作。析构函数在对象生存期即将结束时刻被自动调用。完成一些清理工作。析构函数在对象生存期即将结束时刻被自动调用。构造函数与析构函数的功能正好是对应的。构造函数与析构函数的功能正好是对应的。构造函数与析构函数的功能正好是对应的。构造函数与析构函数的功能正好是对应的。12构造函数也是类的一个成员函数,除了具有一般成员函数的特征之外,还有一些特殊构造函数也是类的一个成员函数,除了具有一般成员函数的特征之外,还有一些特殊

11、构造函数也是类的一个成员函数,除了具有一般成员函数的特征之外,还有一些特殊构造函数也是类的一个成员函数,除了具有一般成员函数的特征之外,还有一些特殊的性质:的性质:的性质:的性质:1 1 1 1、构造函数的函数名与类名相同,构造函数中的参数根据需要可有可无。、构造函数的函数名与类名相同,构造函数中的参数根据需要可有可无。、构造函数的函数名与类名相同,构造函数中的参数根据需要可有可无。、构造函数的函数名与类名相同,构造函数中的参数根据需要可有可无。2 2 2 2、不能为构造函数指定返回值类型,、不能为构造函数指定返回值类型,、不能为构造函数指定返回值类型,、不能为构造函数指定返回值类型,void

12、voidvoidvoid也不可以。也不可以。也不可以。也不可以。3 3 3 3、构造函数通常被声明为公有函数;、构造函数通常被声明为公有函数;、构造函数通常被声明为公有函数;、构造函数通常被声明为公有函数;4 4 4 4、构造函数在对象被创建的时候将被自动调用。、构造函数在对象被创建的时候将被自动调用。、构造函数在对象被创建的时候将被自动调用。、构造函数在对象被创建的时候将被自动调用。(只要类中有了构造函数,编译器就会在建立新对象的地方自动插入对构造函数的调(只要类中有了构造函数,编译器就会在建立新对象的地方自动插入对构造函数的调(只要类中有了构造函数,编译器就会在建立新对象的地方自动插入对构

13、造函数的调(只要类中有了构造函数,编译器就会在建立新对象的地方自动插入对构造函数的调用代码。)用代码。)用代码。)用代码。)13默认构造函数默认构造函数默认构造函数默认构造函数注意:注意:注意:注意:如果类中没有写构造函数,编译器会自动生成一个默认形式的构造函数如果类中没有写构造函数,编译器会自动生成一个默认形式的构造函数如果类中没有写构造函数,编译器会自动生成一个默认形式的构造函数如果类中没有写构造函数,编译器会自动生成一个默认形式的构造函数没有没有没有没有参数,也不做任何事情的构造函数。参数,也不做任何事情的构造函数。参数,也不做任何事情的构造函数。参数,也不做任何事情的构造函数。14cl

14、ass Clockclass Clock public: public: void SetTime(int NewH, void SetTime(int NewH, int NewM, int New S);int NewM, int New S); void ShowTime(); void ShowTime();private:private: int Hour, Minute, Second; int Hour, Minute, Second; ;2024/7/22.15为什么要生成这个不做任何为什么要生成这个不做任何事情的函数呢?事情的函数呢?这是因为在建立对象时自动这是因为在建立对象

15、时自动调用构造函数是调用构造函数是C+程序程序“例行公事例行公事”的必然行为。的必然行为。class Clockclass Clock public: public:Clock(int NewH, int NewM, int New S); Clock(int NewH, int NewM, int New S); void SetTime(int NewH, int NewM, void SetTime(int NewH, int NewM, int New S); int New S); void ShowTime(); void ShowTime();private:private: i

16、nt Hour, Minute, Second; int Hour, Minute, Second; ;2024/7/22.16构造函数的实现构造函数的实现构造函数的实现构造函数的实现Clock:Clock(int NewH, int NewM, int New S)Clock:Clock(int NewH, int NewM, int New S) Hour=NewH; Hour=NewH; Minute=NewM; Minute=NewM; Second=NewS; Second=NewS; 17没有构造函数,对象的创建没有构造函数,对象的创建没有构造函数,对象的创建没有构造函数,对象的创

17、建clock c;clock c;c.settime();c.settime();c.showtime();c.showtime();c.settime(8,30,30);c.settime(8,30,30);c.showtime();c.showtime();18有了构造函数,如何创建类对象?有了构造函数,如何创建类对象?有了构造函数,如何创建类对象?有了构造函数,如何创建类对象?clock c(8,30,30,);clock c(8,30,30,);c.showtime();c.showtime();创建类对象时,系统自动调用构造函数,将实参值作为初始值。创建类对象时,系统自动调用构造函数

18、,将实参值作为初始值。创建类对象时,系统自动调用构造函数,将实参值作为初始值。创建类对象时,系统自动调用构造函数,将实参值作为初始值。是否可以如此定义是否可以如此定义是否可以如此定义是否可以如此定义? ?clock c;clock c;c.showtime();c.showtime();19说明:说明:说明:说明:类中定义了构造函数,系统不会生成默认构造函数。类中定义了构造函数,系统不会生成默认构造函数。类中定义了构造函数,系统不会生成默认构造函数。类中定义了构造函数,系统不会生成默认构造函数。若定义的构造函数有参数,建立类对象时若定义的构造函数有参数,建立类对象时若定义的构造函数有参数,建立

19、类对象时若定义的构造函数有参数,建立类对象时必须必须必须必须给出初始值,用来作为调用构造函数给出初始值,用来作为调用构造函数给出初始值,用来作为调用构造函数给出初始值,用来作为调用构造函数时的实参。时的实参。时的实参。时的实参。构造函数可以直接访问类中所有数据成员。构造函数可以直接访问类中所有数据成员。构造函数可以直接访问类中所有数据成员。构造函数可以直接访问类中所有数据成员。构造函数可以重载、内联、带默认形参值。构造函数可以重载、内联、带默认形参值。构造函数可以重载、内联、带默认形参值。构造函数可以重载、内联、带默认形参值。20重载构造函数重载构造函数重载构造函数重载构造函数class cl

20、ockclass clock public: public:clock(int NewH, int NewM, int New S); clock(int NewH, int NewM, int New S); clock ()clock ()Hour=0; Minute=0; Second=0 Hour=0; Minute=0; Second=0 void SetTime(int NewH, int NewM, int New S);void SetTime(int NewH, int NewM, int New S); void ShowTime(); void ShowTime();pr

21、ivate:private: int Hour, Minute, Second; int Hour, Minute, Second; ; 21对象的定义:对象的定义:对象的定义:对象的定义:void main()void main() clockclock c1;c1;clockclock c2(5,12,00);c2(5,12,00); /调用无参构造函数调用无参构造函数/调用有参构造函数调用有参构造函数22如何在矩形类中添加构造函数?如何在矩形类中添加构造函数?如何在矩形类中添加构造函数?如何在矩形类中添加构造函数?Class RectangleClass Rectangleprivate

22、:private:int leftx,lefty,rightx,righty;int leftx,lefty,rightx,righty;public:public:Rectangle(int lx,int ly,int rx,int ry)Rectangle(int lx,int ly,int rx,int ry)void Area();void Area();void Set();void Set(); ;23构造函数的实现构造函数的实现构造函数的实现构造函数的实现Rectangle:Rectangle(int lx,int ly,int rx,int ry)Rectangle:Recta

23、ngle(int lx,int ly,int rx,int ry) leftx=lx;leftx=lx;lefty=ly;lefty=ly;rightx=rx;rightx=rx;righty=ry;righty=ry; 24如何定义类对象?如何定义类对象?如何定义类对象?如何定义类对象?void main()void main() int Area; int Area; Rectangle myRectangle; /Rectangle myRectangle; /能否这样定义?能否这样定义?能否这样定义?能否这样定义?myRectangle.set();myRectangle.set();

24、area=myRectangle.getArea();area=myRectangle.getArea();cout“Area:”areaendl;cout“Area:”areaendl; 25析构函数析构函数析构函数析构函数 析构函数与构造函数的作用相反。析构函数与构造函数的作用相反。析构函数与构造函数的作用相反。析构函数与构造函数的作用相反。 析构函数用来完成对象删除前的清理工作。析构函数用来完成对象删除前的清理工作。析构函数用来完成对象删除前的清理工作。析构函数用来完成对象删除前的清理工作。 在对象生存期即将结束时被自动调用。在对象生存期即将结束时被自动调用。在对象生存期即将结束时被自动

25、调用。在对象生存期即将结束时被自动调用。 析构函数名:析构函数名:析构函数名:析构函数名: 类名类名类名类名 析构函数没有返回值,没有参数。析构函数没有返回值,没有参数。析构函数没有返回值,没有参数。析构函数没有返回值,没有参数。 若不声明,系统会自动生成一个函数体为空的析构函数。若不声明,系统会自动生成一个函数体为空的析构函数。若不声明,系统会自动生成一个函数体为空的析构函数。若不声明,系统会自动生成一个函数体为空的析构函数。26例如:给时钟类加入一个空的内联析构函数,其功能和系统自动生成的默认析构函例如:给时钟类加入一个空的内联析构函数,其功能和系统自动生成的默认析构函例如:给时钟类加入一

26、个空的内联析构函数,其功能和系统自动生成的默认析构函例如:给时钟类加入一个空的内联析构函数,其功能和系统自动生成的默认析构函数相同。数相同。数相同。数相同。class Clockclass Clock public:public: Clock(); / Clock(); /构造函数构造函数构造函数构造函数 void SetTime( int NewH, int NewM, int NewS);void SetTime( int NewH, int NewM, int NewS); void ShowTime(); void ShowTime(); Clock() / Clock() /析构函数

27、析构函数析构函数析构函数private:private: int Hour, Minute, Second; int Hour, Minute, Second; ;2024/7/22.272024/7/2228.对日期类进行修改对日期类进行修改如:如:class TDate1class TDate1 public: public: TDate1(int y,int m,int d); TDate1(int y,int m,int d); TDate1( ); TDate1( ); void Print( ); void Print( ); private: private: int year,

28、month,day; int year,month,day; ; ;构造函数的构造函数的说明说明析构函数的析构函数的说明说明一般成员函数一般成员函数的说明的说明函数名与类名一函数名与类名一致,无类型但可致,无类型但可有参数有参数名字与类名一名字与类名一致,前有致,前有,无类型无参数无类型无参数2024/7/2229.TDate1:TDate1(int y,int m,int d)TDate1:TDate1(int y,int m,int d) year=y;month=m;day=d; year=y;month=m;day=d; coutConstructor called.n; coutCo

29、nstructor called.n; TDate1:TDate1( )TDate1:TDate1( ) coutDestructor called.n; coutDestructor called.n; void TDate1:Print( )void TDate1:Print( ) coutyear.month.dayendl; coutyear.month.dayendl;构造函数的定义析构函数的定义一般函数的定义与其他成员函数定义一样,函数的定义可放在类体内,也可放在类体外2024/7/2230.#include #include void main( )void main( ) TD

30、ate1 today(2007,4,1),tomorrow(2007,4,2); TDate1 today(2007,4,1),tomorrow(2007,4,2); couttoday is; couttoday is; today.Print( ); today.Print( ); couttomorrow is; couttomorrow is; tomorrow.Print( ); tomorrow.Print( ); 执行程序后,输出结果为:执行程序后,输出结果为:执行程序后,输出结果为:执行程序后,输出结果为:Constructor Called.Constructor Calle

31、d.today is 2007.4.1tomorrow is 2007.4.2Destructor called.Destructor called.2024/7/2231.构造函数的调用构造函数的调用#includeclass Apublic: A() cout“A() is called”endl; A( int x, int y);private: int a, b;A:A( int x, int y)A:A( int x, int y) a=x; a=x; b=y; b=y; cout“A( int x, int y) cout“A( int x, int y) is called”e

32、ndl; is called”endl; cout“A=“at cout“A=“at “B=“bendl; “B=“bendl; #include”example1.h”#include”example1.h”void main()void main() A a; A a; A b(10, 10); A b(10, 10); A() is calledA( int x, int y) is calledA=10 B=10析构函数的执行过程析构函数的执行过程析构函数的执行过程析构函数的执行过程/example2.h/example2.h#include#includeclass Aclass A

33、 public:public: A() A() cout“A() is called”endl; cout“A() is called”endl; A A cout“A() is called”endl; cout“A() is called”endl; ; ;2024/7/22.32#include” example2.h”#include” example2.h”void main()void main() A a; A a; cout“the program will cout“the program will end”endl; end”endl; A() is calledthe p

34、rogram will end the program will end A() is called2024/7/22.33 面向对象的程序设计就是要能够如实反映客观世界中各种问题的本来面目,因此对面向对象的程序设计就是要能够如实反映客观世界中各种问题的本来面目,因此对象的复制是象的复制是C+程序必不可少的能力。程序必不可少的能力。 生成一个对象的副本有两种途径,一是建立一个新对象,然后将一个已有对象生成一个对象的副本有两种途径,一是建立一个新对象,然后将一个已有对象的数据成员值取出来,一一赋给新的对象。这样做虽然可行,但很繁琐。二是使类的数据成员值取出来,一一赋给新的对象。这样做虽然可行,但

35、很繁琐。二是使类具有自行复制本类对象的能力,这也正是拷贝构造函数的功能。具有自行复制本类对象的能力,这也正是拷贝构造函数的功能。拷贝构造函数拷贝构造函数2024/7/2234.拷贝构造函数实现了在初始化时将一个已知对象的数据成员的值拷贝给正在拷贝构造函数实现了在初始化时将一个已知对象的数据成员的值拷贝给正在创建的另一个同类的对象。可以根据实际问题的需要定义特定的拷贝构造函数,以创建的另一个同类的对象。可以根据实际问题的需要定义特定的拷贝构造函数,以实现同类对象之间数据成员的传递。实现同类对象之间数据成员的传递。每个类中必须有一个拷贝构造函数。若类中未说明,则编译系统会自动生成每个类中必须有一个

36、拷贝构造函数。若类中未说明,则编译系统会自动生成一个默认的拷贝构造函数。这个默认拷贝构造函数的功能是把初始值对象的每个数一个默认的拷贝构造函数。这个默认拷贝构造函数的功能是把初始值对象的每个数据成员的值都复制到新建立的对象中。据成员的值都复制到新建立的对象中。2024/7/2235.声明和实现拷贝构造函数的一般方法:声明和实现拷贝构造函数的一般方法:class 类名类名public: 类名(形参表);类名(形参表); /构造函数构造函数 类名(类名类名(类名 &对象名);对象名); /拷贝拷贝构造函数构造函数 ;类名类名:类名(类名类名(类名 &对象名)对象名) /拷贝构造函数的实现拷贝构造函

37、数的实现 函数体函数体如:如:student:student(student &s) student:student(student &s) student:student(student &s) student:student(student &s) 一个拷贝构造函数的例子:通过水平和垂直两个方向的坐标值一个拷贝构造函数的例子:通过水平和垂直两个方向的坐标值一个拷贝构造函数的例子:通过水平和垂直两个方向的坐标值一个拷贝构造函数的例子:通过水平和垂直两个方向的坐标值X X和和和和Y Y来确定屏幕上的一个点。来确定屏幕上的一个点。来确定屏幕上的一个点。来确定屏幕上的一个点。点点点点(point)

38、(point)类中声明如下:类中声明如下:类中声明如下:类中声明如下:class Pointclass Point public:public: Point( int xx=0, int yy=0) X=xx; Y=yy; / Point( int xx=0, int yy=0) X=xx; Y=yy; /构造函数构造函数构造函数构造函数 Point( Point &p); /Point( Point &p); /拷贝构造函数拷贝构造函数拷贝构造函数拷贝构造函数 int GetX() return X; int GetX() return X; int GetY() return Y; int

39、 GetY() return Y; private: private: int X,Y; int X,Y; ; 2024/7/22.36类中声明了内联构造函数和拷贝构造函数。类中声明了内联构造函数和拷贝构造函数。拷贝构造函数的实现如下:拷贝构造函数的实现如下:Point:Point( Point &p) X=p.X; Y=p.Y; cout“拷贝构造函数被调用拷贝构造函数被调用”endl;普通构造函数是在对象创建时被调用,而拷贝构造函数在以下三种情况下都会被调用:普通构造函数是在对象创建时被调用,而拷贝构造函数在以下三种情况下都会被调用:普通构造函数是在对象创建时被调用,而拷贝构造函数在以下三

40、种情况下都会被调用:普通构造函数是在对象创建时被调用,而拷贝构造函数在以下三种情况下都会被调用:1 1、用一个已知对象初始化一个新对象时。、用一个已知对象初始化一个新对象时。、用一个已知对象初始化一个新对象时。、用一个已知对象初始化一个新对象时。void main()void main() Point A(1, 2); Point A(1, 2); Point B(A); / Point B(A); /用对象用对象用对象用对象A A初始化对象初始化对象初始化对象初始化对象B B,拷贝构造函数被调用,拷贝构造函数被调用,拷贝构造函数被调用,拷贝构造函数被调用 coutB.GetX()endl;c

41、outB.GetX()endl; 2024/7/22.372 2、以值调用方式向一个函数传递对象参数时。以值调用方式向一个函数传递对象参数时。以值调用方式向一个函数传递对象参数时。以值调用方式向一个函数传递对象参数时。void f(Point p)void f(Point p) coutp.GetX()endl; coutp.GetX()endl; void main()void main() Point A(1, 2); Point A(1, 2); f(A); / f(A); /函数的形参为类的对象,当调用函数函数的形参为类的对象,当调用函数函数的形参为类的对象,当调用函数函数的形参为类的

42、对象,当调用函数 时,拷贝构造函数被调用时,拷贝构造函数被调用时,拷贝构造函数被调用时,拷贝构造函数被调用 2024/7/22.383 3、当对象作为函数返回值时、当对象作为函数返回值时Point g()Point g() Point A(1,2); Point A(1,2); return A; / return A; /函数的返回值是类对象,返回函数函数的返回值是类对象,返回函数函数的返回值是类对象,返回函数函数的返回值是类对象,返回函数 值时,调用拷贝构造函数值时,调用拷贝构造函数值时,调用拷贝构造函数值时,调用拷贝构造函数 void main()void main() Point B;

43、 Point B; B=g(); B=g(); 2024/7/22.39#include#includeclass Aclass A public: public: A(int a=0) A(int a=0) cout cout“ “调用构造函数调用构造函数调用构造函数调用构造函数” ”endl;endl; x=a; x=a; A(A & a) A(A & a) cout cout“ “调用拷贝构造函数调用拷贝构造函数调用拷贝构造函数调用拷贝构造函数” ”endl;endl; x=a.x; x=a.x; A() A() void outputx() void outputx() cout co

44、ut“ “x=x=“ “xendl;xendl; private:private: int x; int x; ;2024/7/22.40void main()void main() A a1(2);A a1(2);a1.outputx();a1.outputx();A a2(a1);A a2(a1);a2.outputx();a2.outputx(); 调用构造函数调用构造函数x=2x=2调用拷贝构造函数调用拷贝构造函数x=2x=2PointPoint类的完整程序。类的完整程序。类的完整程序。类的完整程序。includeincludeclass Pointclass Point public

45、:public: Point( int xx=0, int yy=0) Point( int xx=0, int yy=0) X=xx; Y=yy; X=xx; Y=yy; Point( Point &p); Point( Point &p); int GetX() return X; int GetX() return X; int GetY() return Y; int GetY() return Y; private: private: int X,Y; int X,Y; ; / /成员函数的实现成员函数的实现成员函数的实现成员函数的实现Point:Point(Point &p)Poi

46、nt:Point(Point &p) X=p.X; X=p.X; Y=p.Y; Y=p.Y; cout“ cout“拷贝构造函数被调用拷贝构造函数被调用拷贝构造函数被调用拷贝构造函数被调用” ”endl;endl; 2024/7/22.41/ /形参为形参为PointPoint类对象的函数类对象的函数void fun1(Point p)void fun1(Point p) coutp.GetX()endl; coutp.GetX()endl; / /返回值为返回值为PointPoint类对象的函数类对象的函数Point fun2()Point fun2() Point A(1, 2); Poi

47、nt A(1, 2); return A; return A; void main()void main() Point A(4, 5); Point A(4, 5); Point B(A); Point B(A); coutB.GetX()endl; coutB.GetX()endl; fun1(B); fun1(B); B=fun2(); B=fun2(); coutB.GetX()endl; coutB.GetX()endl; 程序的运行结果为:程序的运行结果为:拷贝构造函数被调用拷贝构造函数被调用4拷贝构造函数被调用拷贝构造函数被调用4拷贝构造函数被调用拷贝构造函数被调用12024/7

48、/2242.现实世界中的复杂问题可以被逐步划分为一系列较为简单的子问题,现实世界中的复杂问题可以被逐步划分为一系列较为简单的子问题,从而能够容易地被解决。从而能够容易地被解决。在面向对象程序设计中,可以对复杂对象进行分解、抽象,把一个在面向对象程序设计中,可以对复杂对象进行分解、抽象,把一个复杂对象分解为简单对象的组合,由比较容易理解和实现的部件对象复杂对象分解为简单对象的组合,由比较容易理解和实现的部件对象装配而成。装配而成。4.5 4.5 4.5 4.5 类的组合类的组合类的组合类的组合2024/7/2243.class Circle /定义类定义类Circle及其数据和方法及其数据和方法

49、public: /外部接口外部接口 Circle( float r); /构造函数构造函数 float Circumference(); /计算圆周长计算圆周长 float Area(); /计算圆面积计算圆面积private: /私有数据成员私有数据成员 float radius;2024/7/2244.类的组合描述的就是一个类内嵌其他类的对象类的组合描述的就是一个类内嵌其他类的对象作为成员的情况,它们之间的关系是一种包含与被作为成员的情况,它们之间的关系是一种包含与被包含的关系。例如,用一个类来描述计算机系统,包含的关系。例如,用一个类来描述计算机系统,可以把它分解为硬件和软件,而硬件可包

50、含中央处可以把它分解为硬件和软件,而硬件可包含中央处理单元、存储器、输入设备和输出设备,软件可包理单元、存储器、输入设备和输出设备,软件可包括系统软件和应用软件。括系统软件和应用软件。当创建类的对象时,如果这个类具有内嵌对象当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌对象将首先被自动创建。在创成员,那么各个内嵌对象将首先被自动创建。在创建对象时既要对本类的基本类型数据成员进行初始建对象时既要对本类的基本类型数据成员进行初始化,又要对内嵌对象成员进行初始化。化,又要对内嵌对象成员进行初始化。2024/7/2245.组合类构造函数定义的一般形式为:组合类构造函数定义的一般形式为:类名

51、类名:类名类名(形参表形参表):内嵌对象内嵌对象1(形参表形参表),内嵌对象,内嵌对象2(形参表形参表),类的初始化类的初始化其中,其中,“内嵌对象内嵌对象1(形参表形参表),内嵌对象,内嵌对象2(形参表形参表),”称作初始化列表,其作用是对内嵌对象进行初始化。称作初始化列表,其作用是对内嵌对象进行初始化。例如:对前面例如:对前面Circle 类的构造函数也可以写成:类的构造函数也可以写成:Circle:Circle( float r): radius(r) 2024/7/2246.在创建一个组合类的对象时,不仅它自身的构在创建一个组合类的对象时,不仅它自身的构造函数将被调用,而且还将调用其内

52、嵌对象的构造造函数将被调用,而且还将调用其内嵌对象的构造函数。这是构造函数的调用顺序是:函数。这是构造函数的调用顺序是:、调用内嵌对象的构造函数,调用顺序按照内嵌、调用内嵌对象的构造函数,调用顺序按照内嵌对象在组合类的声明中出现的次序。对象在组合类的声明中出现的次序。、执行本类构造函数的函数体。、执行本类构造函数的函数体。如果声明组合类的对象时没有指定对象的初始如果声明组合类的对象时没有指定对象的初始值,则默认形式(无形参)的构造函数被调用,这值,则默认形式(无形参)的构造函数被调用,这时内嵌对象的默认形式构造函数也被调用。时内嵌对象的默认形式构造函数也被调用。注意:析构函数的调用执行顺序与构造函数刚好相注意:析构函数的调用执行顺序与构造函数刚好相 反。反。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号