主要内容:
1、析构函数,默认析构函数,析构函
数的特点。
2、调用构造函数和析构函数的顺序
3、类的组合(重点)
4、类的组合时的构造与析构(重点)
重点:类的组合、类的组合时的构造与析
构
1、析构函数
当程序执行完毕,对象需要销毁,析构函数是在
系统释放对象前,做一些清理工作,收回分配的空间。
//析构函数举例
#include <iostream>
#include <string>
using namespace std;
class Student
{ private:
char* id; char* name; int age;
public:
Student(char* id1, char* name1,
int age1);
Student();
Student(Student& s);
~Student();
void display();
};
Student::Student(char* id1, char*
name1, int age1)
{id= id1;name= name1;age=age1;}
Student::Student(Student& s)
{id=s.id; name=s.name;
age=s.age;cout<<"调用复制构造函数
"<<endl;}
Student::Student()
{id="000000";name="姓名";age=18;}
Student::~Student()
{cout<<"析构:"<<name<<endl;}
void Student::display()
{cout<<id<<"\t"<<name<<"\t"<<a
ge<<endl;}
void main()
{
Student s1("236500", "王平", 19); //
加断点,单步调试
s1.display();
Student s2; //加断点,单步调试
s2.display();
Student s3=s1;
Student s4(s2);
}
举例:
#include <iostream.h>
class Box{
public:
Box() //构造函数
{ l = 18;w = 16;d = 10; cout<<"调用了构造函数!"<<endl;}
~Box() //析构函数
{cout<<"调用了析构函数!"<<endl;}
void DispInfo(){cout <<"l=" << l<<" w=" << w <<" d="<<d<<endl;}
private:
int w, l, d;
};
void main(){
Box b1; //自动调用构造函数
b1.DispInfo();
}
析构函数小结:
1)对于析构函数,须说明以下几点:
(1) 析构函数也是类的成员函数,系统约定:
析构函数名必须与类名相同,并在其前面加
上字符“~”,以便和构造函数名相区别。
(2)析构函数不能带有任何参数,不能有返
回值,函数名前也不能用关键字 void。
(3)析构函数是在撤销对象时由系统自动调
用,它的作用是在撤销对象之前做好结束工
作。
(4)一个类只有一个析构函数。析构函数
不可以重载。
2)在定义类时,若没有定义类的析构函数,
则编译器自动产生一个默认的析构函数,其
语法格式为:
ClassName::~ClassName(){}
从定义格式可以看出,这是一个函
数体为空的析构函数,函数什么事也不做。
在撤销对象时,若不做任何结束工作,可以
不显式地定义析构函数。
但在撤销对象时,要释放对象的数据成员用 new 运算符分配的动态空间时,
必须显式地定义析构函数。(见下面的例题)
#include <iostream.h>
#include <string.h>
class Student
{ private:
char* id;char* name;int age;
public:
Student(char* id1, char* name1, int age1);
~Student();
void display();
};
Student::Student(char* id1, char* name1, int age1)
{
id=new char[strlen(id1)+1]; //动态存储分配-申请资源
strcpy(id,id1);
name=new char[strlen(name1)+1];
strcpy(name,name1);
age=age1;
}
Student::~Student()
{
cout<<"析构:"<<name<<endl;
delete[] id;
delete[] name;
}
void Student::display()
{cout<<id<<"\t"<<name<<"\t"<<age<<endl;}
void main()
{Student s1("236500", "王平", 19); //定义对象
s1.display();
}
3)通常在产生对象时调用构造函数,在撤
销对象时调用析构函数。但对于不同存储类
型的对象,调用构造函数与析构函数的情况
有所不同。
(1)对于全局定义的对象,在程序开始执行
时,调用构造函数;在程序的流程离开其作
用域时,调用析构函数。
(2)对于在函数内定义的对象(自动局部对