C++程序设计课件:第4章NEW2014_第1页
C++程序设计课件:第4章NEW2014_第2页
C++程序设计课件:第4章NEW2014_第3页
C++程序设计课件:第4章NEW2014_第4页
C++程序设计课件:第4章NEW2014_第5页
已阅读5页,还剩68页未读, 继续免费阅读

下载本文档

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

文档简介

1、第四章 类与对象2022/9/202类与对象 本章重点 C+中的类 对象的概念 构造函数 析构函数2022/9/203回顾:面向过程的设计方法重点:如何实现细节过程,将数据与函数分开。形式:主模块+若干个子模块(main()+子函数)。模块是按功能来分的,所以也称功能块。在C+中称为一个函数,一个函数解决一个问题,即实现一个功能或一个操作。2022/9/204结构化程序与面向对象程序的比较问题:输入圆的半径,求圆的周长和面积数据描述:半径,周长,面积均用实型数表示数据处理:输入半径 r;计算周长 = 2*r ;计算面积 = * r 2 ;输出半径,周长,面积; 2022/9/205方法一:用结

2、构化方法编程,求圆的周长和面积#includeusing namespace std;void main () double r, girth, area ; const double PI = 3.1415 ; cout r ; girth = 2 * PI * r ; area = PI * r * r ; cout radius = r endl ; cout girth = girth endl ; cout area = area endl ;2022/9/206#includeusing namespace std;const double PI = 3.1415 ;double

3、girth(double r) return 2 * PI * r ;double area(double r) return 2 * r * r ;void main () double r,r1; cin r ; cout girth = girth(r) endl ; cout area = area(r) r1 ; cout girth = girth(r1) endl ; cout area = area(r1) endl ;2022/9/207面向对象的方法目的:实现软件设计的产业化。观点:自然界是由实体(对象)所组成。程序设计方法:使用面向对象的观点来描述模仿并处理现实问题。面向

4、对象技术中的对象就是现实世界中某个具体的物理实体在计算机逻辑中的映射和体现。要求:高度概括、分类、和抽象。2022/9/208方法二:用面向对象方法编程,求圆的周长和面积class Circle double radius ; public : void Set_Radius( double r ) radius = r ; double Get_Radius( ) return radius ; double Get_Girth( ) return 2 * 3.14 * radius ; double Get_Area( ) return 3.14 * radius * radius ; ;

5、void main() Circle A, B ; A.Set_Radius( 6.23 ) ; cout A.Radius = A.Get_Radius() endl ; cout A.Girth = A.Get_Girth() endl ; cout A.Area = A.Get_Area() endl ; B.Set_Radius( 10.5 ) ; cout B.radius = B.Get_Radius() endl ; cout B.Girth= B.Get_Girth() endl ; cout B.Area = B.Get_Area() endl ; 2022/9/209方法二

6、:用面向对象方法编程,求圆的周长和面积 实例化分析圆类 数据成员 半径 成员函数 置半径值求圆的半径求周长 求面积有什么能干什么2022/9/2010方法二:用面向对象方法编程,求圆的周长和面积#includeusing namespace std;class Circle double radius ; public : void Set_Radius( double r ) radius = r ; double Get_Radius( ) return radius ; double Get_Girth( ) return 2 * 3.14 * radius ; double Get_A

7、rea( ) return 3.14 * radius * radius ; ;Circle 类定义数据成员成员函数2022/9/2011方法二:用面向对象方法编程,求圆的周长和面积void main() Circle A, B ; A.Set_Radius( 6.23 ) ; cout A.Radius = A.Get_Radius() endl ; cout A.Girth = A.Get_Girth() endl ; cout A.Area = A.Get_Area() endl ; B.Set_Radius( 10.5 ) ; cout B.radius = B.Get_Radius(

8、) endl ; cout B.Girth= B.Get_Girth() endl ; cout B.Area = B.Get_Area() endl ; 建立对象(类类型变量)通过对象调用类的成员函数编写几个计算面积的函数,分别计算圆、矩形、梯形和三角形的面积#include #include using namespace std;const double PI= 3.14159;double area(double radius=0);double area(double a, double b); double area(double a, double b, double h);do

