tbwshc

tbw

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  95 Posts :: 8 Stories :: 3 Comments :: 0 Trackbacks

常用链接

留言簿(4)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

#

如何实现数据库共享
想请教如何让多台机器使用同一个程序,访问同一个数据库,进行比如增删改查之类的操作
网上说要建立服务器什么的,能有大神说的具体一点么,刚开始实习,这方面还不是很懂,求指导

------解决方案--------------------------------------------------------
c/s模式,可以看看数据库相关的书
------解决方案--------------------------------------------------------
一个数据库服务器,安装数据库
N个客户端,运行你写的程序,连到数据库服务器上,对数据进行操作

这其实就是单机版程序和网络版程序的区别

网络版程序要注意对数据事务的控制,注意并发操作
------解决方案--------------------------------------------------------
用一台电脑安装上数据库作为服务器,然后在客户端运行你写的程序就可以了,TB进程序时对数据库进行连接就可以操作数据了,注意对事务的控制,及时提交或回滚。
posted @ 2012-08-25 12:17 tbwshc| 编辑 收藏

【51CTO精选译文】对于09年9月发布的Oracle 11g R2,51CTO之前已经对其新特性进行了一番概述。之前我们介绍了Oracle 11g R2的数据仓库性能的增强,下面我们将介绍Oracle 11g R2中数据卫士的增强特性:

备用数据库管理得到改善。数据卫士专门为数据仓库业务进行了改进,Oracle 11g R2为备用数据库提供了许多管理功能,包括物理备用,逻辑备用和快照备用数据库。

集成应用程序故障转移。早期的数据卫士提供了相对快速的应用程序会话故障转移,tb在切换和故障转移期间使用了透明应用程序故障转移(Transparent Application Failover,TAF)功能,但Oracle 11g R2现在提供了快速应用程序通知(Fast Application Notification ,FAN)功能,使得应用程序故障转移更快了。

实时应用和滞后应用限制。作为独立许可活动数据卫士选项的一部分,Oracle 11g R1提供了实时实时应用功能(实时应用重做日志到物理备用数据库,即使它处于只读打开状态),和实时查询(当重做日志正在应用时,查询只读备用数据库的功能)功能遥相呼应,它为只读数据仓库使用基本的复制提供了一个可选方案,但有一个重要的异常:没有办法应对物理备用数据库上的重做日志的任何重大延迟。Oracle 11gR2提供了一个新的会话级参数STANDBY_MAX_DATA_DELAY,它指定一个可接受的延迟时间(单位:秒),如果数据因超时变得无效,Oracle 11g R2会简单地拒绝执行查询,直接抛出一个异常(ORA-03172)。

支持压缩表和SecureFiles。Oracle 11g R2现在完整支持应用程序的重做和逻辑备用数据库,主数据库要么使用基本的表压缩(DSS),要么使用高级表压缩(OLTP),因为LogMiner也支持重做条目的转换,此外,LogMiner和SQL应用现在支持含有SecureFile LOB的逻辑备用数据库上的应用程序重做。

【51CTO.com译稿,非经授权请勿转载。合作站点转载请注明原文译者和出处为51CTO.com,且不得修改原文内容。】

posted @ 2012-08-18 13:07 tbwshc| 编辑 收藏

自动化块恢复。依笔者之浅见,Oracle 10gR1的引入的块级介质恢复(MBR)已经让人们非常信服,至少人们开始考虑使用RMAN代替过时的ALTER TABLESPACE … BEGIN BACKUP方法备份数据库。MBR意味着当只需要恢复一小部分数据块时,人们不再需要还原和恢复一个完整的数据文件了。Oracle 11g R2现在让MBR自动化了,如果数据文件检查出有一个或多个损坏的数据块,RMAN将会自动还原和恢复这些数据块,DBA不用做任何事情。如果数据卫士的实时查询模式是开启的,Oracle 11g R2可以检查对应的物理备用数据库,查找最近的未遭受破坏的数据块版本,并将这个完好的数据块传输到主数据库。

灵活的SET NEWNAME指令。如果你还没有数据文件的名单,在使用RAMN,DUPLICATE DATABASE或表空间指定时间点恢复还原一个数据库到一个不同的平台或文件系统时,你就知道多么欢迎这些新特性了,Oracle 11g R2现在可为数据文件名接受表空间级或数据库级的FORMAT规范,此外,现在可以列出一个唯一标识符(%U)或基础名字(%b),然新的数据文件名更加规范。

