转:C++何时调用构造函数,何时调用析构函数
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wjf1997/article/details/83041666
前言:
最近自考C++刷题的时候快被构造函数和析构函数搞得疯掉了,现在特意写一篇博客来记录自己的收获!
在我们创建新的对象的时候,都要执行某一个类中的构造函数,而当构造函数中分配了资源之后,当我们销毁一个对象的时候需要一个相应的操作将这些资源释放出去,这就需要析构函数。
一般来说,在有基类和派生类存在时,在创建派生类类型时,会先构造基类,再构造派生类,析构顺序反之,类似于进栈出栈的过程。
遇到的情况:
指针不会调用构造和析构函数:

当对指针用new在内存中开辟空间的时候会调用构造函数:

当我们使用new为指针开辟空间,然后用delete释放掉空间会调用构造和析构函数:

当我们函数的形参是一个对象的时候,这时候会系统只会调用析构函数,而缺少形参的构造函数:

当形参为一个对象的时候,实参也为对象,这时候系统会将实参复制一份给形参,此时系统就不会再给形参额外调用构造函数来对形参对象初始化了,所以就不会调用构造函数,但是形参被销毁的时候还是会调用析构函数!
当我们函数的形参是一个引用的时候,这时候会系统不调用构造函数和析构函数:

当形参为一个引用的时候,实参也对象,这时候系统会将形参指向实参,此时系统就不会对形参调用构造函数和析构函数!
总结:
我感觉构造函数存在的目的就是为了给对象在内存中开辟空间并且给对象设置一些初始值,而析构函数就是将某个对象从内存中抹除,而设置的,经典的例子就是上边的指针的例子,以上就是我的一些感想,欢迎小伙伴们在留言区写出自己的疑惑,我很高兴和大家分享
————————————————
版权声明:本文为CSDN博主「王靖凡--Sam」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wjf1997/article/details/83041666
转:C++何时调用构造函数,何时调用析构函数的更多相关文章
- php protected只能被继承,不可以在实例中调用,parent::调用父类(子类函数的重载对父类的函数没有影响)
<?php class a { private function fun1(){ echo 'a1'; } //protected 可以被继承,但是只能在子类中使用,不能被实例化调用 prote ...
- C++ 构造函数和析构函数的调用顺序、虚析构函数的作用
构造函数和析构函数的调用顺序 构造函数的调用顺序: 当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达最底层的目标派生类的构造函数为止. 析构函数的调用书序: ...
- C++继承中析构函数 构造函数的调用顺序以及虚析构函数
首先说说构造函数.大家都知道构造函数里就能够调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就能够调用基类的成员了,这就说明创建子类的时候必须先调用基类的构造函数, ...
- c++ 对象复制引用时何时调用构造函数、析构函数
class TEST{ private : public : TEST() {std::cout << "constructor" << std::endl ...
- C++构造函数的调用
C++中类的构造函数的调用有四种形式 C++中对象的实例化有四种情况: 1.调用默认构造函数. 2.隐式调用构造函数 3.显示调用构造函数 4.使用new操作符 如图所示,前三种在对象的作用域之外就会 ...
- C++复习14 构造函数初始化调用顺序
1.关于构造函数初始化调用顺序的问题. 首先是父类和子类的,首先调用父类的构造函数,然后调用子类的构造函数.但是对于子类中有其他类型的数据成员的时候,会在调用该类的构造函数之前,调用其数据成员的构造函 ...
- c++中六种构造函数的实现以及9中情况下,构造函数的调用过程
六种构造函数的实现代码例如以下: #include<iostream> using namespace std; //c++中六种默认的构造函数 class Test { public: ...
- C++类构造函数、拷贝构造函数、复制构造函数、复制构造函数、构造函数显示调用和隐式调用
一. 构造函数是干什么的 class Counter { public: // 类Counter的构造函数 // 特点:以类名作为函数名,无返回 ...
- java静态方法调用&&构造函数&&静态块
静态方法,也就是使用static声明的方法,在虚拟机启动加载类的时候就进行了创建,所以使用到静态方法时,直接使用类名点静态方法即可调用.java在执行静态方法前,不会调用构造函数:构造函数是在实例化j ...
随机推荐
- 基于【 centos7】四 || FastDFS集群+Nginx负载均衡
1. 架构设计 1.1 架构图 FastDFS是用c语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,使用F ...
- 下拉框选择 <from:select>
- stm32 按键操作
抖动时间的长短由按键的机械特性决定,一般为5ms-10ms void key() { static u8 flag = 1; if(flag == 1 && KEY_UP == 1) ...
- leetcode-88. 合并两个有序数组 · Aaray
题面 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 样例 1. 输入: nums1 = [1,2,3,0,0,0], m ...
- 什么是虚拟DOM
一.前言 虚拟DOM概念随着react的诞生而诞生,由facebook提出,其卓越的性能很快得到广大开发者的认可:继react之后vue2.0也在其核心引入了虚拟DOM的概念,本文将以vue2.0使用 ...
- vue作用域插槽
简而言之,作用域插槽就是让插槽内容能够访问子组件中的数据. 案例如下:有CurUser组件 <template> <span> <!-- 在slot 元素上绑定user, ...
- js判断img是否存在
利用image对象的onerror事件来判断,出错则更换image对象的src为默认图片的URL. <p>第一种情况:图片存在,正常显示 <img src="http ...
- MyBaties --day1
今天就来聊聊这个东西 今天的主角相信大家也看到了 MyBaties 是个什么东东 它有什么作用?怎么用?好不好用今天来说说 .说到MyBaties 就不得不谈到JDBC大家可能都知道 JDBC用来操 ...
- 《数据结构与算法之美》 <04>链表(上):如何实现LRU缓存淘汰算法?
今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是 LRU 缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...
- Linux磁盘管理——swap分区
转自:Linux Swap交换分区设置 对swap分区的误解 一种流行的.以讹传讹的说法是,安装Linux系统时,交换分区swap的大小应该是内存的两倍.也就是说,如果内存是2G,那么就应该分出4G的 ...