9、uble area(double a, double b, double c, int);2022/9/2012int main() coutArea of point is area( )n;coutArea of square is area(1,1)n;coutArea of circle is area(0.5)n;coutArea of trapezium is area(1,0.5,1)n;coutArea of triangle is area(1,sqrt(1+0.5*0.5),sqrt(1+0.5*0.5),0)n;return 0;2022/9/20132022/9/201

10、4 类的引入: 类是一种数据类型。 描述客观事物必须用不同的数据类型来描述不同的方面。如商品: 商品名称(用字符串描述),该商品数量(用整型数描述),该商品单价(用浮点数描述),该商品总价(用浮点数描述)。这里用了属于三种不同数据类型的四个数据成员来描述一种商品。C+类的定义 2022/9/2015class CGoodspublic : char Name21 ; int Amount ; float Price ; float Total_value ; ; /最后的分号不可少,这是一条说明语句C+类的定义 数据类型说明符类型名访问限定符2022/9/2016访问限定符:public(公共

11、的)说明的成员能从外部进行访问。private(私有的)和protected(保护的)说明的成员不能从外部进行访问。 每种说明符可在类体中使用多次。 访问限定符的作用域是从该说明符出现开始到下一个说明符之前或类体结束之前结束。 如果在类体起始点无访问说明符,系统默认定义为私有(private)。 C+类的定义 2022/9/2017class 类名 private: 成员表1; public: 成员表2; protected: 成员表3; /注意:所有说明都以分号结束其中“class 类名”称为类头花括号中的部分称为类体,类体中定义了类成员表,包含数据和函数。C+类的定义 2022/9/201

12、8class CGoodsprivate : char Name21 ; int Amount ; float Price ; float Total_value ;public : void RegisterGoods(char,int,float); /输入数据 void CountTotal( ) ; /计算商品总价值 char * GetName() ; /读取商品名 int GetAmount( ) ; /读取商品数量 float GetPrice( ) ; /读取商品单价 float GetTotal_value( ) ; /读取商品总价值 ; C+类的定义 成员函数2022/9/

13、2019通常在类定义中,成员函数仅作声明。函数定义通常在类的说明之后进行,其格式如下:返回值类型 类名:函数名(参数表) /函数体其中运算符“:”称为作用域解析运算符,它指出该函数是属于哪一个类的成员函数。成员函数的定义 2022/9/2020类CGoods函数的定义void CGoods:RegisterGoods(char name , int amount , float price)strcpy(Name , name) ; /字符串复制函数Amount=amount ; Price=price ;void CGoods:CountTotal(void) Total_value = P

14、rice*Amount;Char * CGoods:GetName( )return Name;int CGoods:GetAmount(void)return(Amount) ;float CGoods:GetPrice(void)return(Price) ;float CGoods:GetTotal_value(void)return(Total_value) ;2022/9/2021定义对象: 对象是类的实例。定义一种数据类型只是告诉编译系统该数据类型的构造,并没有预定内存。类只是一个样板,以此样板可以在内存中开辟出同样结构的实例对象。格式如下:CGoods Car;这个定义创建了CG

15、oods类的一个对象Car,同时为它分配了属于它自己的存储块,用来存放数据和对这些数据实施操作的成员函数(代码)。对象只在定义它的域中有效。对象的创建与使用 2022/9/2022#includeusing namespace std;class Circle double radius ; public : void Set_Radius( double r ) ; double Get_Radius() ; double Get_Girth() ; double Get_Area() ; ;Circle 类定义数据成员成员函数回顾 用面向对象方法编程,求圆的周长和面积 2022/9/202

16、3 void Circle: Set_Radius( double r ) radius = r ; double Circle: Get_Radius() return radius ; double Circle: Get_Girth() return 2 * 3.14f * radius ; double Circle: Get_Area() return 3.14f * radius * radius ; 回顾 用面向对象方法编程,求圆的周长和面积 2022/9/2024void main() Circle A, B ; A.Set_Radius( 6.23 ) ; cout A.Ra

