c++-构造函数与析构函数_第1页
c++-构造函数与析构函数_第2页
c++-构造函数与析构函数_第3页
c++-构造函数与析构函数_第4页
c++-构造函数与析构函数_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

程序设计(C++)构造函数与析构函数张志昌pangzhang@zhichangzhang@学习内容构造函数构造函数的定义构造函数的重载默认构造函数具有缺省参数的构造函数析构函数拷贝构造函数一个类的对象作为另一个类的数据成员利用初始化表对常量数据成员或引用成员提供初值类作用域构造函数构造函数(constructor)是与类名同名的特殊的成员函数构造函数的定义格式为:类名(形参说明){函数体}构造函数调用时间:当定义该类的对象时,构造函数将被自动调用构造函数的含义:实现对该对象的初始化构造一个具有意义的正确对象构造函数的例子例子:类person包括4个数据成员,用来记录人员信息。生成对象obj,并使用构造函数为obj赋予初始值#include<iostream>classPerson//定义类{private://类Person的数据成员

charname[10];//姓名

intage;//年龄

intsalary;//薪金

chartel[20];//电话public://构造函数PersonPerson(char

*xname,intxage,intxsalary,char

*xtel);

voiddisp();};#include<iostream>#include"Person.h"using

namespacestd;Person::Person(char

*xname,intxage,intxsalary,char

*xtel){strcpy(name,xname);//给各数据成员提供初值

age=xage;salary=xsalary;strcpy(tel,xtel);}voidPerson::disp(){cout<<endl;cout<<

"姓名:"

<<

name<<endl;cout<<

"年龄:"

<<

age<<endl;cout<<

"工资:"

<<

salary<<endl;cout<<

"电话:"

<<

tel<<endl<<endl;}//主函数voidmain(){

Personobj("张立三",25,850,"45672314");//生成对象obj并初始化obj.disp();//显示obj}

Personobj(“张立三”,25,850,“45672314”);中完成了以下几个功能:定义并生成了对象obj。在生成对象obj的同时,自动调用相应类的构造函数Person将初始值“张立三”,25,850,“45672314”传递给构造函数Person相应的形参xname,xage,xsalary,xtel。执行构造函数体,将相应的值赋给相应的数据成员。构造函数的特点函数名和类名相同无返回值由系统自动调用,不允许直接调用必须是公有(public)成员可以重载构造函数既可定义成有参函数,也可义成无参函数,要根据问题的需要来定。若没有定义构造函数,系统会定义一个默认的构造函数类名(){}但是若程序中提供了一个构造函数(不一定是无参构造函数),则系统不再提供默认的构造函数构造函数的重载类的成员函数的重载如果一个类中出现了两个以上的同名的成员函数时,称为类的成员函数的重载。当出现构造函数重载时,其匹配方式同普通函数重载时的匹配方式例子:在书记录类Record中定义两个重载函数,其中一个是无参函数,另一个是有参函数。它们都是构造函数。//定义类classRecord{private:

charbookname[30];

intnumber;public:Record();Record(char

*a,intb);

voidshow();};Rec::Rec(){strcpy(bookname,'\0');number=0;}Rec::Rec(char

*a,intb){strcpy(bookname,a);number=b;}voidRec::show()//show的函数定义{

cout<<"booknameis:"<<bookname<<endl;cout<<"booknumberis:"<<number<<endl;}intmain()//主程序{

Recordmybook(“VisualC++6.0”,10020);

//自动调用构造函数Rec(char*a,intb)mybook.show();Recordyourbook;//自动调用构造函数Rec()yourbook.show();

return0;}

结果:booknameis:VisualC++6.0booknumberis:10020booknameis:nonamebooknumberis:0默认构造函数C++规定,每个类必须有一个构造函数。如果在类中没有显式定义构造函数时,则C++编译系统在编译时为该类提供一个默认的构造函数该默认构造函数是个无参函数,它仅负责创建对象,而不做任何初始化工作。只要一个类定义了一个构造函数(不一定是无参构造函数),C++编译系统就不再提供默认的构造函数。析构函数当一个对象被定义时,系统自动调用构造函数为该对象分配相应的资源,当对象使用完毕后,这些系统资源需要在对象消失前被释放。析构函数的定义方式为:

