• 首页>范文 > 范文
  • 析构函数怎么写

    1.这个程序里的析构函数怎么写

    #include <string.h>

    class Teacher

    {

    public:

    char *p_Name;

    int Number,Classroom,Money;

    int Phone;

    Teacher(int number,char*name,int classroom,int phone)

    {

    Number=number;

    Classroom=classroom;

    Phone=phone;

    //p_Name=name;

    p_Name = new char[strlen(name)+1]; // 分配空间

    strcpy(p_Name, name);

    }

    ~Teacher()

    {

    if(p_Name) // 析构函数中释放动态分配的内存

    delete [] p_Name;

    }//这里

    Teacher(const Teacher& T){

    Number=T.Number;

    Classroom=T.Classroom;

    Phone=T.Phone;

    //p_Name=T.p_Name;

    p_Name = new char[strlen(T.p_Name)+1]; // 分配空间

    strcpy(p_Name, T.p_Name);

    }

    void salary(int);

    };

    void Teacher::salary(int money){

    Money=5000;

    }

    class Student

    {

    public:

    int Number,Class;

    char*p_Name;

    Student(int number,int _class,char*name){

    Number=number;

    Class=_class;

    // p_Name=name;

    p_Name = new char[strlen(name)+1];

    strcpy(p_Name, name);

    }

    ~Student()

    {

    if(p_Name)

    delete [] p_Name;

    }//这里

    };

    2.什么是析构函数

    构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

    以C++语言为例,析构函数名也应与类名相同,只是在函数名前面加一个波浪符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数,它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。

    3.什么是析构函数

    析构函数是特殊的类成员函数,简单来说,析构函数与构造函数的作用正好相反,它用来完成对象被删除前的一些清理工作,也就是专门的扫尾工作。

    如果构造函数打开了一个文件,最后不需要使用时文件就要被关闭,析构函数允许类自动完成类似清理工作,不必调用其他成员函数。 扩展资料: 函数介绍 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函数。

    以C++语言为例:析构函数名也应与类名相同,只是在函数名前面加一个位取反符,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。

    只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数。

    参考资料来源:百度百科-析构函数。

    4.析构函数怎么用

    摘 要:构造函数与析构函数是一个类中看似较为简单的两类函数,但在实际运用过程中总会出现一些意想不到的运行错误。

    本文将较系统的介绍构造函数与析构函数的原理及在C#中的运用,以及在使用过程中需要注意的若干事项。 关键字:构造函数;析构函数;垃圾回收器;非托管资源;托管资源 一.构造函数与析构函数的原理 作为比C更先进的语言,C#提供了更好的机制来增强程序的安全性。

    C#编译器具有严格的类型安全检查功能,它几乎能找出程序中所有的语法问题,这的确帮了程序员的大忙。但是程序通过了编译检查并不表示错误已经不存在了,在“错误”的大家庭里,“语法错误”的地位只能算是冰山一角。

    级别高的错误通常隐藏得很深,不容易发现。 根据经验,不少难以察觉的程序错误是由于变量没有被正确初始化或清除造成的,而初始化和清除工作很容易被人遗忘。

    微软利用面向对象的概念在设计C#语言时充分考虑了这个问题并很好地予以解决:把对象的初始化工作放在构造函数中,把清除工作放在析构函数中。当对象被创建时,构造函数被自动执行。

    当对象消亡时,析构函数被自动执行。这样就不用担心忘记对象的初始化和清除工作。

    二.构造函数在C#中的运用 构造函数的名字不能随便起,必须让编译器认得出才可以被自动执行。它的命名方法既简单又合理:让构造函数与类同名。

    除了名字外,构造函数的另一个特别之处是没有返回值类型,这与返回值类型为void的函数不同。如果它有返回值类型,那么编译器将不知所措。

    在你可以访问一个类的方法、属性或任何其它东西之前, 第一条执行的语句是包含有相应类的构造函数。甚至你自己不写一个构造函数,也会有一个缺省构造函数提供给你。

    class TestClass{ public TestClass(): base() {} // 由CLR提供} 下面列举了几种类型的构造函数 1)缺省构造函数class TestClass{ public TestClass(): base() {} } 上面已介绍,它由系统(CLR)提供。更多内容请参照以下网页一共有三页。

    5.这个c++析构函数要怎么写

    这类写的有意思。。。嘿嘿

    看一楼,一楼解释的很清楚了。 最好把防止复制对象,把operator = 和复制构造函数设为private。

    PS:

    已经回答,请查看。

    PS的PS:

    那帖子已经达到修改上限,在这里修改了。

    你说的对,那类是自我调用,每次new的时候已经初始化了next了。

    刚才又看了下,是析构函数中的问题。

    while循环中

    上一个对象已经把它析构了,然而它自己本身while还是在循环析构后面的,每个对象都是这样,所以会错误。

    6.结构体可以编写析构函数吗

    当然可以,结构体和类的唯一区别就是其成员变量默认为公有,而类为私有。

    当然它也可以有自己构造函数和析构函数了。例如:class CExample{ struct SExample { SExample() { a = 0x00; b = 0x00; 。

    } ~SExample() { if(a!=NULL) { delete[] a; } if(b!=NULL) { delete[] b; } 。

    .. } private: int *a; char *b; 。.. } public: CExample() { sexample = 0x00; 。

    } ~CExample() { if(sexample!=NULL) delete[] sexample; 。

    .. } private: SExample *sexample; 。

    .}在类里面定义了一个结构体。

    7.析构函数如果没有什么内容的话要不要写

    那就要看析构的对象,如果要析构的成员变量是指针并在堆中开辟了内存空间的话,就要写上比如下边这个编程;#includeusing namespace std;class A{public: A(int a){i=new int; *i=a;cout<<"执行构造函数"<

    “delete i”这个是释放指针I,然后把指针指向空(i=NULL);不这样做的话指针小时之后堆中内存空间还没释放,就形成了内存泄漏。

    发表评论

    登录后才能评论