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

构造函数与析构函数详解

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

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

构造函数

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

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

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

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

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

析构函数

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

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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

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