17、dius = A.Get_Radius() endl ; cout A.Girth = A.Get_Girth() endl ; cout A.Area = A.Get_Area() endl ; B.Set_Radius( 10.5 ) ; cout B.radius = B.Get_Radius() endl ; cout B.Girth= B.Get_Girth() endl ; cout B.Area = B.Get_Area() endl ; 建立对象(类类型变量)通过对象调用类的成员函数回顾 用面向对象方法编程,求圆的周长和面积 2022/9/2025/ 例 一个类的例子 复数(定

18、义和运算)1.有什么(属性)2.能干什么(方法)2022/9/2026class ComplexdoubleReal,Image ;public :SetComplex(double r, double i) Real=r; Image=i; void Print() coutReal=RealtImage=Imagen; 2022/9/2027/ 例 一个类的例子 日期(定义和运算)1.有什么(属性)2.能干什么(方法)2022/9/2028/ 例 一个类的例子class Tdate public: void Set(int m, int d, int y ) month = m ; day

19、 = d ; year = y ; int IsLeapYear() return ( year%4 = 0 & year%100 != 0 | year%400 = 0); void Print() cout year . month . day endl ; private: int month; int day; int year;void main() Tdate a ; a.Set (10, 16, 2003) ; a.Print() ;2022/9/2029数据成员多为私有的,要对它们进行初始化,必须用一个公有函数来进行。同时这个函数应该在且仅在定义对象时自动执行一次。称为:构造函

20、数4.3.1构造函数的定义与使用 4.3.2析构函数的定义与使用构造函数与析构函数 2022/9/2030构造函数由于类的封装性,不能象普通变量一样初始化。构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。在对象创建时由系统自动调用。如果程序中未声明,则系统自动产生出一个默认形式的构造函数。允许为内联函数、重载函数、带默认形参值的函数。构造函数的定义与使用2022/9/20311.函数名与类名相同。2.构造函数无函数返回类型说明。注意是什么也不写,也不可写void!3.在程序运行时,当新的对象被建立,该对象所属的类的构造函数自动被调用,在该对象生存期中也只

21、调用这一次。4.构造函数可以重载。严格地讲,说明中可以有多个构造函数,它们由不同的参数表区分,系统在自动调用时按一般函数重载的规则选一个执行。构造函数的特征2022/9/20325.构造函数可以在类中定义,也可以在类外定义。 6. 如果类说明中没有给出构造函数,则C+编译器自动给出一个默认的构造函数: 类名( ) 但只要我们定义了一个构造函数,系统就不会自动生成默认的构造函数。 只要构造函数是无参的或各参数均有默认值的,C+编译器都认为是默认的构造函数,并且默认的构造函数只能有一个 。 构造函数的特征2022/9/2033析构函数特征: 当一个对象的生命周期结束时,C+会自动调用析构函数(de

22、structor)对该对象并进行善后工作,1.构函数名与类名相同,但在前面加上字符,如CGoods()。2.析构函数无函数返回类型,与构造函数在这方面是一样的。但析构函数不带任何参数。3. 一个类有一个也只有一个析构函数,这与构造函数不同。析构函数可以默认。4. 对象注销时,系统自动调用析构函数。析构函数的定义与使用2022/9/2034#include using namespace std;class Q int x,y; public: Q(int a=0,int b=0) cout“调用了构造函数”endl; x=a;y=b; void P(void) coutxtyn; Q() co

23、ut“调用了析构函数!”n; void main(void) Q q(50,100); q.P(); cout“退出主函数!”n”;输出:调用了构造函数50100退出主函数!调用了析构函数!构造函数与析构函数举例 2022/9/2035【例4.2】矩形类。要确定一个矩形(四边都是水平或垂直方向,不能倾斜),只要确定其左上角和右下角的x和y坐标即可,即左右上下四个边界值。class Rectangle int left, top, right, bottom;public:Rectangle(int =0, int =0, int =0, int =0); /默认构造函数必须在此指定默认实参 R

24、ectangle(); /析构函数,在此函数体为空void Assign(int , int , int , int );void SetLeft(int t) left = t; void SetRight( int t ) right = t;void SetTop( int t ) top = t;void SetBottom( int t ) bottom = t;void Show(); 2022/9/2036#include using namespace std;Rectangle:Rectangle(int l , int t, int r, int b) left = l;

25、top = t; right = r; bottom = b; void Rectangle:Assign(int l, int t, int r, int b) left = l; top = t; right = r; bottom = b; void Rectangle:Show() cout”left-top point is (”left”,”top ”)”n; cout”right-bottom point is (”right”,” bottom”)”n; 2022/9/2037#include using namespace std;int main()Rectangle re

