构造函数析构函数带参数的构造函数默认参数的构造函数课件_第1页
构造函数析构函数带参数的构造函数默认参数的构造函数课件_第2页
构造函数析构函数带参数的构造函数默认参数的构造函数课件_第3页
构造函数析构函数带参数的构造函数默认参数的构造函数课件_第4页
构造函数析构函数带参数的构造函数默认参数的构造函数课件_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

第四章对象生灭构造函数析构函数带参数的构造函数默认参数的构造函数构造函数的重载类成员对象构造与析构的顺序第四章对象生灭构造函数11.构造函数构造函数是一种用于创建对象的特殊的成员函数:1)当创建对象时,系统自动调用构造函数,不能直接调用;2)构造函数名与类名相同;3)一个类可以拥有多个构造函数(重载);4)构造函数可以有任意类型的参数,但不能具有返回类型。构造函数的作用是:为对象分配空间;对数据成员赋初值;请求其他资源。如果一个类没有定义构造函数,编译器会自动生成一个不带参数的默认构造函数,其格式如下: <类名>::<默认构造函数名>() { }//此构造函数只创建对象,不做初始化1.构造函数构造函数是一种用于创建对象的特殊的成员函数:2#include<iostream>using

namespace

std;classPoint{private:intx,y;public:

Point();//构造函数声明 voidprint(){ cout<<"x="<<x<<";"<<"y="<<y<<endl; }};Point::Point()//构造函数定义{ x=0;y=1;cout<<"Constructiscalled!"<<endl;}voidmain(){ Pointp1;//定义对象并自动调用构造函数 p1.print();}Constructiscalled!x=0;y=101对象p1#include<iostream>Constructis3析构函数是一种用于销毁对象的特殊的成员函数:1)当一个对象作用域结束时,系统自动调用析构函数;2)析构函数名字为符号“~”加类名;3)析构函数没有参数和返回值。4)一个类中只能定义一个析构函数,析构函数不能重载。析构函数的作用是进行清除对象,释放内存等。如同默认构造函数一样,如果一个类没有定义析构函数,编译器会自动生成一个默认析构函数,其格式如下: <类名>::~<默认析构函数名>() { } 默认析构函数是一个空函数。2.析构函数析构函数是一种用于销毁对象的特殊的成员函数:2.析构函数4#include<iostream>using

namespace

std;classPoint{private:intx,y;public: Point();//构造函数声明 ~Point();//析构函数声明

voidprint(){ cout<<"x="<<x<<";" <<"y="<<y<<endl; }};Point::Point()//构造函数定义{ x=0;y=1; cout<<"Constructiscalled!" <<endl;}Point::~Point(){//析构函数定义cout<<"Destructiscalled!"<<endl;}voidfun(){ cout<<"对象p1:";

Pointp1;

p1.print();}voidmain(){ fun(); cout<<"对象p2:";

Pointp2; p2.print();}01对象p101对象p2对象p1:Constructiscalled!x=0;y=1Destructiscalled!对象p2:Constructiscalled!x=0;y=1Destructiscalled!#include<iostream>Point::~Poin5 不带参数的构造函数,其对象的初始化是固定的。要想在建立对象时,传递一定的数据来进行初始化就要引入带参数的构造函数了。如下例:#include<iostream>using

namespace

