C++对象构造函数与析构函数的调用时间问题(Good)
来源:互联网 发布:服务器80端口怎么开启 编辑:程序博客网 时间:2024/06/05 23:02
1、首先直接声明(定义)看下
//很多朋友指出我这里用声明不合适,在11楼作了一定解释,具体不在这里赘述,这里改为“定义”,谢谢大家的指正,但我也保留我自己的意见,所以没有把“声明”去掉
这里看到一点Java与c++的不同点,c++在声明的时候就创建了对象,java声明只是创建一个引用,并不会分配内存。言归正传,说明声明以后就调用了构造函数,然后退出的时候调用析构函数。
2、声明指针
可以看到,声明指针并不会调用构造函数,也不会分配内存空间。
3、用new创建
仅仅是调用构造函数创建了对象,分配了内存空间。但是没有调用析构函数,因为box指定的对象的内存是由new来创建分配的,编译器不能够自动调用析构函数将其删除。所以需要调用delete才可以。
4、用new创建对象,并delete掉
这次调用了析构函数。可以看出,此时的析构函数不是编译器自己调用的,是由我们的程序来主动调用的,所以以后需要注意。new了的需要手动释放内存空间
5、什么时候需要重写析构函数?
从例子可以看到,当你的构造函数中调用了new来创建对象的内存分配空间,则需要专门调用delete来释放内存,所以此时需要覆写析构函数,来专门的释放此内存空间
6、对象的形参传值问题:(话外题,仅作记录用)
先看代码及运行结果
运行结果
如果将上面的display代码改为
运行结果可以明显的看到不加引用的时候会出现两个析构函数的调用。为什么呢?
直接传参,是形参传递,所以会另外创建一个对象来复制main函数里的对象box,所以在display调用完成时刻要调用析构函数来释放这个函数创建的形参对象的内存空间。但是如果是传递的引用,就只有一个参数对象了,所以只调用一个。
如果是平时的基本类型,你应该了解,直接把main里的box的值复制给形参box就是了,但是到了对象这里就有点复杂,如果是里面就是单纯的像上面的例子一样double类型等,其自带有复制函数就可以将各个成员值复制到形参对象里,但是如果里面有引用,比如char *pp = new char[100],那么复制的只是地址,两个对象公用一个地址,有可能就会造成错误。所以以后需要注意这一点,调用对象需要用引用哦。。。。。(要不你自己另写一个复制函数。)
- C++对象构造函数与析构函数的调用时间问题(Good)
- C++对象构造函数与析构函数的调用时间问题
- C++对象构造函数与析构函数的调用时间问题
- C++对象构造函数与析构函数的调用时间问题
- C++对象构造函数与析构函数的调用时间问题
- 构造函数与析构函数的调用时间顺序
- C++中构造函数与析构函数调用的时间点问题
- 关于构造函数,拷贝构造函数与析构函数的自动调用的问题分析
- C++里类的构造函数与析构函数的调用时间
- C++之析构函数和构造函数调用时间---补充(2)《Effective C++》
- 内嵌子对象时派生类构造函数与析构函数的调用顺序
- 构造函数和析构函数的调用问题
- 构造函数与析构函数的调用
- 浅谈构造函数与析构函数的调用顺序
- 浅谈构造函数与析构函数的调用顺序
- 构造函数与析构函数的调用次序
- 浅谈构造函数与析构函数的调用顺序
- 浅谈构造函数与析构函数的调用顺序
- 英伟达发布深度学习GPU训练系统DIGITS 5,自带图像分割与在线模型库
- Android studio 出现 Unsupported major.minor version 52.0
- oracle 11g 搭建RAC遇到的诸多问题(2)
- QualComm Android5.1 Camera浅谈-HAL
- 消息列表头像加载优化,防止tabelView卡顿
- C++对象构造函数与析构函数的调用时间问题(Good)
- Xcode因为证书问题经常报的那些错
- 24. Swap Nodes in Pairs (java实现)
- git学习指南
- 计算机视觉界CV牛人牛事
- linux 常用命令
- java和flex的通信 java flex
- -webkit-,-moz-,-ms-,-o-具体指什么了?
- ORM 框架之 greenDAO 使用心得