构造函数 C++构造函数和析构函数详解
你是否想了解更多关于构造函数和C++构造函数和析构函数详解的知识?在本文中,小编将为您详细介绍这两个话题,帮助您更好地理解。
构造函数的作用是什么
构造函数是用于创建和初始化对象的特殊函数。
一、对象的创建和初始化
1、创建对象:构造函数负责创建对象实例。当使用关键字new来实例化一个类时,会自动调用该类的构造函数,从而创建一个新的对象。
2、初始化属性:构造函数的另一个主要作用是对对象的属性进行初始化。通过构造函数,可以为对象的属性赋予默认值或者根据传入的参数来进行赋值操作。
二、执行初始化操作
1、分配内存空间:构造函数在对象实例化时负责分配对象所需的内存空间。它将为对象的属性和方法分配内存,确保它们在内存中占据合适的位置。
2、调用父类构造函数:在面向对象编程中,子类的构造函数通常会调用父类的构造函数,以确保父类的属性和方法也得到正确地初始化。
3、执行其他初始化操作:除了属性赋值外,构造函数还可以执行其他必要的初始化操作。打开数据库连接、加载配置文件或创建其他对象的引用等。
析构函数的作用、区别和垃圾回收机制
1、析构函数的作用
与构造函数相对应,析构函数是在对象销毁时自动调用的特殊函数。它主要用于释放对象所占用的资源,关闭文件、释放内存等。
2、析构函数的区别
构造函数用于对象的创建和初始化,而析构函数则用于对象的销毁和资源释放。构造函数由编译器隐式调用,而析构函数在对象销毁时自动调用。
3、垃圾回收机制
在一些编程语言中,如C++,还可以通过手动调用析构函数来显式销毁对象。但是,在现代编程语言中,通常使用垃圾回收机制来自动管理对象的销毁和内存释放。
什么是构造函数构造函数的作用
C++语言为类提供的构造函数可自动完成对象的初始化任务,全局对象和静态对象的构造函数在main()函数执行之前就被调用,局部静态对象的构造函数是当程序第一次执行到相应语句时才被调用。
构造函数,是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载。
在对象编程语言中,一般在定义了一个类型之后,为了能使用它,必须把这个类型具体化,也就是指定为一个具体的对象。而构造函数就是从定义出发,建立与定义相对应的对象。用计算机语言来说,光有定义是不能使用,必须通过构造函数来分配内存空间给可使用的对象。
构造函数的八种方法
1.Object构造函数模式
使用方式:先创建空对象,再添加属性/方法
适用场景:起始时不确定对象内部的数据
缺点:语句太多
2.对象字面量
使用方式:使用{}创建对象,同时指定属性/方法
适用场景:起始时对象内部数据确定
缺点:如果创建多个对象,有重复代码
3.工厂模式
使用方式:通过工厂函数动态创建对象并返回
适用场景:需要创建多个对象
缺点:对象没有具体的类型,都是Object类型
4.自定义构造函数模式
使用方式:自定义构造函数,通过new创建实例对象
适用场景:需要创建多个类型确定的对象
缺点:每个对象都有相同的数据,浪费内存
5.构造函数+原型的组合
使用方式:自定义构造函数,属性在函数中初始化,方法添加到原型上
适用场景:需要创建多个类型确定的对象
6.动态原型模式
动态原型函数模式把所有信息都封装在了构造函数中,在构造函数中初始化原型,又保持了同时使用构造函数和原型的优点。
如果不用if判断的方式直接在原型上添加方法,那么每一次new一个实例对象的时候都会去重写原型,浪费内存空间,而如果加了判断那么在原型只会在第一次实例话对象的时候就生成了,以后每一次new实例均不会再重写原型对象。
7.稳妥构造函数模式
所谓稳妥对象,指的是没有公共属性,而且其方法也不引用this的对象。稳妥对象最适合在一些安全环境中。
8.es6 class
与组合构造函数非常相似,语法更加精炼简洁。
C++构造函数和析构函数详解
C++构造函数和析构函数详解如下:
一、构造函数简介
在上一个章节我们在创建好类的对象之后,首先对它的每一个成员属性赋值之后再对它们进行输出操作,如果不赋值就输出,这些值就会是垃圾值。而为了代码的简介,一次性为所有成员属性初始化,C++的类提供了这样的一个函数—构造函数。
C++提供构造函数来处理对象的初始化。
1、构造函数是一种特殊的成员函数,不需要用户来调用,定义对象时被自动执行。
2、构造函数名字与类名相同,无返回类型。
3、可以由用户自己定义实现,根据需要设计对数据成员进行初始化,依旧可以设置函数的默认参数。
4、如果我们没有定义构造函数,系统会为我们自动定义一个无参的默认构造函数的,它不对成员属性做任何操作,如果我们自己定义了构造函数,系统就不会为我们创建默认构造函数了。
二、默认参数构造函数
CTime(){}带参数的构造函数:这样的一个构造函数提供了一个三个成员属性的初始化,声明对象的时候就可以传入参数了。CTimetime(Hour,Minute,Second);//对象的定义CTime(intHour,intMinute,intSecond){m_nHour=Hour;m_nMinute=Minute;m_nSecond=Second;}
在有了构造函数之后,我们声明时传入参数调用的构造函数等同于下面注释的代码。此时因为已经没有了默认的构造函数,就不能再想上一个章节那样不传入参数进行对象的创建了。
三、构造函数的重载
在一个类中可以有多个构造函数,它们构成了函数的重载。下面两个构造函数构成了重载,我们可以在声明对象的时候传入不同的参数调用不同的构造函数。此时可以依旧像上一个章节那样对象不传入任何参数,也不需要再对它们一一初始化,这一切都有构造函数做了。
对象在创建的时候会根据传入参数的类型来调用不同的构造函数,这和普通函数的调用是一致的。这是一个含有默认参数的构造函数,默认参数的函数的使用和我们在函数那一章的规则是一样的。
中间的构造函数的所有参数都有默认值,这样是不可以的,在有三个构造函数的情况下,我们创建一个没有传入参数的对象的时候,它是应该调用第一个无参的默认构造函数呐?还是第二个符合默认参数规则的构造函数呐?这样就造成了二义性,是不可以的。
四、析构函数简介
它的作用与构造函数相反,一般是执行对象的清理工作,当对象的生命周期结束的时候,会自动的调用。析构函数的作用并不是删除对象,在对象撤销它所占用的内存之前,做一些清理的工作。清理之后,这部分内存就可以被系统回收再利用了。
在设计这个类的时候,系统也会默认的提供一个析构函数。在对象的生命周期结束的时候,程序就会自动执行析构函数来完成这些工作。同构造函数,用户自己定义,系统自动调用。
1、析构函数没有返回值,没有参数。
2、没有参数,所以不能重载,一个类仅有一个析构函数。
3、析构函数除了释放工作,还可以做一些用户希望它做的一些工作,比如输出一些信息。
五、的命名规则如下:
~CTime();定义如下:这个析构函数为了显示它在什么时候被调用,我们利用它输出一句话以告知我们它被调用了。运行结果如下:我们在main函数里面创建了四个CTime对象,所以在退出main函数之后,四个对象的生命周期结束,析构函数被调用了四次。
如果我们是在main函数的外面创建的对象,这个对象的销毁是在我们退出程序之后。析构函数销毁对象的顺序与构建对象的顺序是相反的。因为对象的存储是在栈中的,栈的特性就是先进后出。
如果我们使用new运算符来动态的创建一个对象,这个对象是不会自动被销毁的,我们需要手动使用delete销毁,这个时候析构函数随着delete的使用而被调用,在程序结束的时候就不会再销毁这个对象了。
OK,关于构造函数和C++构造函数和析构函数详解的内容到此结束了,希望对大家有所帮助。