std;classPoint{private:intx,y;public:Point(int,int);//声明带参数的构造函数 voidprint(){cout<<"x="<<x<<";"<<"y="<<y<<endl;}};3.带参数的构造函数3.带参数的构造函数6Point::Point(intvx,intvy){ x=vx;y=vy;//用传递来的参数对私有变量x,y赋初值 cout<<"Constructiscalled!"<<endl;}voidmain(){Pointp1(10,10);//定义对象p1,并给构造函数传递实参p1.print();}Constructiscalled!x=10;y=101010对象p1Point::Point(intvx,intvy){C7在构造函数中允许指定函数参数的默认值,这些默认值在函数调用者不确定参数时可以作为参数来使用。对于所有参数都定义了默认值的构造函数,当它被调用时,允许改变传递参数的个数。如下例:#include<iostream>using

namespace

std;classPoint{private:intx,y;public:Point(intvx=0,intvy=0);//声明缺省参数的构造函数voidprint(){cout<<"x="<<x<<";"<<"y="<<y<<endl;}};4.默认参数的构造函数4.默认参数的构造函数8Point::Point(intvx,intvy){x=vx;y=vy;//用传递来的参数对私有变量x,y赋初值cout<<"Constructiscalled!"<<endl;}voidmain(){Pointp1(10,10);//传两参数p1.print();Pointp2;//不传参数取缺省值p2.print();Pointp3(5);//传一个参数,第二个用缺省值p3.print();}Constructiscalled!x=10;y=10Constructiscalled!x=0;y=0Constructiscalled!x=5;y=0

1010对象p100对象p250对象p3Point::Point(intvx,intvy){9一个类中可以具有几个构造函数,每个都去适合不同的场合,这些构造函数靠所带的参数类型或个数的不同来区分,实际上是对构造函数的重载。如下例:#include<iostream>using

namespace

std;classPoint{private:intx,y;public: Point();//声明无参数的构造函数 Point(intvy);//声明带1个参数的构造函数Point(intvx,intvy);//声明带2个参数的构造函数 voidprint(){cout<<"x="<<x<<";"<<"y="<<y<<endl; }};5.构造函数的重载一个类中可以具有几个构造函数,每个都去适合不同的10Point::Point(){x=0;y=0;cout<<"Construct0iscalled!"<<endl;}Point::Point(intvy){ x=1;y=vy;cout<<"Construct1iscalled!"<<endl;}Point::Point(intvx,intvy){ x=vx;y=vy;cout<<"Construct2iscalled!"<<endl;}voidmain(){ Pointp1;p1.print(); Pointp2(5);p2.print(); Pointp3(10,10);p3.print();}Construct0iscalled!x=0;y=0Construct1iscalled!x=1;y=5Construct2iscalled!x=10;y=10

00对象p115对象p21010对象p3Point::Point()Construct0isca11二义性#include<iostream>using

namespace

std;classPoint{private:intx,y;public:

Point();//声明无参数的构造函数//声明带2个参数的构造函数

Point(intvx=2,intvy=2);voidprint(){cout<<"x="<<x<<";"<<"y="<<y<<endl;}};对象p在定义过程中,没有传递参数,此时有两种可能:第一是在创建对象时调用不带参数的构造函数Point()来对对象初始化;另一种是在创建对象时调用带缺省参数的构造函数Point(intvx=2,intvy=2)来初始化对象。这两种情况的存在使系统无法确定到底调用哪个构造函数,这就出现了二义性。编译将不能通过。Point::Point(){x=0;y=0;cout<<"Construct0iscalled!"<<endl;}Point::Point(intvx,intvy){//用传递来的参数对私有变量x,y赋初值x=vx;y=vy; cout<<"Construct2iscalled!"<<endl;}voidmain(){

Pointp;p.print();}二义性Point::Point(){126.类成员类成员:描述的是一个类内嵌其他类的对象作为成员的情况,它们之间的关系是一种包含与被包含的关系,常被称作组合关系。当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌对象也将被自动创建。在创建对象时,既要对本类的数据成员进行初始化,又要对内嵌对象成员进行初始化。6.类成员类成员:13#include<iostream>using

namespace

std;classPoint{

intx;

inty;public: Point(); ~Point(){cout<<"析构点:"<<x<<"-"<<y<<endl;}

voidprint();}; Point::Point(){ x=10;y=12; cout<<"构造点:"<<10<<"-"<<12<<";";}voidPoint::print(){ cout<<"坐标:"<<x<<"-"<<y<<endl;}Circle的构造函数默认调用Point的无参构造函数#include<iostream>Circle的构造函数默14classCircle{ Pointcentre;

doubleradius;public: Circle(double); ~Circle(){cout<<"析构圆:析构半径"<<radius<<"\n";}

voidprint();};Circle::Circle(doublevr){ cout<<"\n构造圆:构造半径"<<vr<<"\n"; radius=vr;}voidCircle::print(){ centre.print(); cout<<"半径="<<radius<<endl;}voidmain(){ Circlec(4.3); c.print();}构造点:10-12;构造圆:构造半径4.3坐标:10-12半径=4.3析构圆:析构半径4.3析构点:10-121020对象c类成员4.3classCircle{1020对象c类成员4.315#include<iostream>using

namespace

std;classPoint{

intx;

inty;public: Point(intvx=0,intvy=0); ~Point(){cout<<"析构点:"<<x<<"-"<<y<<endl;}

voidprint();}; Point::Point(intvx,intvy){ cout<<"构造点:"<<vx<<"-"<<vy<<";"; x=vx;y=vy;}voidPoint::print(){ cout<<"坐标:"<<x<<"-"<<y<<endl;}初始化的困惑#include<iostream>初始化的困惑16classCircle{ Pointcentre;doubleradius;public: Circle(int,int,double); ~Circle(){cout<<"析构圆:析构半径"<<radius<<"\n";}

voidprint();};Circle::Circle(intvvx,intvvy,doublevr){ cout<<"\n构造圆:构造半径"<<vr<<"\n"; radius=vr; Pointcentre(vvx,vvy);}voidCircle::print(){ centre.print(); cout<<"半径="<<radius<<endl;}voidmain(){ Circlec(2,2,4.3);c.print();}构造点:0-0;构造圆:构造半径4.3构造点:2-2;析构点:2-2坐标:0-0半径=4.3析构圆:析构半径4.3析构点:0-022对象centre00对象c类成员4.3classCircle{构造点:0-0;22对象centr17#include<iostream>using

namespace

std;classPoint{

intx;

inty;public: Point(intvx=0,intvy=0); ~Point(){cout<<"析构点:"<<x<<"-"<<y<<endl;}

voidprint();}; Point::Point(intvx,intvy){ cout<<"构造点:"<<vx<<"-"<<vy<<";"; x=vx;y=vy;}voidPoint::print(){ cout<<"坐标:"<<x<<"-"<<y<<endl;}构造类成员的机制#include<iostream>构造类成员的机制18classCircle{ Pointcentre;doubleradius;public: Circle(int,int,double); ~Circle(){cout<<"析构圆:析构半径"<<radius<<"\n";}

voidprint();};Circle::Circle(intvvx,intvvy,doublevr):centre(vvx,vvy){ cout<<"\n构造圆:构造半径"<<vr<<";"; radius=vr;}voidCircle::print(){ centre.print(); cout<<"半径="<<radius<<endl;}voidmain(){ Circlec(2,2,4.3);c.print();}构造点:2-2;构造圆:构造半径4.3;坐标:2-2半径=4.3析构圆:析构半径4.3析构点:2-222对象c类成员4.3classCircle{构造点:2-2;22对象c类成员419冒号语法初始化常量成员和引用数据成员classSillyClass{public: SillyClass(int&i):ten(10),refI(i){}protected:

const

intten;

int&refI;};初始化一般数据成员classSillyClass{public: SillyClass(intvd){d=vd;}protected:

intd;};

classSillyClass{public: SillyClass(intvd):d(vd){}protected:

intd;};初始化一般数据成员207.对象构造与析构的顺序局部对象,以声明的顺序构造,析构的顺序与构造顺序相反静态对象只被构造一次,在程序运行结束时析构。所有全局对象在主函数main()之前被构造,在程序运行结束时析构classA{intx;public: A(intvx){x=vx;cout<<x<<"A构造";} ~A(){cout<<x<<"~A析构";}};classB{inty;public: B(intvy){y=vy;cout<<y<<"B构造";} ~B(){cout<<y<<"~B析构";}};classC{intz;public: C(intvz){z=vz;cout<<z<<"C构造";} ~C(){cout<<z<<"~C析构";}};7.对象构造与析构的顺序局部对象,以声明的顺序构造,析构的21voidfunc(inti){ cout<<"\nfunc:"; Aa(i);

staticBb(i+1); Cc(i+2);}Aa(100);voidmain(){ cout<<"\nmain:"; Aa(1); Bb(2); Cc(3); func(4);func(7); cout<<"\nmain:";}100A构造main:1A构造2B构造3C构造func:4A构造5B构造6C构造6~C析构4~A析构func:7A构造9C构造9~C析构7~A析构main:3~C析构2~B析构1~A析构5~B析构100~A析构voidfunc(inti){100A构造22成员对象的构造顺序按类定义的出现顺序,最后执行自身构造函数:析构的顺序与构造顺序相反classA{

intx;public: A(intvx){ x=vx; cout<<"A:"<<x<<"\n"; } ~A(){cout<<"~A:"<<x<<"\n";}};classB{

inty;public: B(intvy){ y=vy; cout<<"B:"<<y<<"\n"; } ~B(){cout<<"~B:"<<y<<"\n";}};成员对象的构造顺序按类定义的出现顺序,最后执行自身构造函数:23classC{ Aa; Bb;public: C(intvx,intvy):a(vx),b(vy) { cout<<"C:\n"; } ~C(){cout<<"~C:\n";}};voidmain(){ Cc(1,3);}A:1B:3C:~C:~B:3~A:1classC{A:124第四章对象生灭构造函数析构函数带参数的构造函数默认参数的构造函数构造函数的重载类成员对象构造与析构的顺序第四章对象生灭构造函数251.构造函数构造函数是一种用于创建对象的特殊的成员函数:1)当创建对象时,系统自动调用构造函数,不能直接调用;2)构造函数名与类名相同;3)一个类可以拥有多个构造函数(重载);4)构造函数可以有任意类型的参数,但不能具有返回类型。构造函数的作用是:为对象分配空间;对数据成员赋初值;请求其他资源。如果一个类没有定义构造函数,编译器会自动生成一个不带参数的默认构造函数,其格式如下: <类名>::<默认构造函数名>() { }//此构造函数只创建对象,不做初始化1.构造函数构造函数是一种用于创建对象的特殊的成员函数:26#include<iostream>using

namespace

std;classPoint{private:intx,y;public:

Point();//构造函数声明 voidprint(){ cout<<"x="<<x<<";"<<"y="<<y<<endl; }};Point::Point()//构造函数定义{ x=0;y=1;cout<<"Constructiscalled!"<<endl;}voidmain(){ Pointp1;//定义对象并自动调用构造函数 p1.print();}Constructiscalled!x=0;y=101对象p1#include<iostream>Constructis27析构函数是一种用于销毁对象的特殊的成员函数:1)当一个对象作用域结束时,系统自动调用析构函数;2)析构函数名字为符号“~”加类名;3)析构函数没有参数和返回值。4)一个类中只能定义一个析构函数,析构函数不能重载。析构函数的作用是进行清除对象,释放内存等。如同默认构造函数一样,如果一个类没有定义析构函数,编译器会自动生成一个默认析构函数,其格式如下: <类名>::~<默认析构函数名>() { } 默认析构函数是一个空函数。2.析构函数析构函数是一种用于销毁对象的特殊的成员函数:2.析构函数28#include<iostream>using

namespace

std;classPoint{private:intx,y;public: Point();//构造函数声明 ~Point();//析构函数声明

voidprint(){ cout<<"x="<<x<<";" <<"y="<<y<<endl; }};Point::Point()//构造函数定义{ x=0;y=1; cout<<"Constructiscalled!" <<endl;}Point::~Point(){//析构函数定义cout<<"Destructiscalled!"<<endl;}voidfun(){ cout<<"对象p1:";

Pointp1;

p1.print();}voidmain(){ fun(); cout<<"对象p2:";

Pointp2; p2.print();}01对象p101对象p2对象p1:Constructiscalled!x=0;y=1Destructiscalled!对象p2:Constructiscalled!x=0;y=1Destructiscalled!#include<iostream>Point::~Poin29 不带参数的构造函数,其对象的初始化是固定的。要想在建立对象时,传递一定的数据来进行初始化就要引入带参数的构造函数了。如下例:#include<iostream>using

namespace

std;classPoint{private:intx,y;public:Point(int,int);//声明带参数的构造函数 voidprint(){cout<<"x="<<x<<";"<<"y="<<y<<endl;}};3.带参数的构造函数3.带参数的构造函数30Point::Point(intvx,intvy){ x=vx;y=vy;//用传递来的参数对私有变量x,y赋初值 cout<<"Constructiscalled!"<<endl;}voidmain(){Pointp1(10,10);//定义对象p1,并给构造函数传递实参p1.print();}Constructiscalled!x=10;y=101010对象p1Point::Point(intvx,intvy){C31在构造函数中允许指定函数参数的默认值,这些默认值在函数调用者不确定参数时可以作为参数来使用。对于所有参数都定义了默认值的构造函数,当它被调用时,允许改变传递参数的个数。如下例:#include<iostream>using

namespace

std;classPoint{private:intx,y;public:Point(intvx=0,intvy=0);//声明缺省参数的构造函数voidprint(){cout<<"x="<<x<<";"<<"y="<<y<<endl;}};4.默认参数的构造函数4.默认参数的构造函数32Point::Point(intvx,intvy){x=vx;y=vy;//用传递来的参数对私有变量x,y赋初值cout<<"Constructiscalled!"<<endl;}voidmain(){Pointp1(10,10);//传两参数p1.print();Pointp2;//不传参数取缺省值p2.print();Pointp3(5);//传一个参数,第二个用缺省值p3.print();}Constructiscalled!x=10;y=10Constructiscalled!x=0;y=0Constructiscalled!x=5;y=0

1010对象p100对象p250对象p3Point::Point(intvx,intvy){33一个类中可以具有几个构造函数,每个都去适合不同的场合,这些构造函数靠所带的参数类型或个数的不同来区分,实际上是对构造函数的重载。如下例:#include<iostream>using

namespace

std;classPoint{private:intx,y;public: Point();//声明无参数的构造函数 Point(intvy);//声明带1个参数的构造函数Point(intvx,intvy);//声明带2个参数的构造函数 voidprint(){cout<<"x="<<x<<";"<<"y="<<y<<endl; }};5.构造函数的重载一个类中可以具有几个构造函数,每个都去适合不同的34Point::Point(){x=0;y=0;cout<<"Construct0iscalled!"<<endl;}Point::Point(intvy){ x=1;y=vy;cout<<"Construct1iscalled!"<<endl;}Point::Point(intvx,intvy){ x=vx;y=vy;cout<<"Construct2iscalled!"<<endl;}voidmain(){ Pointp1;p1.print(); Pointp2(5);p2.print(); Pointp3(10,10);p3.print();}Construct0iscalled!x=0;y=0Construct1iscalled!x=1;y=5Construct2iscalled!x=10;y=10

00对象p115对象p21010对象p3Point::Point()Construct0isca35二义性#include<iostream>using

namespace

std;classPoint{private:intx,y;public:

Point();//声明无参数的构造函数//声明带2个参数的构造函数

Point(intvx=2,intvy=2);voidprint(){cout<<"x="<<x<<";"<<"y="<<y<<endl;}};对象p在定义过程中,没有传递参数,此时有两种可能:第一是在创建对象时调用不带参数的构造函数Point()来对对象初始化;另一种是在创建对象时调用带缺省参数的构造函数Point(intvx=2,intvy=2)来初始化对象。这两种情况的存在使系统无法确定到底调用哪个构造函数,这就出现了二义性。编译将不能通过。Point::Point(){x=0;y=0;cout<<"Construct0iscalled!"<<endl;}Point::Point(intvx,intvy){//用传递来的参数对私有变量x,y赋初值x=vx;y=vy; cout<<"Construct2iscalled!"<<endl;}voidmain(){

Pointp;p.print();}二义性Point::Point(){366.类成员类成员:描述的是一个类内嵌其他类的对象作为成员的情况,它们之间的关系是一种包含与被包含的关系,常被称作组合关系。当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌对象也将被自动创建。在创建对象时,既要对本类的数据成员进行初始化,又要对内嵌对象成员进行初始化。6.类成员类成员:37#include<iostream>using

namespace

std;classPoint{

intx;

inty;public: Point(); ~Point(){cout<<"析构点:"<<x<<"-"<<y<<endl;}

voidprint();}; Point::Point(){ x=10;y=12; cout<<"构造点:"<<10<<"-"<<12<<";";}voidPoint::print(){ cout<<"坐标:"<<x<<"-"<<y<<endl;}Circle的构造函数默认调用Point的无参构造函数#include<iostream>Circle的构造函数默38classCircle{ Pointcentre;

doubleradius;public: Circle(double); ~Circle(){cout<<"析构圆:析构半径"<<radius<<"\n";}

voidprint();};Circle::Circle(doublevr){ cout<<"\n构造圆:构造半径"<<vr<<"\n"; radius=vr;}voidCircle::print(){ centre.print(); cout<<"半径="<<radius<<endl;}voidmain(){ Circlec(4.3); c.print();}构造点:10-12;构造圆:构造半径4.3坐标:10-12半径=4.3析构圆:析构半径4.3析构点:10-121020对象c类成员4.3classCircle{1020对象c类成员4.339#include<iostream>using

namespace

std;classPoint{

intx;

inty;public: Point(intvx=0,intvy=0); ~Point(){cout<<"析构点:"<<x<<"-"<<y<<endl;}

voidprint();}; Point::Point(intvx,intvy){ cout<<"构造点:"<<vx<<"-"<<vy<<";"; x=vx;y=vy;}voidPoint::print(){ cout<<"坐标:"<<x<<"-"<<y<<endl;}初始化的困惑#include<iostream>初始化的困惑40classCircle{ Pointcentre;doubleradius;public: Circle(int,int,double); ~Circle(){cout<<"析构圆:析构半径"<<radius<<"\n";}

voidprint();};Circle::Circle(intvvx,intvvy,doublevr){ cout<<"\n构造圆:构造半径"<<vr<<"\n"; radius=vr; Pointcentre(vvx,vvy);}voidCircle::print(){ centre.print(); cout<<"半径="<<radius<<endl;}voidmain(){ Circlec(2,2,4.3);c.print();}构造点:0-0;构造圆:构造半径4.3构造点:2-2;析构点:2-2坐标:0-0半径=4.3析构圆:析构半径4.3析构点:0-022对象centre00对象c类成员4.3classCircle{构造点:0-0;22对象centr41#include<iostream>using

namespace

std;classPoint{

intx;

inty;public: Point(intvx=0,intvy=0); ~Point(){cout<<"析构点:"<<x<<"-"<<y<<endl;}

voidprint();}; Point::Point(intvx,intvy){ cout<<"构造点:"<<vx<<"-"<<vy<<";"; x=vx;y=vy;}voidPoint::print(){ cout<<"坐标:"<<x<<"-"<<y<<endl;}构造类成员的机制#include<iostream>构造类成员的机制42classCircle{ Pointcentre;doubleradius;public: Circle(int,int,double); ~Circle(){cout<<"析构圆:析构半径"<<radius<<"\n";}

voidprint();};Circle::Circle(intvvx,intvvy,doublevr):centre(vvx,vvy){ cout<<"\n构造圆:构造半径"<<vr<<";"; radius=vr;}voidCircle::print(){ centre.print(); c

温馨提示

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

评论

0/150

提交评论