无目标数据库复制。在早先的数据库版本上克隆一个数据库需要连接到目标数据库,tb总是有点不方便,因为目标数据库可能不可用,Oracle 11g R2现在通过DUPLICATE DATABASE命令可以对任何选定的数据库执行无目标的复制,但它仍然会产品一个AUXILIARY连接到最终复制的数据库,当然,现在恢复一个目录数据库也需要一个CATALOG连接。无目标复制也需要指定NOREDO和UNDO TABLESPACE指令,因为没有办法检查源数据库是否处于ARCHIVELOG模式,以及哪个源数据库的表空间是UNDO表空间。

增强的TSPITR。Oracle 11g R2移除了表空间指定时间点恢复(Tablespace Point-In-Time Recovery,TSPITR)的某些限制,提供了一个非常有用的工具恢复表空间,可以恢复到表空间之前的某个时间点的状态,不管恢复目录是否可用,TSPITR现在恢复任意多个时间点,对于删除的表空间,TSPITR一样可以恢复。

备份到云。毫无疑问,未来最火热的技术将是云计算,Oracle 11g R2现在可以将数据库备份到亚马逊的简单存储服务(Simple Storage Service,S3)上,需要使用Oracle提供的安全备份介质管理层软件。

【51CTO.com译稿,非经授权请勿转载。合作站点转载请注明原文译者和出处为51CTO.com,且不得修改原文内容。】

posted @ 2012-08-18 13:06 tbwshc| 编辑 收藏

2009年9月Oracle公司发布了期待已久的Oracle 11g R2,本系列文章将给读者一一揭开新版本中的新特性,并会介绍企业如何利用这些新特性将现有的Oracle 9i,10g,11g R1升级到Oracle 11g R2.

经历了难以忍受的长时间等待,Oracle公司突然在9月1发布了Oracle 11g R2,我不得不承认Oracle的保密工作做得多么好,我相信Oracle公司选择这个时候发布时为了刺激参加Oracle OpenWorld 2009大会的人兴奋和期待。

经过四处搜索Oracle 11g R2新特性文档,并体验了新的OUI(Oracle通用安装程序),创建了我的第一个单实例RAC后,我总结一下Oracle 11g R2中我最喜欢的五大新特性。在后面的文章中我将陆续介绍其它新特性,请锁定本系列文章。

NO.1 随处可见的集群

在以前的版本中,Oracle Clusterware必须要独立地安装在它自己的ORACLE HOME中,并且也只能在RAC环境下使用,这一切在Oracle 11g R2得到彻底颠覆,因为在这个版本中支持安装Oracle网格基础架构,而且只需要一个独立的ORACLE HOME,它包括了Oracle Clusterware和Oracle自动存储管理(ASM)。通过升级后的Oracle通用安装程序安装了网格基础架构后,你将会看到一个全新的功能和服务矩阵,我简单地列举几个吧:

单实例RAC(Oracle重启):听起来似乎自相矛盾,但Oracle 11g R2扩展了Oracle Clusterware的功能,为任何单实例提供了高可用特性,本质上是将数据库变成了单实例RAC数据库。Oracle 11g R2中的Oracle重启特性帮助Oracle网格基础架构的高可用服务控制服务器重启时哪一个监听器,ASM实例和数据库应该启动,它完全取代了过去DBA们经常用到的DBSTART脚本。同样,当单个数据库实例崩溃或其它异常终止时,Oracle重启功能会自动监测失效的实例,并自动重启它,就好像是在一个真实的RAC环境中一样。

SRVCTL升级:如果你管理过旧版本的RAC环境,你可能已经熟悉了RAC环境中的维护工具SRVCTL,在11g R2中,该工具被扩展了,现在可以管理单实例RAC,以及监听器和ASM实例。

集群时间同步服务:Oracle 11g R2现在需要在所有RAC节点上配置时间同步,如果你曾经经历过某个节点被驱逐出RAC集群配置,你一定知道其难度有多大,特别是两个服务器的时间不同步和日志文件的时间戳不同步时,Oracle之前的版本借助系统提供的网络时间协议(NTP)同步所有节点时间,但这需要连接到互联网上的标准时间服务器,作为NTP的替代者,Oracle 11g R2提供了一个新的集群时间同步服务,确保集群中的所有节点的时间都保持一致。

