构造函数与析构函数详解[通俗易懂]

构造函数与析构函数详解

大家好,又见面了,我是全栈君。

C++是一门面向对象编程的编程语言,这个相信大家都是了解的。为何是面向对象编程呢?主要就是因为这种数据类型的存在,那么类到底是如何生成以及释放的呢?那么就可以引入我们熟悉的构造函数以及析构函数了。

构造函数

构造函数可以分为:无参构造函数、有参构造函数、拷贝构造函数;这三种构造函数在我们定义一个类的时候,如果我们并没有自定义构造函数,那么编译器会自动为我们生成两个构造函数(无参构造函数、拷贝构造函数)。
如果自定义了无参构造函数,那么系统就不在自动提供无参构造函数了,但是拷贝构造函数还是会提供的,除非拷贝构造函数你也进行了自定义。

对于无参构造函数的自动生成呢?还需要注意一点就是:如果自定义了有参构造函数,那么编译器就不会再为你自动提供无参构造函数了。但还是会提供拷贝构造函数,除非也自定义了。

拷贝构造函数:默认是浅拷贝,什么是浅拷贝呢?
浅拷贝就是,当你定义的类中存在指针变量的时候,指针变量指向的内存空间直接也赋值给了另外一个拷贝出来的对象的指针了。那么就会存在两个指针变量同时指向同一个内存空间的情况了,这样子会发生什么问题呢?

主要就是,当你在进行析构函数调用的使用,释放指针变量指向的堆区变量的时候,第一个对象进行了释放,第二个对象也是对同一个堆区变量进行释放,因为已经释放了,所以会出现问题,程序奔溃。

对于浅拷贝的解决方案就是,自定义深拷贝构造函数,把指针指向的堆区的变量重新申请一块空间,进行赋值定义,拷贝出来的对象的指针变量指向这个新申请的堆区变量的地址。

析构函数

析构函数与构造函数的作用刚好相反,构造函数生成对象,而析构函数则是释放对象。析构函数在没有进行自定义的时候,编译器也会默认自定义一个析构函数,只不过是一个空函数体的函数而已。

对于析构函数的主要作用:一般就是用来处理自定义在堆区的变量,手动进行释放,减少对内存的消耗,毕竟作用域结束,对象也就没有了访问的路径,留着堆区的数据,就是一种内存泄漏。

编译器默认自动生成的三大函数(在没有进行自定义之前):无参构造函数、拷贝构造函数、析构函数

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115101.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 原生ajax请求的五个步骤

    原生ajax请求的五个步骤什么是ajax?通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。ajax的优点:1.实现局部更新(无刷新状态下)2.减轻了服务器端的压力ajax的缺点:1.破坏了浏览器前进和后退机制(因为ajax自动更新机制)2.一个Ajax请求多了,也会出现页面加载慢的情况。3.搜索引擎的支持程度比较低。4.ajax的安全性问题不太好(可以用数据加密解决)。注:如果要使用ajax必须要有后端环境的支持(服务器端)。

    2022年5月17日
    184
  • PE框架学习之道:PE框架——style的配置

    PE框架学习之道:PE框架——style的配置

    2021年8月26日
    52
  • matlab 马赫带效应,matlab图像处理基础实例

    matlab 马赫带效应,matlab图像处理基础实例matlab图像处理基础实例·边缘检测(edge)边缘检测时先要把其他格式图像转化为灰度图像>>f=imread(lbxx.bmp);>>a=rgb2gray(f);>>[g,t]=edge(a,canny);>>imshow(g)·剪贴(imcrop)、subplot等imfinfocolormapsubimageimadd…

    2025年6月28日
    5
  • pycharm设置打不开怎么回事_pycharm界面设置

    pycharm设置打不开怎么回事_pycharm界面设置害,pycharm专业版到期了,不能再用了,下了一个社区版,想要编译程序的时候发现没有解释器。解决方法找到设置(右上角,小齿轮)找到项目的Pythoninterpreter设置,点击小齿轮添加新的解释器。选择添加新的interpreter选择对应版本的Python即可。点确定就设置好了。…

    2022年8月26日
    6
  • pcap.h_程序定义了多个入口点,使用/main

    pcap.h_程序定义了多个入口点,使用/main1、命名程序:要创建ABAP/4程序,步骤如下:在“SAPR/3”初始屏幕上选择“工具->ABAP/4工作台”。出现“ABAP/4开发工作台”屏幕选择“ABAP/4编辑器”,“ABAP/4编辑器初始屏幕”为在“程序”字段中创建的程序输入名称(关于创建程序名称的详细信息,参见《命名程序规则》)。选择“创建”。注意:不论在“对象组件”下选择什么,都出现“A…

    2025年11月21日
    3
  • 学习Altas 笔记[JS简单调用服务端方法]

    学习Altas 笔记[JS简单调用服务端方法]nbsp nbsp nbsp nbsp nbsp 在 Ajax 框架中 Asp net 方面最强当属 Altas 最强 以前使用 AjaxPro Net 和 MagicAjax 最几个都比较好用 这几个月来 Altas 已经进入 CTP 版本 是开始学习研究 Altas 的时机了 准备利用 Altas 为 http www yupsky com nbsp 开发成员之间在线通讯的类似于 MSN 这样的功能 今天初步的学习了一下 Altas 最基础的学习内容就是使用 ja

    2025年9月19日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号