关于构造函数与析构函数的分享

分享:创建复杂的类类型的对象时,可能需要对一些数据或者对象中需要使用的资源进行一些初始化操作,比如设置成员的默认值,打开数据库,打开文件,等等,而这些准备工作,就可以放在类的构造函数中进行。

与构造函数的功能相反的是析构函数,我们可以在析构函数里面进行一些释放和清理资源的操作。

一、定义

1、构造函数 :构造函数是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。 

   在这里引用一下别人的总结,我觉得挺好的:

    构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化.

   构造函数具有一些特质:

    (1).构造函数必须与类同名;

            (2).构造函数没有返回类型,它可以带参数,也可以不带参数;

            (3).一个类中可以有一个或多个构造函数,也就是说构造函数可以重载,从而提供初始化类对象的不同方法;

            (4).声明类对象时,系统自动调用构造函数,构造函数不能被显式调用;

    (5).若在声明时未定义构造函数,系统会自动生成默认的构造函数,此时构造函数的函数体为空.

            (6).静态构造函数,用static修饰,用于初始化静态变量,一个类只允许有一个静态构造函数,在类实例化时加载,这时修饰符public、private失去作用.

      {

                   静态构造函数既没有访问修饰符,也没有参数。

      在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。

      无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。

        静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。

      静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。

      如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化}

          (7)可以使用public、protected、private修饰符;

          (8)引用父类构造时用():base()方法,引用自身重载的构造使用():this(int para);

2、析构函数:析构函数(destructor) 与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存)

使用析构函数时,应该注意下面的问题:

    • 只能在类中使用析构函数,不能在结构中使用析构函数。
    • 一个类只能有一个析构函数。
    • 不能继承或重载析构函数。
    • 析构函数只能被自动调用。
    • 析构函数没有任何修饰符、没有任何参数、也不返回任何值

 调用析构函数:

    • 垃圾回收器决定了析构函数的调用,我们无法控制何时调用析构函数。
    • 垃圾回收器检查是否存在应用程序不再使用的对象。如果垃圾回收器认为某个对象符合析构,则调用析构函数(如果有)并回收用来存储此对象的内存。
    • 程序退出时会调用析构函数。
    • 我们可以通过调用Collect强制进行垃圾回收,但是请不要这样做,因为这样做可能导致性能问题。

构造函数与析构函数的区别:
      构造函数和析构函数是在类体中说明的两种特殊的成员函数。
      构造函数的功能是在创建对象时,使用给定的值来将对象初始化。
      析构函数的功能是用来释放一个对象的。在对象删除前,用它来做一些清理工作,它与构造函数的功能正好相反。

二、例子

  1、C#中规定,类的构造是与所在类同名的方法,而析构函数的方法名则是在构造函数名称前面加上“~”符号。

  2、下面演示累的构造函数与析构函数的使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace test
{
    //演示构造函数
    public class CTest
    {
        //构造函数
        public CTest()
        {
            Console.WriteLine("在这里初始化资源");
        }
        //析构函数
        ~CTest()
        {
            Console.WriteLine("在这里清理或者释放资源");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            CTest t = new CTest();
            t=null;
            GC.Collect();
            Console.ReadLine();
        }
    }
}

程序运行结果:

 


从运行结果来看,在使用new关键字创建一个类类型的对象时,会自动调用类的构造函数,而将对象设置为空引用(null)时,可以通过调用Collect强制进行垃圾回收。

debug和release区别:
  • 一个为调试版本,其中包括了出错时能够定位源代码的在行,如果源文件已经改变,定位出来会有偏移,而且,在这个版本中编译器不会进行代码优化,并且在程序中能用宏定义_DEBUG来确定当前的版本。

  • 另一个为正试版本,程序出错只是进行简单的错误处理,编译器会优化代码,以提高性能。

  • Release代码更小,执行更快,编译更严格,更慢 。当然就没有了调试信息。

   想详细了解debug和release相关知识的可以到这里学习:https://www.cnblogs.com/rgjycs/p/9254332.html

 

心得:所有的知识都需要一个过程,从你认识它,然后会使用它,再到理解它,最后消化了它。

ok,今天的分享就到这里了,如果哪里不对的地方请多包涵,谢谢指出。

posted @ 2019-07-23 20:35  Tulip123  阅读(523)  评论(0编辑  收藏  举报