C++构造与析构函数.ppt
《C++构造与析构函数.ppt》由会员分享,可在线阅读,更多相关《C++构造与析构函数.ppt(46页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第4讲 构造函数与析构函数u构造函数定义构造函数定义构造函数具有构造函数的类如何创建对象具有构造函数的类如何创建对象u析构函数u复制构造函数1 构造函数构造函数constructor(对对象的初始化象的初始化)u构造函数是每个类都具有的一种特殊函数,有以下三特点:构造函数是每个类都具有的一种特殊函数,有以下三特点:构造函数的名字必须与类名相同;构造函数的名字必须与类名相同;构造函数没有函数构造函数没有函数(返回返回)类型类型不是不是void;在创建对象时,构造函数才被系统自动调用,在创建对象时,构造函数才被系统自动调用,不能被用户显式调用。不能被用户显式调用。Circle类增加构造函数类增加构
2、造函数class Circleprivate:double radius;public:Circle(double);double getArea();double getRadius();void setRadius(double);Circle:Circle(double newRadius)radius=newRadius;1-1 构造函数构造函数Constructor(1)默认构造函数默认构造函数default constructoru若若在在类类中中没没有有显显式式地地定定义义构构造造函函数数,则则编编译译器器会会自自动动提提供供一一个个不不带带参参数数、函函数数体体为为空空(即即不
3、不做做任任何何事事情情)的的默默认认构构造函数造函数。:()()u此此时时,在在程程序序中中创创建建一一个个对对象象时时,编编译译器器调调用用默默认认构构造造函函数来初始化该对象。数来初始化该对象。u若若程程序序中中有有自自定定义义的的构构造造函函数数,则则编编译译器器就就不不会会再再生生成成默默认认构构造造函函数数(因因此此不不能能再再使使用用),此此时时必必须须使使用用自自定定义义的构造函数创建对象。的构造函数创建对象。(2)(2)自定义构造函数自定义构造函数u若类中显式自定义若类中显式自定义了构造函数,此时系了构造函数,此时系统将不再提供默认的统将不再提供默认的无参构造函数。无参构造函数
4、。class Cylinderdouble r,h;public:Cylinder(double,double);void setv(double,double);void getv(double&,double&);double surface();double volume();Cylinder:Cylinder(double rr,double hh)r=rr;h=hh;void Cylinder:setv(double rr,double hh)r=rr;h=hh;void Cylinder:getv(double&rr,double&hh)rr=r;hh=h;double Cylin
5、der:surface()return 3.14*r*r*2+2*3.14*r*h;double Cylinder:volume()return 3.14*r*r*h;Date:Date(int y=1900,int m=1,int d=1)/默认参数默认参数year=y;month=m;day=d;注:若有默认参数又有重载注:若有默认参数又有重载函数时,可能出现二义性。函数时,可能出现二义性。u构造函数可以重载,构造函数可以重载,可带默认的参数值,可内联可带默认的参数值,可内联.Date:Date()/无参无参重载重载year=1900;month=1;day=1;Date:Date(int
6、 y,int m,int d)year=y;month=m;day=d;构造函数构造函数的说明的说明u创建对象时系统创建对象时系统1)1)为对象的数据成员分配存储空间,为对象的数据成员分配存储空间,2)2)调用构造函数调用构造函数(可以是默认构造函数可以是默认构造函数),执行构造函,执行构造函数体中的代码。数体中的代码。u由于由于构造函数在创建新对象时被系统自动调用,而且构造函数在创建新对象时被系统自动调用,而且类的数据成员多为类的数据成员多为privateprivate,因此,因此可在构造函数中进行可在构造函数中进行数据成员的初始化数据成员的初始化,将构造函数的参数值赋给对象的,将构造函数的
7、参数值赋给对象的数据成员,从而在创建对象时进行初始化。数据成员,从而在创建对象时进行初始化。u每个类都具有构造函数每个类都具有构造函数,没有定义构造函数的类,系,没有定义构造函数的类,系统自动提供默认构造函数统自动提供默认构造函数(什么都不做,空函数什么都不做,空函数)u警告:一个常见的错误是在构造函数前放置一个警告:一个常见的错误是在构造函数前放置一个void。1-2 因为创建对象时系统要调用构造函数,则必须根据构因为创建对象时系统要调用构造函数,则必须根据构造函数形式创建对象造函数形式创建对象(创建对象时为构造函数提供实参创建对象时为构造函数提供实参)(1)使用不带参数的构造函数创建对象时
8、,对象的创建形式为:使用不带参数的构造函数创建对象时,对象的创建形式为:类名类名 对象名;或:对象名;或:类名类名 对象名对象名=类名类名();如:如:Circle cir1;或:或:Circle cir1=Circle();u注意:注意:Circle a();/错,错,声明了一个函数名为声明了一个函数名为a,返回值为,返回值为Circle类的对象。类的对象。#includevoid main()Circle cir1;cout cir1.getRadius();coutcir1.getArea();class Circleprivate:double radius;public:Circle
9、();double getArea();double getRadius();void setRadius(double);Circle:Circle()radius=1;注:若不定义构造函数,则使用系统注:若不定义构造函数,则使用系统提供的默认构造函数创建对象,此时提供的默认构造函数创建对象,此时对象的数据成员的值均为随机值。对象的数据成员的值均为随机值。Circle类定义无参构造函数类定义无参构造函数_单文件单文件#includevoid main()Circle cir1;cout cir1.getRadius();coutcir1.getArea();class Circlepriva
10、te:double radius;public:Circle();double getArea();double getRadius();void setRadius(double);Circle:Circle()radius=1;double Circle:getArea()return radius*radius*3.14159;double Circle:getRadius()return radius;void Circle:setRadius(double r)radius=r;Circle类定义无参构造函数类定义无参构造函数_多文件多文件#include circle.h#incl
11、udevoid main()Circle cir1;cout cir1.getRadius();coutcir1.getArea();/*class declaration,circle.h*/class Circleprivate:double radius;public:Circle();double getArea();double getRadius();void setRadius(double);/circle.cpp#include circle.hCircle:Circle()radius=1;double Circle:getArea()return radius*radiu
12、s*3.14159;double Circle:getRadius()return radius;void Circle:setRadius(double r)radius=r;使用带参数构造函数创建对象使用带参数构造函数创建对象(必须为构造函数提供实参必须为构造函数提供实参)/*class declaration,circle.h*/class Circleprivate:double radius;public:Circle(double);double getArea();double getRadius();void setRadius(double);Circle:Circle(do
13、uble newRadius)radius=newRadius;#include circle.h#includevoid main()Circle cir2(2);coutcir2.getRadius()endl;coutcir2.getArea()endl;u对象的创建形式为:对象的创建形式为:类名类名 对象名对象名(初始化参数表初始化参数表);或:或:类名类名 对象名对象名=类名类名(初始化参数表初始化参数表);注:由于类中只定义了带参构造函数,则系统不会再提供默注:由于类中只定义了带参构造函数,则系统不会再提供默认构造函数,因此不能再使用第认构造函数,因此不能再使用第1种方式创建对象。
14、种方式创建对象。Circle cir1;/wrongError:no appropriate default constructor availableCircle类定义有参构造函数类定义有参构造函数_多文件多文件#include circle.h#includevoid main()Circle cir2(2);cout cir1.getRadius();coutcir1.getArea();/*class declaration,circle.h*/class Circleprivate:double radius;public:Circle(double);double getArea(
15、);double getRadius();void setRadius(double);/circle.cpp#include circle.hCircle:Circle(double newRadius)radius=newRadius;double Circle:getArea()return radius*radius*3.14159;double Circle:getRadius()return radius;void Circle:setRadius(double r)radius=r;重载构造函数重载构造函数u 此时可根据构造函数的形式采用多种形式创建不同的对象。此时可根据构造函数
16、的形式采用多种形式创建不同的对象。class Circleprivate:double radius;public:Circle();Circle(double);double getArea();double getRadius();void setRadius(double);#includevoid main()Circle cir1;Circle cir2(2);coutcir1.getRadius()endl;coutcir1.getArea()endl;coutcir2.getRadius()endl;coutcir2.getArea()endl;Circle:Circle()ra
17、dius=1;Circle:Circle(double newRadius)radius=newRadius;Circle类定义重载构造函数类定义重载构造函数_多文件多文件#include circle.h#includevoid main()Circle cir1,cir2(2);coutcir1.getRadius()endl;coutcir1.getArea()endl;coutcir2.getRadius()endl;coutcir2.getArea()endl;/*class declaration,circle.h*/class Circleprivate:double radiu
18、s;public:Circle();Circle(double);double getArea();double getRadius();void setRadius(double);/circle.cpp#include circle.hCircle:Circle()radius=1;Circle:Circle(double newRadius)radius=newRadius;double Circle:getArea()return radius*radius*3.14159;double Circle:getRadius()return radius;void Circle:setRa
19、dius(double r)radius=r;使用带默认参数的构造函数使用带默认参数的构造函数/circle.hclass Circleprivate:double radius;public:Circle(double=1);double getArea();double getRadius();void setRadius(double);/testCircle.cpp#include circle.h#includevoid main()Circle cir1;Circle cir2(2);coutcir1.getRadius()endl;coutcir1.getArea()endl;c
20、outcir2.getRadius()endl;coutcir2.getArea()endl;Circle cir2=Circle(2);Circle*p=new Circle(3);delete p;Circle:Circle(double newRadius)radius=newRadius;#include circle.h#includevoid main()Circle cir1,cir2(2);coutcir1.getRadius()endl;coutcir1.getArea()endl;coutcir2.getRadius()endl;coutcir2.getArea()endl
21、;/*class declaration,circle.h*/class Circleprivate:double radius;public:Circle(double=1);double getArea();double getRadius();void setRadius(double);/circle.cpp#include circle.hCircle:Circle(double newRadius)radius=newRadius;double Circle:getArea()return radius*radius*3.14159;double Circle:getRadius(
22、)return radius;void Circle:setRadius(double r)radius=r;Circle类定义带默认参数构造函数类定义带默认参数构造函数_多文件多文件 注意注意:若在类中同时定义了带默认参数的构造函数与无参构造:若在类中同时定义了带默认参数的构造函数与无参构造函数,要注意避免出现歧义性函数,要注意避免出现歧义性(二义性二义性)而产生编译错误。而产生编译错误。warning C4520:Circle:multiple default constructors specifiederror C2668:Circle:Circle:ambiguous call to
23、 overloaded functionclass Circleprivate:double radius;public:Circle();/无参无参Circle(double=1)/带默认参数带默认参数double getArea();double getRadius();void setRadius(double);errorclass Cylinderdouble r,h;public:Cylinder();Cylinder(double,double=5);void setv(double,double);void getv(double&,double&);double surfac
24、e();double volume();Cylinder:Cylinder()r=2;h=2;Cylinder:Cylinder(double rr,double hh)r=rr;h=hh;正确正确构造函数的另一种写法:构造函数初始化列表构造函数的另一种写法:构造函数初始化列表构造函数主要用来对类的数据成员进行初始化,即将构构造函数主要用来对类的数据成员进行初始化,即将构造函数的参数值传送给数据成员,可将构造函数定义为造函数的参数值传送给数据成员,可将构造函数定义为 :数据成员名数据成员名(参数名参数名)Circle:Circle(double r):radius(r)Date:Date(in
25、t y,int m,int d):year(y),month(m),day(d)函数体中可以有语句,进行其它的初始化操作u若类中没有定义任何形式的构造函数,系统自动生成若类中没有定义任何形式的构造函数,系统自动生成默认的无参构造函数。默认的无参构造函数。u若类中定义了构造函数,则编译器就不会再提供默认若类中定义了构造函数,则编译器就不会再提供默认的无参构造函数,必须使用自定义的构造函数创建对象的无参构造函数,必须使用自定义的构造函数创建对象,否则出现语法错误。,否则出现语法错误。u若要使用多种形式的构造函数创建对象,则必须:若要使用多种形式的构造函数创建对象,则必须:重载构造函数,即在类定义中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 构造 函数
限制150内