注册 登录
编程论坛 C++教室

析构函数问题?

q345918550q 发布于 2010-04-27 09:54, 804 次点击
       //v.h
#include <iostream>
using namespace std;
#include<string.h>

class Person                                //基类:Person
{
protected:
    char *name;
public:
    Person(char *n)                        //构造函数
    {
        name=new char[strlen(n)+1];
        strcpy(name,n);
        cout<<"调用Person构造函数."<<endl;
    }
    virtual ~Person()    {                    //虚析构函数
        delete[]name;
        cout<<"调用Person析构函数."<<endl;
    }
    virtual void display()                    //虚函数
    {
        cout<<"姓名:"<<name<<endl;
    }
};

class Student:public Person                //派生类:Student
{
protected:
    char *major;
public:
    Student(char *n,char *m):Person(n)      //派生类的构造函数
    {
        major=new char[strlen(m)+1];
        strcpy(major,m);
        cout<<"调用Student构造函数."<<endl;
    }
    ~Student()                            //派生类析构函数
    {
        delete[]major;
        cout<<"调用Student析构函数."<<endl;
    }
    void display()                        //虚函数
    {
        Person::display();
        cout<<"专业:"<<major<<endl;
    }
};
         //g.cpp

#include "v.h"
void main()
{
    Person *p1=new Person("李清");   
    p1->display();
    delete p1;
    cout<<endl;

    Person *p2=new Student("田农","环境科学");   
    p2->display();
    delete p2;   
    cout<<endl;

    Student *p3=new Student("丁一健","计算机科学技术");     
    p3->display();
    delete p3;   
    cout<<endl;
}
析构函数不是自动调用的吗?那为什么要手动delete p1,p2,p3?那为何一手动删除p1,p2,p3会自动调用各个析构函数呢?



[ 本帖最后由 q345918550q 于 2010-4-27 10:10 编辑 ]
5 回复
#2
2010-04-27 10:24
晕啊…
#3
wow512010-04-27 13:03
楼主 一个类内只有一个析构函数
即使我们不写析构函数 他也会默认存在 其调用顺序类似于栈的特点
#4
南国利剑2010-04-27 13:21
析构函数是自动调用的 啊。不用你人为地去~person()这样的语句而已。

但是函数的实现你得自己写啊。
如果你没有写,系统就会给你提供一个默认的析构函数,
但是这个函数的函数体是空的,也就是默认的析构函数,
什么功能都没有。
#5
2010-04-27 13:30
析构函数会帮我们做很多事…例如收回栈内存等…但我们也知道…很多收尾的东东系统会帮我们搞定…不过堆上的动态内存是需要我们去释放的…用了NEW就不要忘了DELETE…不然就内存泄漏了
#6
q345918550q2010-04-27 14:56
哦··那我现在不明白为什么一执行delete p1就会输出 调用Person析构函数 。
1