~类名(){函数体}析构函数的意义在对象退出生命期前由系统调用的函数使对象能够正确合理地退出生命期,如释放占用资源、通知有关对象等析构函数的特点是类的一个特殊成员函数,其函数名称是在类名的前面加上~,它没有返回值没有参数由系统自动调用,不能随意调用不能重载必须是公有(public)成员若没有定义析构函数,系统会定义一个默认析构函数:~类名(){}析构函数说明:一个类中只能拥有一个析构函数。对于一个简单的类来说,大多可以直接使用系统提供的默认析构函数。但是,如果在类的对象中分配有动态内存(如:用new申请分配的内容)时,就必须为该类提供适当的析构函数,完成清理工作对象被析构的顺序与对象建立时的顺序正好相反。即最后构造的对象先被析构。构造函数与析构函数的例子类Teacher的构造函数为name申请存储空间,在析构函数中释放该空间classRecord//定义类{private:

charbookname[30];

intnumber;public:Record();Record(char

*a,intb);

voidshow();};classTeacher{private:

char

*name;

intage;public:Teacher(char

*i,inta){

//用new为name成员分配堆内存

name=new

char[strlen(i)+1];strcpy(name,i);age=a;cout<<

"\n执行构造函数Teacher"<<endl;};~Teacher(){

delete[]name;cout<<

"执行析构函数~Teacher"<<endl<<endl;};

voidshow();};voidTeacher::show(){cout<<

"姓名:"<<name<<""<<"年龄:"<<age<<endl;}intmain()//主程序{

Teacherobj("张立三",25);

obj.show();

return0;}结果:执行构造函数Teacher姓名:张立三年龄:25执行析构函数~Teacher拷贝构造函数拷贝构造函数是C++中引入的一种新的构造函数。其作用是使用一个已经存在的对象(有拷贝构造函数的形参提供),去初始化一个新创建的对象拷贝构造函数被调用的时机使用如下两种方式之一的说明语句,用已存在的对象来创建一个相同的新对象<类名><obj2>(<obj1>);<类名><obj2>=<obj1>;对象作为函数的参数,在函数调用时,形参对象的创建函数的返回值为对象,在函数调用完成返回时,系统创建一个与返回值相同的临时对象拷贝构造函数拷贝构造函数显示地定义拷贝构造函数系统默认的隐含的拷贝构造函数定义一个拷贝构造函数的方式是:类名(const类名&形式参数){

函数体}说明:拷贝构造函数的名称与类的名称相同,且它只有一个参数,该参数就是对该类一个对象的引用。拷贝构造函数的功能是用于实现对象值的拷贝,通过将一个同类对象的值拷贝给一个新对象,来完成对新对象的初始化,即用一个对象去构造另外一个对象。拷贝构造函数的例子编写Array的拷贝构造函数classArray{private:

intn;

int

*arrPtr;public:Array();Array(Array&x);

intLength();

intGetElemAt(inti);};Array::Array(Array&x){n=x.n;arrPtr=

new

int[n];

for(inti=0;i<n;i++)arrPtr[i]=x.arrPtr[i];}arrPtrnarrPtrnx拷贝对象假如x释放掉a指向的单元,拷贝对象中a所指的空间也不会释放掉拷贝构造函数的例子classExample{private:

char

*name;

intnum;public:Example(inti,char

*str){name=str;num=i;}

Example(constExample&x){num=x.num;}

voidlist(){cout<<"数据成员num的值=“

<<num<<endl<<endl;}};intmain(){

//调用函数Example(inti,char*str)构造obj1Exampleobj1(215,"张立三");

Exampleobj2(obj1);//使用拷贝构造函数构造obj2

obj2.list();

return0;}默认的拷贝构造函数如果程序员没有为所设计的类提供显式的拷贝构造函数,则系统会自动提供一个默认的拷贝构造函数其功能是:把作为参数的对象的数据成员逐个拷贝到目标变量中,这称为成员级复制(或浅拷贝)采用默认的拷贝构造函数若类数据成员中存在指向动态分配的存储空间的指针采用默认拷贝构造函数对当前对象初始化,则两个对象的相应的指针值相同classArray{priv

温馨提示

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

评论

0/150

提交评论