网格即插即用:在以前的版本中,配置RAC最复杂的部分是确定和设置所有节点都需要用到的公共ip地址,私有ip地址和虚拟ip地址。为了简化RAC的安装,Oracle 11g R2提供了一个全新的网格名称服务(GNS),它和域名服务器协作,处理每个网格组件的ip地址分配,当集群环境跨越多个数据库时这个新特性极其有用。

干净地卸载RAC组件:如果你曾经尝试过删除多个节点上的所有RAC痕迹,那一定会钟情于这项新特性,在Oracle 11g R2中,所有安装和配置助手,特别是Oracle通用安装程序(OUI),数据库配置助手(DBCA)和网络配置助手(NETCA),都得到了增强,当需要卸载RAC组件时,可以保证卸得干干净净。

NO.2 ASM加入了集群

Oracle 11g R2 ASM充满了许多吸引人的新特性,对于初学者来说,ASM和Oracle 11g R2 Clusterware安装在同一个Oracle Home下,因此消除了之前推荐的冗余Oracle Home安装方法,并且ASM也从DBCA脱离出来了,有了专门的自动存储管理配置助手(ASMCA)。下面是我认为最有趣的ASM新特性:

智能化数据布局:在之前的版本中,要配置ASM磁盘可能需要存储管理员的参与,需要配置磁盘I/O子系统,Oracle 11g R2提供了ASM分配单元,可以直接受益于磁盘外缘柱面,获得更快的速度,可以将数据文件,重做日志文件和控制放在磁盘外缘获得更好的性能。

EM支持工作台扩展:在这个版本中对Oracle 11g R1引入到企业管理控制台中的自动诊断仓库(ADR)进行了扩展,包括支持ASM诊断,将所有诊断信息打包直接发送给Oracle技术支持,以便获得更快速的ASM性能问题解决方案。

ASMCMD增强:自动存储管理命令行实用工具(ASMCMD)也获得了不少增强,包括:

1)启动和停止ASM实例;

2)备份,恢复和维护ASM实例的服务器参数文件(spfile);

3)实用iostat监控ASM磁盘组的性能;

4)维护新的ASM集群文件系统(ACFS)中的磁盘卷,目录和文件存储,我的下一个话题就是它。

NO.3 ACFS – 一个强健的集群文件系统

Oracle之前也发布过集群文件系统(OCFS),之后又发布了增强版OCFS2,它让Oracle RAC实例可以通过共享存储读写数据库文件,重做日志文件和控制文件。

此外,OCFS也允许RAC数据库的Oracle集群注册文件(OCR)和表决磁盘存储在集群文件系统中,在Oracle 10g R2中,这个需求被取消了,OCR文件和表决磁盘可以存储在裸设备或裸块设备中,如果你曾经在原始设备上丢失过这些文件的所有副本,你一定了解要恢复它们是多么繁琐,因此,在Oracle 11g R2中,将不再支持将这些文件存储在裸设备上。

为了提高这些关键文件的存活能力,Oracle 11g R2正式引入了一种新的集群文件系统,称之为ASM集群文件系统(ACFS),在RAC环境中,ACFS可以为OCR文件和表决磁盘提供更好的保护,它允许创建五份OCR文件副本,之前的集群文件系统仅允许保存两份OCR文件,一个主OCR,一个镜像OCR,但ACFS不适合单独的RAC环境,除此之外,几乎所有与操作系统和数据相关的文件都可以从ACFS的安全性和文件共享特性受益。

动态卷管理器:Oracle 11g R2提供了一个新的ASM动态卷管理器(ADVM)来配置和维护存储在ACFS文件系统中的文件,使用ADVM可以在ASM磁盘组内构建一个ADVM卷设备,管理存储在ADVM卷设备中的文件,以及按需调整ADVM卷设备空间大小,最重要的是,因为ADVM是构建在ASM文件系统架构之上的,可以保证存储在这些卷中的文件受到良好的保护,不会出现意外丢失,因为ASM提供了类似RAID的磁盘阵列的功能。

