• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            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 閱讀(1099) | 評論 (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 
            久久无码人妻精品一区二区三区| 日韩精品无码久久久久久| 中文字幕亚洲综合久久2| 久久狠狠一本精品综合网| 欧洲性大片xxxxx久久久| 亚洲国产欧洲综合997久久| 99久久精品毛片免费播放| 精品无码久久久久久久动漫| 亚洲欧美一区二区三区久久| 99精品久久精品| 99久久这里只精品国产免费| 国产精品久久网| 久久久久久精品久久久久| 热re99久久精品国产99热| 亚洲欧美成人综合久久久| 九九热久久免费视频| 国产亚洲色婷婷久久99精品| 亚洲色欲久久久久综合网| 久久99毛片免费观看不卡 | 久久精品国产亚洲麻豆| 日本一区精品久久久久影院| 亚洲国产欧美国产综合久久| 日韩欧美亚洲综合久久影院Ds | 狠狠色丁香婷婷久久综合| 国产精品青草久久久久婷婷| 偷偷做久久久久网站| 久久久久国产一级毛片高清板| 东京热TOKYO综合久久精品| 一本色道久久综合狠狠躁| 亚洲国产成人精品91久久久| 久久99精品久久久久久噜噜| 精品久久久噜噜噜久久久| 老色鬼久久亚洲AV综合| 久久夜色精品国产噜噜噜亚洲AV| 免费精品久久天干天干| 久久久久久综合网天天| 亚洲国产精品综合久久网络| 久久综合色之久久综合| 欧美伊人久久大香线蕉综合| 精品国产乱码久久久久久呢 | 国产精品久久久久天天影视|