C++面向对象编程入门:构造函数与析构函数.doc
上传人:sy****28 上传时间:2024-09-10 格式:DOC 页数:15 大小:49KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

C++面向对象编程入门:构造函数与析构函数.doc

C++面向对象编程入门:构造函数与析构函数.doc

预览

免费试读已结束,剩余 5 页请下载文档后查看

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

C++面向对象编程入门:构造函数与析构函数我们先说一下什么是构造函数。上一个教程我们简单说了关于类的一些基本内容,对于类对象成员的初始化我们始终是建立成员函数然后手工调用该函数对成员进行赋值的,那么在c++中对于类来说有没有更方便的方式能够在对象创建的时候就自动初始化成员变量呢,这一点对操作保护成员是至关重要的,答案是肯定的。关于c++类成员的初始化,有专门的构造函数来进行自动操作而无需要手工调用,在正式讲解之前先看看c++对构造函数的一个基本定义。1.C++规定,每个类必须有默认的构造函数,没有构造函数就不能创建对象。2.若没有提供任何构造函数,那么c++提供自动提供一个默认的构造函数,该默认构造函数是一个没有参数的构造函数,它仅仅负责创建对象而不做任何赋值操作。3.只要类中提供了任意一个构造函数,那么c++就不在自动提供默认构造函数。4.类对象的定义和变量的定义类似,使用默认构造函数创建对象的时候,如果创建的是静态或者是全局对象,则对象的位模式全部为0,否则将会是随即的。我们来看下面的代码:#include<iostream>usingnamespacestd;classStudent{public:Student()//无参数构造函数{number=1;score=100;}voidshow();protected:intnumber;intscore;};voidStudent::show(){cout<<number<<endl<<score<<endl;}voidmain(){Studenta;a.show();cin.get();}在类中的定义的和类名相同,并且没有任何返回类型的Student()就是构造函数,这是一个无参数的构造函数,他在对象创建的时候自动调用,如果去掉Student()函数体内的代码那么它和c++的默认提供的构造函数等价的。构造函数可以带任意多个的形式参数,这一点和普通函数的特性是一样的!下面我们来看一个带参数的构造函数是如何进行对象的始化操作的。代码如下:#include<iostream>usingnamespacestd;classTeacher{public:Teacher(char*input_name)//有参数的构造函数{name=newchar[10];//name=input_name;//这样赋值是错误的strcpy(name,input_name);}voidshow();protected:char*name;};voidTeacher::show(){cout<<name<<endl;}voidmain(){//Teachera;//这里是错误的,因为没有无参数的构造函数Teachera("test");a.show();cin.get();}我们创建了一个带有字符指针的带有形参的Teacher(char*input_name)的构造函数,调用它创建对象的使用类名加对象名称加扩号和扩号内参数的方式调用,这和调用函数有点类似,但意义也有所不同,因为构造函数是为创建对象而设立的,这里的意义不单纯是调用函数,而是创建一个类对象。一旦类中有了一个带参数的构造函数而又没无参数构造函数的时候系统将无法创建不带参数的对象,所以上面的代码Teachera;就是错误的!!!这里还有一处也要注意://name=input_name;//这样赋值是错误的因为name指是指向内存堆区的,如果使用name=input_name;会造成指针指向改变不是指向堆区而是指向栈区,导致在后面调用析构函数delete释放堆空间出错!(析构函数的内容我们后面将要介绍)如果需要调用能够执行就需要再添加一个没有参数的构造函数对上面的代码改造如下:#include<iostream>usingnamespacestd;classTeacher{public:Teacher(char*input_name){name=newchar[10];//name=input_name;//这样赋值是错误的strcpy(name,input_name);}Teacher()//无参数构造函数,进行函数重载{}voidshow();protected:char*name;};voidTeacher::show(){cout<<name<<endl;}voidmain(){Teachertest;Teachera("test");a.show();cin.get();}创建一个无阐述的同名的Teacher()无参数函数,一重载方式区分调用,由于构造函数和普通函数一样具有重载特性所以编写程序的人可以给一个类添加任意多个构造函数,来使用不同的参数来进行初始话对象。现在我们来说一下,一个类对象是另外一类的数