从技术角度说,OOP(面向对象程序设计)只是涉及抽象的数据类型、继承以及多形性,但另一些问题也可能显得非常重要。本节将就这些问题进行探讨。
最重要的问题之一是对象的创建及破坏方式。对象需要的数据位于哪儿,如何控制对象的“存在时间”呢?针对这个问题,解决的方案是各异其趣的。C++认为程序的执行效率是最重要的一个问题,所以它允许程序员作出选择。为获得最快的运行速度,存储以及存在时间可在编写程序时决定,只需将对象放置在堆栈(有时也叫作自动或定域变量)或者静态存储区域即可。这样便为存储空间的分配和释放提供了一个优先级。某些情况下,这种优先级的控制是非常有价值的。然而,我们同时也牺牲了灵活性,因为在编写程序时,必须知道对象的准确的数量、存在时间、以及类型。如果要解决的是一个较常规的问题,如计算机辅助设计、仓储管理或者空中交通控制,这一方法就显得太局限了。
第二个方法是在一个内存池中动态创建对象,该内存池亦叫“堆”或者“内存堆”。若采用这种方式,除非进入运行期,否则根本不知道到底需要多少个对象,也不知道它们的存在时间有多长,以及准确的类型是什么。这些参数都在程序正式运行时才决定的。若需一个新对象,只需在需要它的时候在内存堆里简单地创建它即可。由于存储空间的管理是运行期间动态进行的,所以在内存堆里分配存储空间的时间比在堆栈里创建的时间长得多(在堆栈里创建存储空间一般只需要一个简单的指令,将堆栈指针向下或向下移动即可)。由于动态创建方法使对象本来就倾向于复杂,所以查找存储空间以及释放它所需的额外开销不会为对象的创建造成明显的影响。除此以外,更大的灵活性对于常规编程问题的解决是至关重要的。
C++允许我们决定是在写程序时创建对象,还是在运行期间创建,这种控制方法更加灵活。大家或许认为既然它如此灵活,那么无论如何都应在内存堆里创建对象,而不是在堆栈中创建。但还要考虑另外一个问题,亦即对象的“存在时间”或者“生存时间”(Lifetime)。若在堆栈或者静态存储空间里创建一个对象,编译器会判断对象的持续时间有多长,到时会自动“破坏”或者“清除”它。程序员可用两种方法来破坏一个对象:用程序化的方式决定何时破坏对象,或者利用由运行环境提供的一种“垃圾收集器”特性,自动寻找那些不再使用的对象,并将其清除。当然,垃圾收集器显得方便得多,但要求所有应用程序都必须容忍垃圾收集器的存在,并能默许随垃圾收集带来的额外开销。但这并不符合C++语言的设计宗旨,所以未能包括到C++里。但Java确实提供了一个垃圾收集器(Smalltalk也有这样的设计;尽管Delphi默认为没有垃圾收集器,但可选择安装;而C++亦可使用一些由其他公司开发的垃圾收集产品)。
本节剩下的部分将讨论操纵对象时要考虑的另一些因素。
对象的创建和存在时间
时间: 2025-01-30 04:22:49
对象的创建和存在时间的相关文章
JS之Date对象和获取系统当前时间详解
本篇文章主要是对JS之Date对象和获取系统当前时间进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 一.Date对象 每天一对象,今天来看看Date对象,相对于时间大家一定很熟悉,应为以前在网站中很多地方都会遇到这样的时间特效.温故而知新,今天我们来回忆一下Date对象. 我们首先来看看他的定义: dateObj = new Date() dateObj = new Date(dateVal) dateObj = new Date(year, month, date[, hour
jms 创建连接-JMS 创建连接超时时间设置
问题描述 JMS 创建连接超时时间设置 如下,我用jms创建了一个连接 Connection connection = null; JmsFactoryFactory ff; try { ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER); JmsConnectionFactory cf = ff.createConnectionFactory(); // Set the properties cf.setStringPro
浅析Java中对象的创建与对象的数据类型转换_java
Java:对象创建和初始化过程 1.Java中的数据类型 Java中有3个数据类型:基本数据类型(在Java中,boolean.byte.short.int.long.char.float.double这八种是基本数据类型).引用类型和null类型.其中,引用类型包括类类型(含数组).接口类型. 下列语句声明了一些变量: int k ; A a; //a是A数据类型的对象变量名. B b1,b2,-,b10000;// 假定B是抽象类或接口. String s; 注意:从
MFC教程(5)-- MFC对象的创建(1)
MFC对象的创建 前面几章介绍了MFC的核心概念和思想,即介绍了MFC对Windows对象的封装方法和特点:MFC对象的动态创建.序列化:MFC消息映射机制. 现在,考查MFC的应用程序结构体系,即以文档-视为核心的编程模式.学习本章,应该弄清楚以下问题: MFC中诸多MFC对象的关系:应用程序对象,文档对象,边框窗口对象,文档边框窗口对象,视对象,文档模板对象等. MFC对象的创建和销毁:由什么对象创建或销毁什么对象,何时创建,何时销毁? MFC提供了那些接口来支持其编程模式? MFC对象的关
MFC教程(5)-- MFC对象的创建(2)
从这些图中可以看到何时.何处调用了什么消息处理函数和虚拟函数,这些函数用来作了什么事情.必要的话,程序员可以在派生类覆盖它们. 在创建工作完成之后,进行初始化,使用文档对象的数据来更新视和显示窗口. 至此,本节描述了MFC的SDI程序从分析命令行到创建或打开文件的处理过程,文档对象已经动态创建.总结如下: 命令行分析→应用程序的FileNew→文档模板的OpenDocumentFile(NULL)→文档的OnNewDocument 命令行分析→应用程序的FileOPen→文档模板的OpenDoc
内核对象的创建和使用
1.进程内核对象句柄表 2.创建与关闭内核对象 3.进程间内核对象句柄的共享 1.进程内核对象句柄表 当一个进程初始化时,系统会为它分配一张内核对象句柄表.这个表只用于管理内核对象句柄.GDI和用户对象不会影响到这张表.表中的每一项有4个域. 即句柄ID,对象内存地址,访问屏蔽位,标志位. 当一个进程初始化时,句柄表为空. 现在假设你调用CreateFile函数创建一个文件对象,内核首先会查找当前进程中的句柄表,将一个空的表项取出来,并分配一个内核对象,将该对象的地址写入第二个域(
内部类对象创建是否依赖外围类对象的创建
问题描述 今天看到<ThinkinginJava>有关于内部类对象的一些特性的总结时遇到一个问题:P205上说:创建内部类对象的时刻不依赖于外围类对象的创建.但是书上也有说内部类对象的创建必须依赖于外围类对象,在拥有外部=围类对象之前是不可以创建内部类对象的.那么,当你在创建内部类对象的时刻之前外部类对象如果没有被创建呢?这句话还成立么? 解决方案 解决方案二:看你是不是静态内部类了解决方案三:静态内部类是嵌套类,我说的是内部类.
viratualbox-安装virtualbox之后,不能打开,出现提示严重错误:com对象无法创建。
问题描述 安装virtualbox之后,不能打开,出现提示严重错误:com对象无法创建. 不会插图片. 错误明细是: RC:E_NOINTERFACE (0x80004002) 电脑系统是win7,原来也装过virtualbox,然后因为新建的虚拟机无法导入于是换了一个版本安装,然后现在连virtualbox也打不开了.网上搜索有说是win7兼容问题,换别的兼容运行还是起不来,求教具体的解决方法,谢谢! 解决方案 系统它有问题吧,跟vb冲突了
转	cocos2d-x 3.0 常用对象的创建方式
cocos2d-x 3.0 中所有对象几乎都可以用create函数来创建,其他的创建方式也是有create函数衍生. 下面来介绍下create函数创建一般对象的方法,省得开发中经常忘记啥的. 1.精灵Sprite的4种创建方式 (1)根据图片资源路径来创建 ? 1 2 3 4 //根据图片路径来创建 auto sprite1 = Sprite::create(filepath); //根据图片路径来创建,并设置要显示的图片大小 auto sprite2 = Sprite::create(file