文件访问控制:使用传统的Windows风格访问控制列表(ACL)或Unix/Linux下的用户/组/其它访问权限风格为ACFS目录和文件授予读,写和执行权限,可以通过图形化的企业管理控制台或命令行程序ASMCMD管理ACFS目录和文件安全。

文件系统快照(FSS):Oracle 11g R2通过它的文件系统快照(FSS)功能可以对ACFS文件系统执行快照,一个快照是所选ACFS文件系统的一个只读副本,对相同的ACFS,它会自动保留63个独立的ACFS快照,当某个ACFS文件被不经意地更新,删除或其它危险操作时,这个特性非常有用,利用11g R2企业管理控制台或ACFS acfsutil命令行工具可以找出该文件合适的版本并执行恢复。

NO.4 改善的软件安装和打补丁过程

我发现作为一名DBA压力最大的活就是给Oracle数据库打补丁了,如果补丁可能会引入对数据库有害的行为,我不得不花费大量的时间和精力来确定和审核,因此我对Oracle 11g R2中提供的新功能感到很欢喜。

集群验证实用程序集成:从Oracle 10g开始引入了集群验证实用程序(CVU),现在已经完全集成到Oracle通用安装程序(OUI)和其它配置助手(如DBCA,DBUA)中了。

零停机修补的集群:当为Oracle集群打补丁时,Oracle 11g R2在一个不合适的位置升级方式应用补丁,这意味着会有两个Oracle Home,其中一个专门用来存放补丁的,但一次只能激活一个Oracle Home,在Oracle 11g R2中不用再为升级全部关闭Oracle集群了,tb实现真正的零停机打补丁。

NO.5 DBMS_SCHEDULER升级

古老的DBMS_SCHEDULER包得到了彻底的更新,DBA经常使用这个包来调度作业。

文件监视器:以前的版本无法在批处理过程中检测大多数触发事件,如检测一个文件抵达某个目录,在Oracle 11g R2中,使用新的文件监视器可以缓解这个问题,一旦预期的文件抵达目录,DBMS_SCHEDULER现在就可以检测到了,并在新的对象类型SCHEDULER_FILEWATCHER_RESULT中注册它的到来,它通过新的CREATE_FILE_WATCHER存储过程向DBMS_SCHEDULER发送一个信号触发作业。

内置的email通知:无论何时,DBMS_SCHEDULER调度任务启动、失败或完成时,任务的状态可以立即通过email发送出去,虽然在以前的版本中也能实现这个功能,但要么调用DBMS_MAIL存储过程,要么调用DBMS_SMTP存储过程,现在这个功能合并到DBMS_SCHEDULER中了。

远程作业:DBMS_SCHEDULER现在允许DBA在远程数据库上创建和调度作业,现在我终于可以在生产库PROD03上通过DBMS_SCHEDULER调用生产库DBMS_SCHEDULER上的存储过程执行任务了,这意味着我现在可以在tb一台数据库上集中创建和维护调度任务了。

多作业目标:最后,现在可以在多个数据库实例上同时调度DBMS_SCHEDULER任务了,在RAC环境中,这个特性非常有用,因为我可以利用多个数据库实例将长时间运行任务分成几部分,分别在不同的数据库实例上执行更小的任务。

posted @ 2012-08-18 13:05 tbwshc| 编辑 收藏

【51CTO精选译文】在之前几篇文章中,51CTO对Oracle 11g R2的几大新特性进行了简略的描述(参考Oracle 11g专题)。最后,我们来进行一些总结,介绍Oracle 11g R2当中新增的几个不是很大,但是也相当不错的特性。

基于版本的重定义

Oracle 11g R2增加了一个强大的新工具,它可以检出应用程序数据库对象的任一版本,不是所有数据库对象都支持版本化管理,但私有的同义词,视图和几乎所有的PL/SQL对象,包括存储过程、函数、类型、类型主体、包、包主体和触发器,版本化管理的真正好处是简化了部署一个修改版本的应用程序代码到生产数据库,如果部署时遇到一系列的错误,可以很容易地将所有影响的对象回滚到上一个版本。

消除了闪回数据归档上的DDL限制

在前一篇文章中,我深入研究了Oracle 11g R1的新特性“闪回数据归档(Flashback Data Archive,FBDA)”,它也被称为“全部召回(Total Recall)”,它只捕获变化的数据,将这些数据放在一套特殊的对象中,它们构成了FBDA,当用户通过闪回版本查询(Flashback Versions query)查询表的历史记录时,Oracle将会直接从数据库的UNDO表空间返回最近变化的数据,从FBDA返回更旧的数据。