26、ct; rect.Show();rect.Assign(100,200,300,400);rect.Show();Rectangle rect1(0,0,200,200);rect1.Show();Rectangle rect2(rect1);rect2.Show();return 0;2022/9/2038引用的导入: 参数传递的传值方式在函数域中为参数重新分配内存,而把实参的数值传递到新分配的内存中。它的优点是有效避免函数的副作用。 问题:如果要求改变实参的值,怎么办呢?如果实参是一个复杂的对象,重新分配内存会引起程序执行效率大大下降,怎么办呢? 有一种导出型数据类型引用可以解决上面的难题

27、。引用又称别名。引用2022/9/2039引用的定义: 引用是给一个已经定义的变量重新起一个别名,而不是定义一个新的变量,定义的格式为:类型 &引用变量名=已定义过的变量名;例如:double number ;double &newnum=number ;newnum是新定义的引用类型变量,它是变量number的别名。 引用主要用于函数之间的数据传递。引用2022/9/2040Xyd1d2temp1.4142.7181.4142.7181.414void swap(double & d1, double & d2) double temp ; temp=d1 ; d1=d2 ; d2=temp

28、 ; int main(void) double x , y ; cout请输入x和y的值 xy ; swap(x,y) ; coutx=xt y=yn; return 0; 【例4.3】引用作为函数的参数。采用引用调用时,将对实参进行操作。2022/9/2041Int main( ) int a10;Int i,max,min;For(i=0;iai;Max_min(a,max,min);Coutmaxmin;Return 0;2022/9/2042同一个类的对象在内存中有完全相同的结构,如果作为一个整体进行复制是完全可行的。这个复制过程只需要复制数据成员,而函数成员是共用的(只有一份代码)

29、。在建立对象时可用同一类的另一个对象来初始化该对象,这时所用的构造函数称为复制(拷贝)构造函数。复制(拷贝)构造函数2022/9/2043 实例:CGood Car1(“夏利2000”,30,98000.00);/调用三个参数的构造函数CGood Car2= Car1; /调用复制构造函数CGood Car3 ( Car1); /调用复制构造函数,Car1为实参这样三个对象的初始化结果完全一样。复制构造函数2022/9/2044复制构造函数是一种特殊的构造函数,其形参为本类的对象引用。作用:使用一个对象(参数指定的对象),去初始化一个正在被建立的同类型对象。class 类名 public :

30、类名(形参);/构造函数 类名(类名 &对象名);/复制构造函数 .;类名: 类名(类名 &对象名)/复制构造函数的实现 函数体 复制构造函数2022/9/2045class Point public: Point(int xx=0,int yy=0)X=xx; Y=yy; Point(Point& p); int GetX() return X; int GetY() return Y; private: int X,Y;Point:Point (Point &p) X=p.X; Y=p.Y; cout“复制构造函数被调用endl;复制构造函数举例2022/9/20461. 复制构造函数的参

31、数必须采用引用。2. 系统会自动提供称为默认的按成员语义支持的复制构造函数,亦称为默认的按成员初始化。按成员作复制是通过依次复制每个数据成员实现的。复制构造函数的特征2022/9/2047(1)当用类的一个对象去初始化该类的另一个对象时系统自动调用复制构造函数实现拷贝赋值。void main(void) Point A(1,2); Point B(A); /复制构造函数被调用coutB.GetX()endl;复制构造函数调用的三种情况2022/9/2048(2)若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用复制构造函数。例如:void fun1(Point p) coutp.G

32、etX()endl; void main() Point A(1,2); fun1(A); /调用复制构造函数 复制构造函数调用的三种情况2022/9/2049(3)当函数的返回值是类对象时,系统自动调用复制构造函数。例如:Point fun2() Point A(1,2); return A; /调用复制构造函数void main() Point B; B=fun2(); 复制构造函数调用的三种情况2022/9/2050聚合(aggregation ) : 类中的成员,除了成员数据和成员函数外,还有成员对象,即用其他类的对象作为类的成员。使用成员对象的技术称为聚合。成员对象是实体,系统不仅为

33、它分配内存,而且要进行初始化。成员对象与构造函数2022/9/2051原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化。声明形式:类名:类名(对象成员所需的形参,本类成员形参) :对象1(参数),对象2(参数),. 本类初始化 含对象成员的构造函数2022/9/2052class Point private: float x,y; /点的坐标 public: Point(float xx,float yy); /构造函数 float GetX(void) return x; /取X坐标 float GetY(void) return y;/取Y坐标;类组合构造函数实例20

34、22/9/2053class Line private: /线段的两个端点 Point p1,p2; double s; public: /构造函数 Line(Point a,Point b); /如何写? ;类组合构造函数实例2022/9/2054Line:Line(Point a,Point b):p1(a),p2(b) double x=double(p1.GetX()-p2.GetX(); double y=double(p1.GetY()-p2.GetY(); double dist=sqrt(x*x+y*y); s=dist; 类组合构造函数实例2022/9/2055 含对象成员的

35、析构函数: 因为析构函数没有参数,所以包含成员对象的类的析构函数形式上并无特殊之处。但是撤销该类对象时,会首先调用自己的析构函数,再调用成员对象的析构函数,调用次序与初始化时的次序相反。成员对象与构造函数2022/9/2056构造函数另一格式:对于不含对象成员的类对象的初始化,也可以套用以上的格式,把部分需要直接赋初值的变量初始化写在冒号的右边:类名:构造函数名(参数表):变量1(初值1),变量n(初值n)当然也可以把一部分变量重新放回花括号中的函数体。冒号以后部分实际是函数体的一部分,所以在构造函数的声明中,冒号及冒号以后部分必须略去。成员对象与构造函数2022/9/2057构造函数和析构函

36、数的调用规则:1. 对全局定义的对象,当程序进入入口函数main之前对象就已经定义,整个程序结束时调用析构函数。2. 对于局部定义的对象,每当程序控制流到达该对象定义处时,调用构造函数。当程序控制走出该局部域时,则调用析构函数。3. 对于静态局部定义的对象,在程序控制首次到达该对象定义处时,调用构造函数。当整个程序结束时调用析构函数。成员对象与构造函数2022/9/2058运算符重载的概念:运算符的重载是特殊的函数重载,必须定义一个函数,并通知C+编译器,当遇到该重载的运算符时调用此函数。这个函数叫做运算符重载函数,通常为类的成员函数。运算符重载函数定义:返回值类型 类名:operator重载

37、的运算符(参数表) operator是关键字,它与重载的运算符一起构成函数名。因函数名的特殊性,C+编译器可以将这类函数识别出来。运算符的重载2022/9/2059运算符重载是对已有的运算符赋予多重含义必要性C+中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)实现机制将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。编译系统对重载运算符的选择,遵循函数重载的选择原则。运算符重载的实质2022/9/2060重载为类成员函数。运算符重载的形式重载为类成员函数时 参数个数=原操作数个数-1(后置+、-除外)2022/9/2061 运算符函数是一

38、种特殊的成员函数或友员函数 成员函数的语法形式为:类型 类名 : operator op ( 参数表 ) / 相对于该类定义的操作运算符要求的操作数 一个运算符被重载后,原有意义没有失去,只是定义了相对一特定类的一个新运算符2022/9/2062class ComplexdoubleReal,Image ;public :Complex(double r=0.0, double i=0.0):Real(r),Image(i) Complex(Complex &com)Real=com.Real ; Image=com.Image ; void Print()coutReal=RealtImag

39、e=Imagen; Complex operator+(Complex); /重载+运算符函数Complex operator+(double); /重载+运算符函数 ; 【例4.8】复数类,应用它进行复数运算2022/9/2063Complex Complex:operator+(double d) /重载+ return Complex(Real+d , Image); Complex Complex:operator+(Complex c)/重载+ Complex Temp(Real+c.Real , Image+c.Image) ;return Temp ; 2022/9/2064int main(void)Complex c1(1.0,1.0) , c2(2.0,2.0) , c3(4.0,4.0) , c;double d=0.5 ;c1.Print();c=c2+c3 ; c.Print() ;c=c+d ; c.Print() ; /可用0.5代替dreturn 0; 2022/9/2065运算符的重载引用作为参数: Complex Complex:operator+(const Complex &c) return Complex(r

温馨提示

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

评论

0/150

提交评论