java没有指针和析构所以_Java程序员学习C++之构造函数和析构函数调用的时机
今天看书忽然对这个地方有点模糊,尤其是析构函数在调用默认的析构函数和用户自己覆写的析构函数的时候有点意识模糊呢。写段代码总结下
#include
usingnamespacestd;
classBox
{
private:
doublelength;
public:
Box(doublelv=1.0):length(lv)//构造函数都没有返回值
{
cout <
}
~Box()//重写的析构函数(重写是对继承类对基类的重新构造,这里表述不对)
{
cout <
}
};//万恶的分号,我老是忘掉
1、首先直接声明(定义)看下
//很多朋友指出我这里用声明不合适,在11楼作了一定解释,具体不在这里赘述,这里改为“定义”,谢谢大家的指正,但我也保留我自己的意见,所以没有把“声明”去掉
intmain()
{
Box box(2.3);
}
这里看到一点java与c++的不同点,c++在声明的时候就创建了对象,java声明只是创建一个引用,并不会分配内存。言归正传,说明声明以后就调用了构造函数,然后退出的时候调用析构函数。
2、声明指针
intmain()
{
Box *box;
}
可以看到,声明指针并不会调用构造函数,也不会分配内存空间。
3、用new创建
intmain()
{
Box *box=newBox(2.3);
}
仅仅是调用构造函数创建了对象,分配了内存空间。但是没有调用析构函数,因为box指定的对象的内存是由new来创建分配的,编译器不能够自动调用析构函数将其删除。所以需要调用delete才可以。
4、用new创建对象,并delete掉
intmain()
{
Box *box=newBox();
deletebox;
}
这次调用了析构函数。可以看出,此时的析构函数不是编译器自己调用的,是由我们的程序来主动调用的,所以以后需要注意。new了的需要手动释放内存空间
5、什么时候需要重写析构函数?
classMessage()
{
private:
char*message;
public:
Message(constchar* text="default message")
{
message = newchar[strlen(text)+1];
strcpy(message, text);
}
voidshowit()
{
cout <
}
~Message()
};
Message::~Message()
{
cout <
delete[] message;
}
从例子可以看到,当你的构造函数中调用了new来创建对象的内存分配空间,则需要专门调用delete来释放内存,所以此时需要覆写析构函数,来专门的释放此内存空间
6、对象的形参传值问题:(话外题,仅作记录用)
先看代码及运行结果
#include
usingnamespacestd;
classBox
{
private:
doublelength;
public:
Box(doublelv=1.0):length(lv)//构造函数都没有返回值
{
cout <
}
~Box()
{
cout <
}
voidshowit()
{
cout <length <
}
};
voiddisplay(Box box)//关键注意这个地方。。。。。。。。。。。。。。。。。。。。。。。。。
{
box.showit();
}
intmain()
{
Box box;
display(box);
}
运行结果
如果将上面的display代码改为
voiddisplay(Box &box)//改为调用的是引用
{
box.showit();
}
运行结果
可以明显的看到不加引用的时候会出现两个析构函数的调用。为什么呢?
直接传参,是形参传递,所以会另外创建一个对象来复制main函数里的对象box,所以在display调用完成时刻要调用析构函数来释放这个函数创建的形参对象的内存空间。但是如果是传递的引用,就只有一个参数对象了,所以只调用一个。
如果是平时的基本类型,你应该了解,直接把main里的box的值复制给形参box就是了,但是到了对象这里就有点复杂,如果是里面就是单纯的像上面的例子一样double类型等,其自带有复制函数就可以将各个成员值复制到形参对象里,但是如果里面有引用,比如char *pp = new char[100],那么复制的只是地址,两个对象公用一个地址,有可能就会造成错误。所以以后需要注意这一点,调用对象需要用引用哦。。。。。(要不你自己另写一个复制函数。)
java没有指针和析构所以_Java程序员学习C++之构造函数和析构函数调用的时机相关推荐
- java在容器中导入图片_Java程序员必学技术:@Import直接导入类,在容器@Configuration、@Component中是怎么直接导入类注册到容器的?...
Java程序员必学技术:@Import直接导入类,在容器@Configuration.@Component中是怎么直接导入类注册到容器的? Spring IoC 容器是一个管理 Bean 的容器,在 ...
- Java需要掌握的底层知识_java程序员需要知道的底层知识(一)
首先给自己一个介绍,本人是一个蠢笨蠢笨的女程序员,由于有一天突然觉悟了,想在学习的过程中写一些笔记,以前一直不敢开始这个事情,因为我害怕写错了,误导了别人,现在还是害怕,如果真的误导了同行,你们也轻点 ...
- java中10d是什么意思_java程序员面试自我介绍
java程序员面试自我介绍 当面试考官随便地问你:"谈谈你自己的情况如何?"这是面试中的第一个问题.此刻,你应把在此之前所有紧张不安的情绪稳定下来.因为这个问题,应试者已经做了充分 ...
- java 数学公式解析框架有哪些_java程序员该如何进阶?这份java中高级核心知识全面解析请收好...
<Java中高级核心知识全面解析>是整理收录GitHub50K+Star以上的高质量学习文档,前前后后花了近半个月的时间,终于整理而成.包含了Java基础.网络.Linux.数据结构与算法 ...
- java中级招聘要求怎么写_Java程序员如何进阶,一般招聘都有哪些要求?
原标题:Java程序员如何进阶,一般招聘都有哪些要求? 作为当前市场上应用领域最广.人才需求最大的编程语言,Java一直是人们入行IT行业的选择.然而,随着大批量的人涌入Java开发行业,企业的招聘门 ...
- 尤其是java程序员(转载)_JAVA程序员 学习任务(转载)
1. 你需要精通面向对象分析与设计(OOA/OOD).涉及模式(GOF,J2EEDP)以及综合模式.你应该了解UML,尤其是class.object.interaction以及statediagram ...
- java中用于选择按钮的语句_java程序员考试套题1
Java练习一 一.选择题 1.在Java中,下列()方法可以把JFrame对象jFrame的布局管理器设为FlowLayout 类型. A.jFrame.setLayout(new FlowLayo ...
- java resource放入的文件没有生成在classes中_JAVA程序员学习笔记----mybatis深入剖析...
Java中提到持久层框架,相信没有人不知道mybatis的存在,相对于JDBC她多了一份干练(jdbc工作量大),相对于Hibernate她又多了一份灵动(HQL虽然方便,但太呆板).今天我们就一起走 ...
- Java需要掌握的底层知识_Java程序员应该掌握的底层知识
缓存 缓存行: 缓存行越大,局部性空间效率越高,但读取时间慢 缓存行越小,局部性空间效率越低,但读取时间快 取一个折中值,目前多用: 64字节 public class CacheLinePaddin ...
最新文章
- 论大型信息系统集成项目的成本管理
- ASP.NET 2.0 中的 Theme 功能
- 《设计原本—计算机科学巨匠Frederick P. Brooks的反思》一一第 2 章 工程师怎样进行设计思维―理性模型 2.0...
- “添加删除WIndows组件”中没有IIS时安装IIS方法
- 初学linux网络服务之DHCP实验
- TensorFlow之Numpy(3)
- java 视频播放_java创建简易视频播放器
- winyyy sys hcpidesk sys mtlrd sys uldfhjfh sys servets exe等1
- varbinary mysql,如何在MySQL中存储varbinary?
- 软件工程-软件测试和系统运维
- 整理--Linux驱动框架概念之LED
- 忆过去 想未来 人有情
- react + zarm 实现账单列表展示页
- iOS基础:Xcode 添加PCH文件、常用预处理指令(移除程序中的identifier、发布模式关闭NSLog、导出和隐藏符号)
- cloudflare免费证书_新Cloudflare:免费CDN+免费SSL证书轻松搞定https
- Zookeeper的Centos集群搭建
- 数字孪生教程大全之 我们如何构建数字孪生?数字孪生的五个级别都是什么
- 考研英语(一、二)应用文(小作文)写作模板—中公考研
- 丹枫虽老犹多态 – 继承与多态
- unity 发光字体_[转载]Unity3D做彩色的字体的详细教学