虽然这个特性很好,但在早期版本中也有很多限制,包括增加、修改、重命名、删除表的列、truncate表、修改表的约束、以及修改分区表的分区规范,在Oracle 11g R2中,这些限制全部没有了,对于更复杂的DDL操作,如使用DBMS_REDEFINITION包重定义已经存储到FBDA的基础表,Oracle 11g R2提供了新的DBMS_FLASHBACK_ARCHIVE包,存储过程DISASSOCIATE_FBA将会把基础表从FBDA中分离出来,一旦请求的改变完成,存储过程REASSOCIATE_FBA会被用来重新关联修改的表和基础表。

按需创建分段

在之前的版本中,使用CREATE TABLE语句创建表时,会同时自动创建表的初始段,从Oracle 11gR2开始,这个默认的行为有所变化,创建表时不会创建初始段,直到有数据插入到这个表。此外,任何依赖于该表的索引或LOB段也不会创建,tb直到有数据插入才会创建,表的SEGMENT CREATION DEFERRED存储属性指定了这个默认行为,但可以使用SEGMENT CREATION IMMEDIATE属性覆盖它。

不可用索引大小归零

在重新载入大表时,比如一个有上百万行的数据仓库事实表,要提高这种表的加载速度,最简单的办法是将该表上的所有索引置为不可用,在数据加载完毕后,在重建这些索引,Oracle 11g R2认可了这一做法,并采取了实质性的措施,当索引被标记为不可用时,它会自动删除所有索引段。

小结

Oracle 11g R2延续了自Oracle 10g以来令人称道的自我管理,自我调整,自我治愈的特性,这个新版本提供了太多的新特性,有些是迟来的功能,有些是革新,Oracle DBA可以借助这些新特性提高工作效率,成为一名真正的“信息工程师”。

posted @ 2012-08-18 13:04 tbwshc 阅读(1098) | 评论 (0)编辑 收藏

(转载)C++教程网www.cppcourse.com

这是一个C++单件模式板类的一种实现,这个类的实现有别于传统的用继承或者宏的方式来实现。
这里的singleton_holder实际上是类的包装器。

template <typename T>
class singleton_holder
{
public:
    typedef T obj_type;
    static T& instance()
    {
        static T obj;
        return obj;
       
    }
   
private:
    singleton_holder();
    singleton_holder(const singleton_holder& s);
    singleton_holder& operator=(const singleton_holder& s);
    ~singleton_holder();
         
};

 

class application_impl
{
public:
    void run()    
    {
        std::cout<<this is a testb<<std::endl;
    }
        
}

typedef singleton_holder<application_impl> application;
void main()
{
    application::obj_type& app = application::instance();
    app.run();
}

posted @ 2012-08-12 12:48 tbwshc| 编辑 收藏

(转载)C++教程网www.cppcourse.com

面向对象的程序设计方法要求语言必须具备抽象、封装、继承和多态性这几个关键要素。

面向对象程序设计,是通过为数据和代码建立分块的内存区域,以便提供对程序进行模块化的一种程序设计方法。对象是计算机内存中的一块区域,通过将内存分块,每个模块(即对象)在功能上相互之间保持相对独立。

这些内存模块中不但存储数据,而且也存储代码,这对保证对象是受保护的这一点很重要,只有对象中的代码才可以访问存储于这个对象中的数据,这清楚地限定了对象所具有的功能(即一个对象在一个软件中所能起到的作用),并使对象保护它自己不受未知的外部其它的事件的影响,从而使自己的数据和功能不会因此遭到破坏。

在面向对象的程序中,对象之间可以通过函数调用实现相互通信。一个对象可以调用另一个对象的函数,处于对象外部的代码就没有机会通过直接修改对象的内存区域。当对象的一个函数被调用时,对象执行其内部代码来响应这个调用,这使tb对象呈现出一定的行为。行为及其结果就是该对象的功能。对象被视为能做出动作的实体,动作在对象相互作用时被激发,换句话说,对象就像在宿主计算机上拥有数据和代码,并能相互通信的具有特定功能的一台较小的计算机。

