专栏首页Kitty的日常笔记关于构造函数与析构函数的分享

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

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

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

一、定义

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,今天的分享就到这里了,如果哪里不对的地方请多包涵,谢谢指出。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于软件开发需求分析的分享

      软件需求分析就是把软件计划期间建立的软件可行性分析求精和细化,分析各种可能的解法,并且分配给各个软件元素。需求分析是软件定义阶段中的最后一步,是确定系统必须...

    用户7053485
  • C# 嵌入互操作类型

    1.”嵌入互操作类型”中的嵌入就是引进、导入的意思,类似于c#中using,c中include的作用,目的是告诉编译器是否要把互操作类型引入。

    用户7053485
  • C# 创建Windows服务demo

    1.新建一个Windows Service,并将项目名称改为“MyWinsService”,程序保存路径自己选一个,如下图所示:

    用户7053485
  • 构造函数浅析

    构造函数浅析<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...

    ternturing
  • C#基础知识系列五(构造函数)

      2、不带参数的构造函数称为“默认构造函数”。 无论何时,只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。除非类是s...

    aehyok
  • C#-构造函数

    创建一个类的时候,使用new运算符对类进行实例化。在为新对象分配内存之后,new运算符立即调用构造函数。

    祝你万事顺利
  • 为什么构造函数不能为虚函数

    1、从使用角度         虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以...

    用户1215536
  • C#类学习-3

    只要使用 new 运算符实例化对象,并且不为 new 提供任何参数,就会调用默认构造函数。

    py3study
  • 关于Java构造函数(Constructor)的常见问题总结1 为什么调用子类的构造方法的时候,默认会调用父类的构造方法2 常见错误:Implicit super constructor is und

    当继承自一个类的时候,构造方法就会首先调用super()方法。如果没有显式的写这个语句,那么编译器就会自动插入这个语句。这就是为什么我们上面的那个例子程序会先调...

    desperate633
  • Scala-8.面向对象-构造函数

    悠扬前奏

扫码关注云+社区

领取腾讯云代金券