C++ 构造与析构函数

上传人:ning****hua 文档编号:243023527 上传时间:2024-09-14 格式:PPT 页数:46 大小:264KB
返回 下载 相关 举报
C++ 构造与析构函数_第1页
第1页 / 共46页
C++ 构造与析构函数_第2页
第2页 / 共46页
C++ 构造与析构函数_第3页
第3页 / 共46页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,4,讲,构造函数与析构函数,构造函数,定义构造函数,具有构造函数的类如何创建对象,析构函数,复制构造函数,1,构造函数,constructor,(,对象的初始化,),构造函数是每个类都具有的一种特殊函数,有以下三特点:,构造函数的名字必须与类名相同;,构造函数没有函数,(,返回,),类型,不是,void,;,在创建对象时,构造函数才被系统自动调用,不能被用户显式调用。,Circle,类增加构造函数,class,Circle,private:,double radius;,public,:,Circle(double,);,double,getArea,();,double,getRadius,();,void,setRadius(double,);,;,Circle:,Circle(double,newRadius,),radius=,newRadius,;,1-1,构造函数,Constructor,(1),默认构造函数,default constructor,若在类中没有显式地定义构造函数,则编译器会自动提供一个不带参数、函数体为空(即不做任何事情)的,默认构造函数,。,:,(),此时,在程序中创建一个对象时,编译器调用默认构造函数来初始化该对象。,若程序中有自定义的构造函数,则编译器就不会再生成默认构造函数,(因此不能再使用) ,此时必须使用自定义的构造函数创建对象。,(2),自定义构造函数,若类中显式自定义了构造函数,此时系统将不再提供默认的无参构造函数。,class Cylinder,double,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,Cylinder: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;,注:若有默认参数又有重载函数时,可能出现二义性。,构造函数可以重载,,可带默认的参数值,可内联,.,Date:Date,() /,无参,重载,year = 1900;,month = 1;,day = 1;,Date:Date(int,y,int,m,int,d),year = y;,month = m;,day = d;,构造函数,的说明,创建对象时系统,1),为对象的数据成员分配存储空间,,2),调用构造函数,(,可以是默认构造函数,),,执行构造函数体中的代码。,由于,构造函数在创建新对象时被系统自动调用,而且,类的数据成员多为,private,,因此,可在构造函数中进行数据成员的初始化,,将构造函数的参数值赋给对象的数据成员,从而在创建对象时进行初始化。,每个类都具有构造函数,,没有定义构造函数的类,系统自动提供默认构造函数,(,什么都不做,空函数,),警告:一个常见的错误是在构造函数前放置一个,void,。,1-2,因为创建对象时系统要调用构造函数,则必须根据构造函数形式创建对象,(,创建对象时为构造函数提供实参,),(1),使用不带参数的构造函数创建对象时,对象的创建形式为:,类名 对象名;或: 类名 对象名,=,类名,();,如:,Circle cir1;,或:,Circle cir1= Circle();,注意:,Circle a(),;,/,错, 声明了一个函数名为,a,,返回值为,Circle,类的对象。,#include,void main(),Circle cir1,;,cout, cir1.getRadius();,cout,cir1.getArea();,class,Circle,private:,double radius,;,public,:,Circle();,double,getArea,();,double,getRadius,();,void,setRadius(double,);,;,Circle: Circle(),radius=1;,注:若不定义构造函数,则使用系统提供的默认构造函数创建对象,此时对象的数据成员的值均为随机值。,Circle,类定义无参构造函数,_,单文件,#include,void main(),Circle cir1,;,cout, cir1.getRadius();,cout,cir1.getArea();,class,Circle,private:,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,#include,void main(),Circle cir1,;,cout, cir1.getRadius();,cout,cir1.getArea();,/*class declaration,circle.h,*/,class,Circle,private:,double radius,;,public,:,Circle();,double,getArea,();,double,getRadius,();,void,setRadius(double,);,;,/,circle.cpp,#include ,circle.h,Circle: Circle(),radius=1;,double,Circle:getArea,(),return radius*,radius,*3.14159;,double,Circle:getRadius,(),return radius;,void,Circle:setRadius(double,r),radius=r;,使用带参数构造函数创建对象,(,必须为构造函数提供实参,),/*class declaration,circle.h,*/,class,Circle,private:,double radius,;,public,:,Circle(double,);,double,getArea,();,double,getRadius,();,void,setRadius(double,);,;,Circle:,Circle(double,newRadius,),radius=,newRadius,;,#include ,circle.h,#include,void main(),Circle cir2 (2);,cout,cir2.getRadius (),endl,;,cout,cir2.getArea(),endl,;,对象的创建形式为:,类名 对象名,(,初始化参数表,),;,或: 类名 对象名,=,类名,(,初始化参数表,),;,注:由于类中只定义了带参构造函数,则系统不会再提供默认构造函数,因此不能再使用第,1,种方式创建对象。,Circle cir1;/wrong,Error: no appropriate default constructor available,Circle,类定义有参构造函数,_,多文件,#include ,circle.h,#include,void main(),Circle cir2(2),;,cout, cir1.getRadius();,cout,cir1.getArea();,/*class declaration,circle.h,*/,class,Circle,private:,double radius,;,public,:,Circle(double,);,double,getArea,();,double,getRadius,();,void,setRadius(double,);,;,/,circle.cpp,#include ,circle.h,Circle: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;,重载构造函数,此时可根据构造函数的形式采用多种形式创建不同的对象。,class Circle,private:,double radius;,public:,Circle();,Circle(double);,double getArea();,double getRadius();,void setRadius(double);,;,#include,void main(),Circle cir1;,Circle cir2(2);,cout,cir1.getRadius (),endl,;,cout,cir1.getArea(),endl,;,cout,cir2.getRadius (),endl,;,cout,cir2.getArea(),endl,;,Circle: Circle(),radius=1;,Circle:,Circle(double,newRadius,),radius=,newRadius,;,Circle,类定义重载构造函数,_,多文件,#include ,circle.h,#include,void main(),Circle cir1,cir2(2),;,cout,cir1.getRadius (),endl,;,cout,cir1.getArea(),endl,;,cout,cir2.getRadius (),endl,;,cout,cir2.getArea(),endl,;,/*class declaration,circle.h,*/,class,Circle,private:,double radius,;,public,:,Circle();,Circle(double,);,double,getArea,();,double,getRadius,();,void,setRadius(double,);,;,/,circle.cpp,#include ,circle.h,Circle: Circle(),radius=1;,Circle: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;,使用带默认参数的构造函数,/circle.h,class Circle,private:,double radius;,public:,Circle(double=1);,double getArea();,double getRadius();,void setRadius(double);,;,/,testCircle.cpp,#include ,circle.h,#include,void main(),Circle cir1;,Circle cir2(2);,cout,cir1.getRadius (),endl,;,cout,cir1.getArea(),endl,;,cout,cir2.getRadius (),endl,;,cout,cir2.getArea(),endl,;,Circle cir2 = Circle(2);,Circle *p=,new,Circle(3);,delete p;,Circle:,Circle(double,newRadius,),radius=,newRadius,;,#include ,circle.h,#include,void main(),Circle cir1,cir2(2),;,cout,cir1.getRadius (),endl,;,cout,cir1.getArea(),endl,;,cout,cir2.getRadius (),endl,;,cout,cir2.getArea(),endl,;,/*class declaration,circle.h,*/,class,Circle,private:,double radius,;,public,:,Circle(double,=1);,double,getArea,();,double,getRadius,();,void,setRadius(double,);,;,/,circle.cpp,#include ,circle.h,Circle: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;,Circle,类定义带默认参数构造函数,_,多文件,注意,:若在类中同时定义了带默认参数的构造函数与无参构造函数,要注意避免出现歧义性,(,二义性,),而产生编译错误。,warning C4520: Circle : multiple default constructors specified,error C2668: ,Circle:Circle, : ambiguous call to overloaded function,class Circle,private:,double radius;,public:,Circle();,/,无参,Circle(double=1,),/,带默认参数,double getArea();,double getRadius();,void setRadius(double);,;,error,class Cylinder,double,r,h,;,public:,Cylinder();,Cylinder(double,double,=5);,void,setv(double,double,);,void,getv(double&,double,double surface();,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(int,y,int,m,int,d):,year(y),month(m),day(d,), ,函数体中可以有语句,进行其它的初始化操作,若类中没有定义任何形式的构造函数,系统自动生成默认的无参构造函数。,若类中定义了构造函数,则编译器就不会再提供默认的无参构造函数,必须使用自定义的构造函数创建对象,否则出现语法错误。,若要使用多种形式的构造函数创建对象,则必须:,重载构造函数,即在类定义中增加无参和有参构造函数的定义。,定义带默认参数的构造函数。,构造函数与,set,函数,注意:创建对象时必须考虑构造函数的形式,2,析构函数,Destructor,与构造函数相对。,当创建一个对象时:,1),为其数据成员分配存储空间,,2),其构造函数被调用,;而对象的生命期结束时:,1),析构函数被调用,,,2),释放为其分配的存储空间,。,析构函数名是在类名前面加上符号“,”,,析构函数,没有参数和返回值,。 所以,不能重载,,,一个类,只能定义一个析构函数,析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作。通常是释放已分配的内存空间。,如果没有显式定义析构函数,那么编译器为每个类定义一个默认的析构函数。每个类都有构造函数和析构函数。,若类中不定义析构函数,则系统自动生成一个不做任何事情的默认析构函数,(,是一个空函数,),。,:,(),#include ,circle.h,#include,void main(),Circle cir1,cir2(2),;,/*class declaration,circle.h,*/,class,Circle,private:,double radius,;,public,:,Circle(double,=1);,Circle();,double,getArea,();,double,getRadius,();,void,setRadius(double,);,;,/,circle.cpp,#include ,circle.h,Circle:Circle(double,newRadius,),radius=,newRadius,;,cout,“Constructor of Radius=“ radius,endl,;,Circle:Circle,(),cout,“Destructor of Radius=“radius,endl,;,double,Circle:getArea,(),return radius*,radius,*3.14159;,double,Circle:getRadius,(),return radius;,void,Circle:setRadius(double,r),radius=r;,析构函数举例:,Circle,类定义析构函数,_,多文件,注意构造函数和析构函数的执行顺序,:,先构造的后析构,后构造的先析构,运行结果:,Constructor of Radius=1,Constructor of Radius=2,Destructor of Radius=2,Destructor of Radius=1,析构函数举例:日期类,CDate,/,date.h,class,CDate,public:,CDate(int,y,int,m,int,d);,CDate,( );,void Print( );,private:,int,year,month,day,;,;,/,date.cpp,#include ,#include “,date.h,”,CDate:CDate(int,y,int,m,int,d),year=y;,month=m;,day=d;,cout,Constructor called.n;,CDate:CDate,( ),cout,Destructor call.n;,void,CDate:Print,( ),cout,year/month/day,endl,;,/,testDate.cpp,#include ,#include “,date.h,”,void main( ),CDate,day1(1997,4,20),day2(1998,3,6);,day1.Print( );,day2.Print( );,运行结果:,Constructor called.,Constructor called,1997/4/20,1998/3/6,Destructor call.,Destructor call.,注意构造函数和析构函数的执行顺序,.,栈结构,LIFO,注意,所有的类中都应包含构造函数和析构函数,且是由系统自动调用的。如果在类中没有给出定义,则系统会为其建立缺省构造,/,析构函数。,一般来讲,在创建对象时都要进行初始化,因此类中都要定义构造函数;,而析构函数的定义则可根据需要给出。当程序终止时,所有对象都会被销毁。但是如果对象的存储空间在栈,stack,中,则不能编写代码显式地销毁。只有动态创建于堆,heap,中的对象,才能用,delete,操作符显式地销毁。,因此如果在构造函数中进行了动态内存资源的申请,则必须定义析构函数完成内存的释放,.,析构函数应用:整型数组类,CArray,class,CArray,public:,CArray(int,size); /,创建包含,size,个数组元素的整型数组。,CArray,();,/,析构函数,删除动态申请的数组空间,int,getAt(int,nIndex,); /,得到,下标为,nIndex,的,数组元素的值,void,setAt(int,nIndex,int,newElement,);,/,将下标为,nIndex,的数组元素的值设置为,newElement,.,private:,int,* data;,/,整型,数组首地址,int,size; /,数组中的元素个数,;,CArray,类的声明部分,array.h,#,includearray.h,CArray:CArray(int,s),size=s;,data=new,intsize,;,CArray:CArray,(),delete data;,int,CArray:getAt(int,nIndex,),return,datanIndex,;,void,CArray:setAt(int,nIndex,int,newElement,),datanIndex,=,newElement,;,CArray,类的实现部分,array.cpp,构造函数和析构函数都是由系统自动调用的,在程序中定义一个对象,则系统调用它的构造函数为其数据成员分配存储空间;当对象生命期结束时,系统先调用其析构函数,而后收回该对象所占用的内存空间。所以析构函数是在撤销对象占用的内存之前完成一些清理工作。,testArray.cpp,#include ,array.h,#include ,void main(),CArray,t(5);,for(int,i=0;i5;i+),t.setAt,(i,i+1);,for(i,=0;i5;i+),cout,t.getAt,(i),endl,;,复制构造函数是特殊的构造函数,具有一般构造函数的特性,(,在创建新对象时才被调用,),。,函数名同类名,且只有一个形参,该形参是,本类对象的引用,,从而,用一个已经存在的对象,(由复制构造函数的参数指定的对象),,去初始化另一个正创建的同类的对象,。,class,类名,public:,类名,(,形参表,); /,构造函数,类名,(,类名,&,对象名,); /,复制构造函数,;,类名,:,类名,(,类名,&,对象名,) /,复制构造函数的实现,函数体,注:形参是本类对象的引用,3-1,复制构造函数,copy constructor,创建对象时,要么调用构造函数,要么调用复制构造函数,class Circle,private:,double radius;,public:,Circle(double=1);,Circle(Circle ,double getArea();,double getRadius();,void setRadius(double);,;,Circle:Circle(double,newRadius,),radius=,newRadius,;,Circle:Circle(Circle,&c),radius=,c.radius,;,double,Circle:getArea,(),return radius*,radius,*3.14159;,double,Circle:getRadius,(),return radius;,void,Circle:setRadius(double,r),radius=r;,#include,void main(),Circle cir1(2);/,构造函数,Circle cir2(cir1);/,复制构造函数,cout,cir1.getRadius (),endl,;,cout,cir1.getArea(),endl,;,cout,cir2.getRadius (),endl,;,cout,cir2.getArea(),endl,;,/,point.h,class,CPoint,private:,int,x,y,;,public:,CPoint(int,xx=0,int,yy,=0);,CPoint(CPoint,int,getX,();,int,getY,();,;,复制构造函数例,CPoint,类,/,point.cpp,#include “,point.h,”,CPoint:CPoint(int,xx,int,yy,),x=xx;,y=,yy,;,CPoint:CPoint(CPoint,&p),x =,p.x,;,y =,p.y,;,int,CPoint:getX,(),return x;,int,CPoint:getY,(),return y;,3-2,复制构造函数在以下三种情况下被调用(从无到有):,1),用一个已存在的对象去初始化正创建的该类的另一个对象时。,#include ,class,CPoint,private:,int,x,y,;,public:,CPoint(int,xx=0,int,yy,=0) /,构造函数, x=,xx;y,=,yy,; ,CPoint(CPoint,/,复制构造函数,int,getX,() return x; ,int,getY,() return y; ,;,CPoint:CPoint(CPoint,&p),/,复制构造函数的定义,x =,p.x,;,y =,p.y,;,void main(),CPoint,A(1,2);,CPoint,B(A),;,cout,B.getX,(),endl,;,注:该例中类的声明与实现及类的使用放在同一个,.,cpp,文件中。,CPoint,B(A);,或,CPoint,B=A;,3),如果函数的返回值是类的对象,函数执行完成返回调用者时。,CPoint,f(),CPoint,A(1,2);,return A;,void main(),CPoint,B;,B=f,(),;,2),如果函数的形参是类对象,,调用,函数时将实参的值传递给形参时。,void,f(,CPoint,p,),cout,p.getX,(),endl,;,void main(),CPoint,A(1,2);,f,(A,),;,创建对象时,要么调用构造函数,要么调用复制构造函数,。,复制构造函数,用一个已经存在的对象,(由复制构造函数的参数指定的对象),,去初始化另一个正创建的同类的对象,。将已有对象的数据成员的值复制给正在创建的另一个同类的对象,以实现同类对象之间数据成员的数据传递。,(,本类对象的复制,),每个类都有构造函数、析构函数和复制构造函数,,如果定义类时没有给出它们的定义,则系统自动为类提供默认的。系统自动提供的默认构造函数和析构函数为空函数,什么都不做,而默认的复制构造函数可实现将参数对象的每个数据成员值复制给新建对象中相应的数据成员。如果定义类时定义了它们,则系统不再提供。,3-3,复制构造函数说明,#include ,class,CPoint,private:,int,x,y,;,public:,CPoint(int,xx=0,int,yy,=0) /,构造函数,x=,xx;y,=,yy,;,int,getX()return,x;,int,getY()return,y;,;,void main(),point p1(10,20);,point p2(p1);,cout,p1.getX(),endl,;,cout,p2.getX(),endl,;,说明:,每一个类都有一个复制构造函数,若类中没有自定义复制构造函数,则系统提供一个缺省的复制构造函数,该缺省复制构造函数完成将一个对象的所有数据成员的值复制到另一个对象中的相应操作。,说明:,CPoint,类中没有定义复制构造函数,则调用系统的缺省复制构造函数,将,p1,对象的各数据成员的值都拷贝给了,p2,对象相应成员;因此,p2,对象的数据成员的值与,p1,对象的相同。,注:该例中类的声明与实现及类的使用放在同一个,.,cpp,文件中。,复制构造函数例,Circle,类,_,多文件,/circle.h,class Circle,private:,double radius;,public:,Circle(double=1);,Circle(Circle ,double getArea();,double getRadius();,void setRadius(double);,;,/,circle.cpp,#include ,circle.h,Circle:Circle(double,newRadius,),radius=,newRadius,;,Circle:Circle(Circle,&c),radius=,c.radius,;,double,Circle:getArea,(),return radius*,radius,*3.14159;,double,Circle:getRadius,(),return radius;,void,Circle:setRadius(double,r),radius=r;,/,testCircle.cpp,#include ,circle.h,#include,void main(),Circle cir1(2);,Circle cir2(cir1);,cout,cir1.getRadius (),endl,;,cout,cir1.getArea(),endl,;,cout,cir2.getRadius (),endl,;,cout,cir2.getArea(),endl,;,默认的复制构造函数简单地将参数对象的每个数据成员复制给新建对象中相应的数据成员。,class Circle,private:,double radius;,public:,Circle(double=1);,double getArea();,double getRadius();,void setRadius(double);,;,Circle: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;,#include,void main(),Circle cir1(2);,Circle cir2(cir1);,cout,cir1.getRadius (),endl,;,cout,cir1.getArea(),endl,;,cout,cir2.getRadius (),endl,;,cout,cir2.getArea(),endl,;,3-4,复制构造函数应用,_,整型数组类,CArray,class,CArray,public:,CArray(int,size);,CArray,();,int,getAt(int,nIndex,);,void,setAt(int,nIndex,int,newElement,);,private:,int,* data;,int,size;,;,CArray:CArray(int,s),size=s;,data=new,intsize,;,CArray:CArray,(),delete data;,int,CArray:getAt(int,nIndex,),return,datanIndex,;,void,CArray:setAt(int,nIndex,int,newElement,),datanIndex,=,newElement,;,#include ,void main(),CArray,a(5);,for(int,i=0;i5;i+),a.setAt,(i,i+1);,CArray,b(a,);,for(i,=0;i5;i+),cout,b.getAt,(i),endl,;,error,若不定义,copy constructor,:,.,.,.,data,size,a,size,b,data,size,CArray,b(a,);,(,先析构,b,对象,再析构,a),当执行,b,对象的析构函数时,,b,对象的,data,成员指向的堆内的动态空间被销毁后,而,a,对象的,data,指针仍指向该空间,因此当执行,a,对象的析构函数时就会发生错误。,复制构造函数应用:整型数组类,CArray,class,CArray,public:,CArray(int,size); /,创建包含,size,个数组元素的整型数组,CArray(CArray,/,复制构造函数声明,CArray,();,/,析构函数,删除动态申请的数组空间,int,getAt(int,nIndex,); /,得到,下标为,nIndex,的,数组元素的值,void,setAt(int,nIndex,int,newElement,);,/,将下标为,nIndex,的数组元素的值设置为,newElement,.,private:,int,* data;,/,整型,数组首地址,int,size; /,数组中的元素个数,;,CArray,类的声明部分,array.h,#,includearray.h,CArray:CArray(int,s),size=s;,data=new,intsize,;,CArray:CArray(CArray,&a),size =,a.size,; /,设置数组元素个数,data = new,intsize,; /,申请内存空间,for (,int,i=0;i,size;i,+) /,数组元素赋值,datai,=,a.datai,;,CArray:CArray,(),delete data;,int,CArray:getAt(int,nIndex,),return,datanIndex,;,void,CArray:setAt(int,nIndex,int,newElement,),datanIndex,=,newElement,;,CArray,类的实现部分,testArray.cpp,#include ,array.h,#include ,void main(),CArray,t(5);,for(int,i=0;i5;i+),t.setAt,(i,i+1);,CArray,s(t,);,for(i,=0;i5;i+),cout,s.getAt,(i),endl,;,array.cpp,/,str.h,声明字符串类,class,CStr,public:,CStr(char,*s);/,由指定字符串,s,构造一个字符串,CStr(CStr,/,复制构造函数,CStr,();/,析构函数,void show();/,显示字符串,void,setStr(char,*s);/,将字符串,s,赋予当前字符串,private:,char *,pStr,; /,字符串首地址,;,复制构造函数应用:字符串类,/,str.cpp,#,include”str.h,”,#include ,#include ,CStr:CStr(char,*s)/,构造函数,pStr,= new charstrlen(s)+1;/,为字符串分配内存空间,strcpy(pStr,s,);/,将字符串拷贝到,pStr,指向的内存空间中,CStr:CStr(CStr,&temp)/,复制构造函数,pStr,= new charstrlen(temp.pStr)+1;/,申请同样的内存空间,strcpy(pStr,temp.pStr,);/,赋予相同的字符串,CStr:CStr,()/,析构函数,if (,pStr,!=NULL) delete ,pStr,;/,释放,pStr,指向的内存空间,void,CStr,: show()/,显示字符串,cout,pStr,endl,;,void,CStr:setStr(char,*s) /,赋予新串,if (,pStr,!=NULL) delete ,pStr,;/,释放原来占用的存储空间,pStr,= new charstrlen(s)+1; /,按新串长度申请存储空间,strcpy(pStr,s,);,/,testStr.cpp,#include “,str.h,”,void main(),CStr,a(hello,);/,用字符串,hello,初始化对象,a,CStr,b(a,);/,调用复制构造函数,用对象,a,初始化对象,b,a.show,();,b.show,();,若只是进行将一个对象的所有数据成员的值复制到另一个对象中的操作,则可不自行定义复制构造函数,使用系统提供的缺省的复制构造函数即可,也称为浅拷贝(,shallow copy),。,因为使用复制构造函数创建对象时不再调用构造函数,若在构造函数中进行了动态内存分配,若要使用到对象的拷贝则,必须自定义,复制构造函数,在其中进行相应的资源分配,称为深拷贝,(deep copy),,否则出现运行错误。,复制构造函数应用说明,C+,字符串类,string,string,类包含在,库中,用于处理程序中的文本数据,(,并非,primitive data type).,该类中定义了许多可以直接使用的运算符和函数,因此可以很方便地对,string,对象的数据进行查找、赋值以及其他操作。,#include, /,注意不是,using namespace,std; /,标准命名空间,C+,中包含了所有,C,的库,但使用,C+,库的时候不需要,.h,扩展名。使用,using namespace,std;,表示告诉编译器要使用包含,C+,库的标准命名空间。,字符串变量,定义,先定义后使用,使用类名:,string s1, s2(“Hello”);,赋值,s1=“China”;,s1=s2;,不要求,s1,与,s2,长度相同,在赋值时不必精确计算字符个数,不必考虑时候会超长而影响系统安全。,还可对字符串变量中的某一个字符进行操作:,s12=a;,输入输出,cin,s1s2;,cout,s1,=,=0; i-),cout,s2i;,string s3 = s1 + “DEFG”;,cout, s3,endl,;,s1+=“ABC”;,cout,s1,endl,;,string s1=“ABC”;,string s2=“ABE”;,cout,(s1=s2),endl,;,cout,s2),endl,;,作业,6,6-1),为,5-1),的,Circle,类添加,2,个构造函数和,1,个析构函数:,一个无参构造函数,半径的值设置为,1,,输出相应信息。,一个带参构造函数,创建一个指定半径的圆形,输出信息。,析构函数输出“,Destructor”,和半径。,编写测试主函数,分别创建无参和有参,(,半径为,3.5),的圆对象,并输出两个圆对象的面积和周长。,6-2),为,5-2),的,Cylinder,类添加,1,个构造函数和,1,个析构函数,(,注意执行顺序,),:,带缺省参数值,(1,1),的构造函数,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!