抽象

面向对象鼓励程序员以抽象的观点看待程序,即程序是由一组抽象的对象组成的。另一方面,我们又可以将一组对象的共同特征进一步抽象出来,从面形成“类”的概念。

抽象是一种从一般的观点看待事物的方法,它要求程序员集中于事物的本质特征,而不是具体细节或具体实现。面向对象鼓励程序员以抽象的观点看待程序,也就是说程序是一组抽象的对象-类组成的(严格讲,C++程序不是纯面向对象的,因为程序中还有像main这样的全局函数)。程序从一组对象为起来,抽取公共的行为放入到一个类中,这是抽象分类的观点,不同类的对象具有不同的行为。

类的概念来源于人们认识自然、认识社会的过程。在这一过程中,人们主要使用两种方法:由特殊到一般的归纳法和由一般到特殊的演绎法。在归纳的过程中,我们从一个个具体的事物中把共同的特征抽取出来,形成一个一般的概念,这就是“归类”;在演绎的过程中,我们又把同类的事物,根据不同的特征分成不同的小类,这又是“分类”。对于一个具体的类,它有许多具体的个体,我们就管这些个体叫做“对象”。

举个例子,“人”是一个类,具有“直立行走、会使用工具”等一些区别于其它事物的共同特征;而张三、李四、王五等一个个具体的人,就是“人”这个类的一个个“对象”。

封装

所谓数据封装,就是将一组数据和与这组数据相关的操作集合组装在一起,形成一个能动的实体,也就是对象。在这种情况下,用户是不可以直接操作数据的,他必须通过和数据相关的操作来访问数据。换句话说,数据封装就是给数据提供了与外界联系的标准接口,无论是谁,只有通过这些接口,使用规范的方式,才能访问这些数据。同时,由于客户端总是和接口打交道,他也就不必要了解数据的具体细节。

由此可见,封装要求一个对象应具备明确的功能,并具有接口以便和其它对象相互作用。同时,对象的内部实现(代码和数据)是受保护的,外界不能访问它们,只有局部于对象的代码才可以访问对象的内部数据。对象的内部数据结构的不可访问性称为数据隐藏。封装使得一个对象可以像一个部件一样用在各种程序中,而不用担心对象的功能受到影响。

早期的软件设计方法,把数据和程序混在一起,结构化很差,被细称为“一碗面条”的编程方法。在这一阶段程序的可读性与可维护性都很差,于是产生了“软件危机”,为了解除这种危机便提出了结构化程序设计。在结构化程序设计里,虽然程序被分为不同的模块,以便大大减少不同模块之间的相互作用,但数据仍然属于整个程序的。这就又存在着这样一个问题:一方面,程序员在设计每一个模块的时候,都要或多或少地作全局考虑,模块与模块之间的耦合度相对太高了,势必增加不同模块的程序员之间沟通所带来的工作量;另一方面,在某地方对数据的改动,有可能又对整个程序产生难以预料的影响。随着软件工程的进一步发展,软件越来越大,数据越来越多,这个问题也越来越突出。

数据封装的提出,就是为了解决这一问题。它一方面使得程序员在设计程序时可以专注于自己的对象,“各人自扫门前雪,莫管他人瓦上霜”,同时也切断了不同模块之间数据的非法使用,减少了出错的可能性。

继承

所谓继承是指一个对象可以获得另一个对象的特性的机制,它支持层次类这一概念。例如:红苹果属于苹果类,而苹果类又属于水果类。通过继承,低层的类只需定义特定于它的特征,而共享高层类中的特征。

多态

不同的对象可以调用相同名称的函数,并可导致完全不同的行为的现象称为多态性。利用多态性,程序中只需进行一般形式的函数调用,函数的实现细节留给接受函数调用的对象。这大大提高了我们解决复杂问题的能力。例如绘制三角形与绘制正方形所调用的绘制函数其效果肯定是不同的,但我们可以设计一个公共的Draw()函数代表绘制,而不同对象的绘制图形的具体细节则分别由具体对象负责实现。

posted @ 2012-08-12 12:47 tbwshc| 编辑 收藏

(转载)C++教程网www.cppcourse.com

第一种方法:

a = a + b;

b = a – b;

a = a – b;

第二种方法:

a=a^b;

b=a^b;

a=a^b;

或者

a^=b^=a^=b;

原理是:相同的两数相异为0,任何数与0相异保留不变

但不推荐这么使用,c FAQs里有说明,用异或准确来讲是undefined,Not portbably
Q: Here’s a slick expression:

a ^= b ^= a ^= b
It swaps a and b without using a temporary.
A: Not portably, it doesn’t. It attempts to modify the variable a twice between sequence points, so its behavior is undefined.

For example, it has been reported that when given the code

 int a = 123, b = 7654;
 a ^= b ^= a ^= b;

the SCO Optimizing C compiler (icc) sets b to 123 and a to 0.

posted @ 2012-08-12 12:46 tbwshc| 编辑 收藏

(转载)C++教程网www.cppcourse.com


何时用虚析构函数

class Base
{
public:
    Base();
    ~Base();
    …
};

class Derived : public Base
{
    …
};

Base *p = new Derived;
delete p;

这个例子中,基类指针p指向派生类对象,那么经由基类指针来释放该派生类对象,会导致资源泄漏。因为基类的析构函数不是虚的,delete p只会调用基类的析构函数,派生类的析造函数不会被调用。解决方法是将基类的析构函数改成虚析构函数。

那么什么时候该用虚析构函数呢?任何一个类只要带有virtbual函数,这意味着该类被设计为多态用途的基类,那么基本上这个类也应该有一个virtual析构函数。如果一个类不含virtual函数,通常表示它的设计意图是不被用作多态基类。当类不被当作基类或者不被用作多态性,令其析构函数为virtual是不好的做法。因为一个类有虚函数,类对象会增加一个虚表指针(virtual table pointer)来决定运行期间哪个虚函数该被调用。

另外析构函数还可以是纯虚析构函数。具有纯虚函数的为表示抽象类,如果某个类没有任何一个成员函数,又想将它设计成抽象类,就只能将析构函数作为纯虚的。如:
class Test
{
public:
    virtual ~Test() = 0;
}

// 虚析构函数的定义
virtual ~Test()
{
}
通常纯虚函数不需要提供定义,但是这边有个例外,纯虚析构函数必需给出实现体才能通过编译链接。析构函数析构函数析构的次序是最深层的派生类的析构函数先被调用,然后依次调用每一层的析构函数。所以编译器会在析构Test类的派生类的析构函数中创建一个对~Test()的调用动作,所以必须提供这个析构函数的定义。

posted @ 2012-08-12 12:45 tbwshc| 编辑 收藏

(转载)C++教程网www.cppcourse.com

new有三种用法:new operator、operator new、placement new

new operator

new operator是最常见的用法,如 Emp* e1 = new Emp;(Emp是一个类) 这里new有两种作用:分配空间、初始化对象(调用了构造函数)

operator new

operator new作用是只分配空间,不调用构造函数,如:Emp* e2 = (Emp*)operator new(sizeof(Emp));

placement new

placement new作用是在已分配好的空间上初始化对象,不分配空间,调用拷贝构造函数,如:new ((void *)e2) Emp(*tb1);

示例代码如下:

// Emp.h
#ifndef _EMP_H_
#define _EMP_H_

 

class Emp
{
public:
Emp();
Emp(const Emp& other);
~Emp();
};

#endif // _EMP_H_

// Emp.cpp

#include “Emp.h”
#include <iostream>
using namespace std;

Emp::Emp()
{
cout<<“Emp…”<<endl;
}

Emp::Emp(const Emp& other)
{
cout<<“Copy Emp…”<<endl;
}

Emp::~Emp()
{
cout<<“~Emp…”<<endl;
}

// main.cpp
#include “Emp.h”
#include <iostream>
void main()
{
using namespace std;
// new operator 分配空间,调用构造函数
Emp* e1 = new Emp;
// operator new 只分配空间
Emp* e2 = (Emp*)operator new(sizeof(Emp));
// placement new 不分配空间,调用拷贝构造函数
new ((void *)e2) Emp(*e1);
// 显示调用析构函数
e2->~Emp();
// 仅释放空间,不调用析构函数
operator delete(e2);
// 调用析构函数,释放空间
delete e1;

}

posted @ 2012-08-12 12:44 tbwshc| 编辑 收藏

仅列出标题
共10页: 1 2 3 4 5 6 7 8 9 Last