• <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>

            C++之竹

            無(wú)論是太陽(yáng)下,還是風(fēng)雨中,都要成長(zhǎng)!

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

            2012年5月14日 #

            簡(jiǎn)歷——為何真實(shí)反而成敗筆?!!

            近兩個(gè)月里,又開(kāi)始了新的跳槽。誠(chéng)然,我之前跳槽次數(shù)確實(shí)過(guò)多了,但出于在當(dāng)前公司的工作內(nèi)容、待遇、職稱評(píng)定等方面的不滿,最終還是下定了跳槽的決心。(當(dāng)然,也對(duì)之前的求職做了回顧,畢竟我也不想再有這種頻繁的跳槽了,我也想穩(wěn)定下來(lái)了。)

            而在一開(kāi)始,就已經(jīng)有朋友勸我,在簡(jiǎn)歷中得弄點(diǎn)虛假和夸張,否則很難找到好的工作。可惜,本人對(duì)這種夸大優(yōu)點(diǎn),剔除一切不利信息的簡(jiǎn)歷制作實(shí)在是難以為之!最終,想而易知,我所投出的簡(jiǎn)歷所得到的回應(yīng)是少得可憐。期間,我聽(tīng)說(shuō)了一些通過(guò)在簡(jiǎn)歷上的“美化”而取得求職成功的例子,也陸續(xù)的有幾個(gè)朋友勸我在簡(jiǎn)歷上不要太老實(shí),得做些變通,如,“將中間的某兩個(gè)公司的經(jīng)歷合寫成一個(gè)公司的經(jīng)歷”、“某些內(nèi)容可以不要寫到簡(jiǎn)歷上”、“某些內(nèi)容應(yīng)該再做些擴(kuò)充,并對(duì)某些詞替換成更吸引人點(diǎn)的詞”等等。我也確有幾次去嘗試調(diào)整簡(jiǎn)歷,可是,以到這弄虛假、夸張、隱瞞時(shí),我卻又實(shí)在是下不了手。沒(méi)辦法,或許這就是本性難移吧。

            還好,回應(yīng)總算還是有一些,而且目前也拿到了一份還算滿意的Offer。在即將進(jìn)入的新公司里,還是好好干吧!~

            哎!~這可怕的求職市場(chǎng)啊,實(shí)在太令人心冷了!~

            posted @ 2012-05-14 22:15 青碧竹 閱讀(561) | 評(píng)論 (1)編輯 收藏

            2012年4月23日 #

            Windows 控制臺(tái)程序的事件捕獲

                 摘要:       此篇內(nèi)容屬C++控制臺(tái)編程的一點(diǎn)基礎(chǔ)應(yīng)用,所以嘛,偶就偷個(gè)懶,不再做文字的講解,直接代碼。       哦,對(duì)了!代碼之前,先就代碼的組成作個(gè)簡(jiǎn)單說(shuō)明。代碼的內(nèi)容共分為三塊: 以宏RUN_ATEXIT_SAMPLE標(biāo)識(shí)的atexit調(diào)用樣例以宏RUN_SETC...  閱讀全文

            posted @ 2012-04-23 00:07 青碧竹 閱讀(1015) | 評(píng)論 (0)編輯 收藏

            2012年4月5日 #

            樹中兩個(gè)結(jié)點(diǎn)的最低公共祖先

            <本文的樣例代碼:/Files/qingbizhu/LowestCommonAncestor.zip>
             
            這是《劍指Offer——名企面試官精講典型編程題》一書中的面試題50,此題針對(duì)所給條件的不同,將需要截然不同的解題思路和方法。書中給出了針對(duì)此題的3種不同條件的解題,本文所要講解的是對(duì)其第3種條件的一個(gè)改進(jìn)解法。具體的題目及條件如下。
             
            【題目】:
                  輸入兩個(gè)樹結(jié)點(diǎn),求它們的最低公共祖先。

            【補(bǔ)充條件】:

                  樹是普通的樹,而且樹中的結(jié)點(diǎn)沒(méi)有指向父節(jié)點(diǎn)的指針。

             

            針對(duì)上述的題目和條件,書中給出了如下解決方案。

             

            【原方案】:

                  使用兩個(gè)鏈表,對(duì)樹進(jìn)行兩次遍歷以查找兩個(gè)樹結(jié)點(diǎn),并保持路徑到兩個(gè)鏈表中,從而將問(wèn)題轉(zhuǎn)化為求兩個(gè)鏈表的最后一個(gè)公共結(jié)點(diǎn)。

             

            從該方案中,觀察到兩次樹結(jié)點(diǎn)查找的遍歷中,其中一個(gè)結(jié)點(diǎn)的遍歷過(guò)的樹結(jié)點(diǎn)序列將完全覆蓋查找另一結(jié)點(diǎn)時(shí)所遍歷的樹結(jié)點(diǎn)序列。由此入手,本文提出了如下的改進(jìn)解決方案。

            【改進(jìn)方案】:

                深度優(yōu)先遍歷樹,并記錄路徑,當(dāng)找到第一個(gè)結(jié)點(diǎn)后,在當(dāng)前基礎(chǔ)上繼續(xù)遍歷搜索第二個(gè)結(jié)點(diǎn),并記錄第一個(gè)結(jié)點(diǎn)路徑的變化程度,直到找到第二個(gè)結(jié)點(diǎn)。最后,根據(jù)棧信息和記錄的結(jié)點(diǎn)路徑變化程度得到最低公共祖先。如圖1,假設(shè)輸入的兩個(gè)樹結(jié)點(diǎn)為DK,樹的根節(jié)點(diǎn)為R,則求DK的最低公共結(jié)點(diǎn)的過(guò)程如下表: 

            步驟

            第一個(gè)結(jié)點(diǎn)

            第二個(gè)結(jié)點(diǎn)

            路徑變化程度

            1

            R

            2

            RA

            3

            RAF

            4

            RAFJ

            5

            RAFG

            6

            RAFK

            K

            0(或K

            7

            RAC

            K

            1(或A

            8

            RACE

            K

            2(或A

            9

            RACI

            K

            2(或A

            10

            RAD

            K

            D

            1(或A

            è 得出結(jié)果,最低公共祖先結(jié)點(diǎn)為A

             

            從中,可以看到,改進(jìn)后的方案,只需對(duì)樹執(zhí)行一次遍歷。而在輔助空間的需求上, 只需使用一個(gè)棧(外加少量結(jié)點(diǎn)指針變量和1個(gè)表示路徑變化程度的整型變量)。而且,如果采用遞歸的方式實(shí)現(xiàn),該棧所需保存的信息,還可以通過(guò)遞歸時(shí)的函數(shù)調(diào)用棧得以保存。

             

            【附注】:

            1. 此處,有如下一個(gè)問(wèn)題:
              假設(shè)待查找公共祖先的兩樹結(jié)點(diǎn),其中一結(jié)點(diǎn)在以另一結(jié)點(diǎn)為根的子樹上(包括兩結(jié)點(diǎn)相同)時(shí),公共祖先的確定規(guī)則——
              “作為子樹根結(jié)點(diǎn)的那個(gè)結(jié)點(diǎn)”還是“子樹根結(jié)點(diǎn)的父節(jié)點(diǎn)”?
              例如:對(duì)上面圖1中的那棵樹,如果待查結(jié)點(diǎn)為根結(jié)點(diǎn)R和結(jié)點(diǎn)F,那么最終的查找結(jié)果是為R呢,還是因?yàn)?/span>R是根結(jié)點(diǎn)無(wú)父結(jié)點(diǎn)而得出NULL
              此問(wèn)題在書中未提及,但查看書中代碼,確認(rèn)是選擇了后者;而在本人的樣例代碼中則采用了前面的觀點(diǎn)。
            2. 在樣例代碼中,對(duì)樹結(jié)點(diǎn)在棧中的存儲(chǔ)方式略有改動(dòng)。
            3. 樣例代碼工程所使用的環(huán)境為 Visual C++ 2010;
              其中:tree.h/cpp為功能代碼文件,TestLowestCommonAncestor.h/cpp為相應(yīng)的UT代碼文件;
              UT采用gtest所編寫,編譯鏈接請(qǐng)根據(jù)gtest在自己本機(jī)的路徑狀況修改gtest_link.props文件中相應(yīng)的鏈接項(xiàng)。

             

            posted @ 2012-04-05 23:45 青碧竹 閱讀(3091) | 評(píng)論 (0)編輯 收藏

            2012年3月30日 #

            不使用 +-×÷ 運(yùn)算符來(lái)實(shí)現(xiàn) 加減乘除 四項(xiàng)運(yùn)算

                 摘要: 最近,在看《劍指Offer——名企面試官精講典型編程題》一書,當(dāng)看到“面試題47:不用加減乘除做加法”時(shí),經(jīng)過(guò)一分鐘左右思考后,得出了思路,跟書上一對(duì)照,基本一致,呵呵O(∩_∩)O~。于是,隨即又開(kāi)始思考:加法是實(shí)現(xiàn)了,那么減法、乘法還有除法又該怎么實(shí)現(xiàn)呢?一番思考與分析后,得出算法,寫出代碼,測(cè)試通過(guò),Happy!!\(^...  閱讀全文

            posted @ 2012-03-30 01:30 青碧竹 閱讀(4998) | 評(píng)論 (7)編輯 收藏

            2012年3月17日 #

            關(guān)于數(shù)值的整數(shù)次方的計(jì)算

            在計(jì)算一個(gè)浮點(diǎn)數(shù)(雙精度或單精度)的整數(shù)次方時(shí),一般的,我們會(huì)直接使用 C++ 本身所提供的 pow 函數(shù),事實(shí)上也推薦直接使用 pow 函數(shù)(為了稱呼簡(jiǎn)便,后面稱該 pow 函數(shù)為系統(tǒng) pow 函數(shù))。

            但是,當(dāng)我們準(zhǔn)備寫一個(gè)自己的 pow 時(shí),我們又會(huì)怎么寫呢?一般的,我們會(huì)寫上一個(gè) for 循環(huán)來(lái)循環(huán)冪的指數(shù)次,而且每次循環(huán)都會(huì)去執(zhí)行一次浮點(diǎn)數(shù)的乘法操作。但是,當(dāng)我們拿這個(gè) pow 函數(shù)來(lái)跟系統(tǒng) pow 函數(shù)作一運(yùn)行比較時(shí),就會(huì)發(fā)現(xiàn),我們的 pow 實(shí)在是太低效了。那么怎么樣才能使我們自己寫的 pow 也能有系統(tǒng)函數(shù)那樣的時(shí)間效率呢?

            仔細(xì)分析,我們用的那個(gè)求冪值的循環(huán)過(guò)程,就能發(fā)現(xiàn),其實(shí)我們還是做了很多不必要的浮點(diǎn)數(shù)乘法炒作。整個(gè)計(jì)算過(guò)程太過(guò)按步就班了。譬如說(shuō)在計(jì)算 val(待傳入pow 函數(shù)求冪的浮點(diǎn)數(shù),下同) 的4次方,我們總是先計(jì)算出3次方的值,然后再根據(jù)3次方的值和原始值來(lái)求4次方的值;然而,我們其實(shí)本可以在計(jì)算出2次方值后,平方2次方值來(lái)得到4次方的值的。接下來(lái),就是探索算法,以減少浮點(diǎn)數(shù)乘法的事了。

            通過(guò)所學(xué)的指數(shù)函數(shù)的知識(shí),我們知道指數(shù)函數(shù)有著這樣的性質(zhì):

            • V(a+b) = Va * Vb
            • Va*b = (Va)b             ;這里 * 為乘法運(yùn)算符

            另外,對(duì)于整數(shù),有如下性質(zhì):

            1.  2n = (1 << n)         ;這里 << 是向左移位的操作符。
            2. C++中的任何一個(gè)正整數(shù)(負(fù)整數(shù)同,但須處理好符合位)都可以表示為以下形式:
              n = 2a1 + 2a2 + ... + 2ak
              (其中,a1, a2, ... , ak 為閉區(qū)間 [0, 30] 上的整數(shù)值,且互不相同。)

            由此,我們就可以事先依次計(jì)算出 val, val2, val4, ... , val30 預(yù)存?zhèn)溆茫缓笤俑鶕?jù) val 相應(yīng) bit 上是 1 還是 0,來(lái)選取相應(yīng)的預(yù)存數(shù)據(jù)進(jìn)行相乘,從而得到最終的結(jié)果。當(dāng)然,合理設(shè)計(jì)邏輯,還可以減少所需的預(yù)存數(shù)據(jù)。下面是我的Pow 代碼,歡迎點(diǎn)評(píng)。

             

            #define INTBITS_WITHOUT_SIGN 31 // the bit-size of type int with the sign bit being excluded.


            bool IsZero(double val, double precision /*= DEFAULT_PRECISION*/)
            {
                
            if (precision >= 0{
                    
            return (-precision <= val) && (val <= precision);
                }
             else {
                    
            return (precision <= val) && (val <= -precision);
                }

            }


            double Pow(double val, int exponent)
            {
                
            if (IsZero(val)) {
                    
            return 0.0;
                }


                
            if (0 == exponent) {
                    
            return 1.0;
                }


                
            bool bIsExponentMinus = false;
                
            if (exponent < 0{
                    exponent 
            = -exponent;
                    bIsExponentMinus 
            = true;
                }


                
            double tempVal[INTBITS_WITHOUT_SIGN];
                memset(tempVal, 
            0, INTBITS_WITHOUT_SIGN);
                tempVal[
            0= val;

                
            double result = 1.0;
                
            int index = 0;
                
            while (exponent != 0{
                    
            if ((exponent & 1!= 0{
                        result 
            *= tempVal[index];
                    }


                    exponent 
            >>= 1;
                    
            if (exponent != 0{
                        tempVal[index 
            + 1= tempVal[index] * tempVal[index];
                        
            ++index;
                    }

                }


                
            if (bIsExponentMinus) {
                    result 
            = 1.0 / result;
                }


                
            return result;
            }

             
            【補(bǔ)充】:

            1. 在指數(shù)中,0的負(fù)數(shù)次方和0的0次方,都是沒(méi)有意義的,所以對(duì)“if (IsZero(val))”分支內(nèi)的處理如果能加上一些異常的輸出就更好了,如:

               在Widows下,可通過(guò) SetLastError(...) 來(lái)設(shè)置錯(cuò)誤碼。

            2. Pow中的 “double tempVal[INTBITS_WITHOUT_SIGN];” 一句,改寫為

               double * pTempVal = new double[sizeof(int) * 8 - 1];

            (當(dāng)然,后面代碼中的tempVal 也都要改為相應(yīng)的 pTempVal,同時(shí)須記得在return 前把delete [] pTempVal)

            就可以使代碼也能夠適應(yīng)于64位系統(tǒng)的處理。對(duì)于無(wú)符號(hào)整數(shù)的為指數(shù)的情況,則輔助值空間應(yīng)為“sizeof(unsigned int) * 8”,同時(shí),無(wú)需再考慮負(fù)指數(shù)的情況。

            (這里,很感謝春秋十二月的補(bǔ)充。)
             

            posted @ 2012-03-17 04:01 青碧竹 閱讀(3006) | 評(píng)論 (4)編輯 收藏

            2012年3月14日 #

            Singleton模式——C++應(yīng)用(四)

                 摘要:  在前面的例子中,我們看到:采用 new 來(lái)為單件對(duì)象分配空間,如果采用手動(dòng)調(diào)用 delete 或封裝了 delete 的 Release 操作,一旦遇到全局對(duì)象的析構(gòu)有調(diào)用單件對(duì)象,就會(huì)使得無(wú)法在代碼中找到適合釋放單件對(duì)象的時(shí)機(jī)。那么,是否可以讓系統(tǒng)來(lái)自動(dòng)選擇時(shí)機(jī),調(diào)用釋放呢?如果可以,又該怎么在代碼中構(gòu)建單件對(duì)象的自動(dòng)釋放機(jī)制呢? 對(duì)這兩個(gè)問(wèn)題,在進(jìn)行了一番思考和嘗試后,終于找到了答...  閱讀全文

            posted @ 2012-03-14 01:07 青碧竹 閱讀(348) | 評(píng)論 (0)編輯 收藏

            2012年3月13日 #

            Singleton模式——C++應(yīng)用(三)

                 摘要: 前面對(duì)C++的Singleton模式的探討還都是針對(duì)通過(guò)靜態(tài)變量來(lái)創(chuàng)建對(duì)象。但學(xué)習(xí)嘛,多走點(diǎn)總不是壞事。 接下來(lái)就來(lái)看看通過(guò) new 來(lái)創(chuàng)建單件對(duì)象的單件類設(shè)計(jì)。既然是用 new 來(lái)創(chuàng)建了,那自然就不能忽略需要用 delete 來(lái)釋放。 好了,先來(lái)看看代碼: Code highlighting produced by Actipro CodeHighlighter (freeware)htt...  閱讀全文

            posted @ 2012-03-13 00:55 青碧竹 閱讀(258) | 評(píng)論 (0)編輯 收藏

            2012年3月12日 #

            Singleton模式——C++應(yīng)用(二)

            看了通過(guò)靜態(tài)成員實(shí)現(xiàn)的惰性單件,雖說(shuō)構(gòu)件簡(jiǎn)單且線程安全,但在被全局變量(包括靜態(tài)全局變量)的構(gòu)造或析構(gòu)調(diào)用時(shí),會(huì)存在著那樣的缺陷畢竟還是很讓人不爽。那么,是否存在保持上面的優(yōu)點(diǎn)同時(shí)剔除了上面的缺陷的C++單件呢?

             

            我們知道,定義于函數(shù)內(nèi)部的靜態(tài)局部變量,有著

            • 定義的實(shí)時(shí)性,即只在函數(shù)第一次被調(diào)用時(shí)才被定義
            • 線程安全性
            • 生命期直到程序結(jié)束

            的特點(diǎn)。那么,通過(guò)這個(gè)局部靜態(tài)變量來(lái)創(chuàng)建的單件又會(huì)是什么樣呢?貼上我的Demo代碼,這就來(lái)看看吧。

              1// Singleton demo_1: Singleton instance is a local static varible of class.
              2
              3#include <Windows.h>
              4#include <iostream>
              5
              6class A 
              7{
              8public:
              9    static A& GetInstance();
             10
             11private:
             12    A() : m_nStat1(-1), m_nStat2(-1{
             13        m_nStat1 = 0;
             14        std::cout << "Construct A" << std::endl;
             15        m_nStat2 = 0;
             16    }

             17    A(const A&);
             18
             19public:
             20    ~A() {
             21        m_nStat1 = 0;
             22        std::cout << "Destruct A" << std::endl;
             23        m_nStat2 = 0;
             24    }

             25
             26    void Do() {
             27        ++m_nStat1;
             28        ++m_nStat2;
             29        std::cout << "Called Do() by object of A. [" 
             30                  << m_nStat1 << "" 
             31                  << m_nStat2 << "]" 
             32                  << std::endl;
             33    }

             34
             35private:
             36    int m_nStat1;
             37    int m_nStat2;
             38}
            ;
             39
             40class B
             41{
             42public:
             43    B(int nID) : m_nID(nID) {
             44        std::cout << "Construct B: " << m_nID << std::endl;
             45        A::GetInstance().Do();
             46    }

             47    ~B() {
             48        std::cout << "Destruct B: " << m_nID << std::endl;
             49        A::GetInstance().Do();
             50    }

             51
             52private:
             53    int m_nID;
             54}
            ;
             55
             56class C
             57{
             58public:
             59    static C& GetInstance();
             60
             61private:
             62    C() : m_nStat(-1{
             63        std::cout << "Construct C" << std::endl;
             64        m_nStat = 0;
             65    }

             66    C(const C&);
             67
             68public:
             69    ~C() {
             70        std::cout << "Destruct C" << std::endl;
             71        m_nStat = 0;
             72    }

             73
             74    void Do() {
             75        ++m_nStat;
             76        std::cout << "Called Do() by object of C. [" 
             77            << m_nStat << "]" 
             78            << std::endl;
             79    }

             80
             81private:
             82    int m_nStat;
             83}
            ;
             84
             85static B gs_B0(0);
             86B g_B1(1);
             87
             88A& A::GetInstance()
             89{
             90    static A s_instance;
             91    
             92    return s_instance;
             93}

             94
             95C& C::GetInstance()
             96{
             97    static C s_instance;
             98
             99    return s_instance;
            100}

            101
            102static B gs_B2(2);
            103B g_B3(3);
            104
            105int main(int argc, char * argv[])
            106{
            107    std::cout << "Enter main" << std::endl;
            108    A::GetInstance().Do();
            109    C::GetInstance().Do();
            110
            111    system("pause");
            112    return 0;
            113}

            114

             接下來(lái),自然就是執(zhí)行結(jié)果:

            喲吼~,這不正是自己想要的結(jié)果么,Perfect!!

            構(gòu)建簡(jiǎn)單,創(chuàng)建具有實(shí)時(shí)性(在且只在第一次用到時(shí)創(chuàng)建),線程安全,可以被全局變量的構(gòu)造和析構(gòu)正常調(diào)用,就是它了,極力推薦!O(∩_∩)O~

             

            posted @ 2012-03-12 02:08 青碧竹 閱讀(244) | 評(píng)論 (0)編輯 收藏

            Singleton模式——C++應(yīng)用(一)

                 前天,在看了《劍指Offer》中關(guān)于Singleton模式的一段內(nèi)容后,就按耐不住對(duì)其在C++上完美實(shí)現(xiàn)的思考。書中這一講是針對(duì)C#的實(shí)現(xiàn)來(lái)講解的,因?yàn)镃#的垃圾回收機(jī)制,其中那些個(gè)顯眼的[new]已無(wú)需程序員去手動(dòng)釋放。但是,C++上確并不存在垃圾回收機(jī)制,程序員得手動(dòng)[delete] [new]出來(lái)的內(nèi)容,這就有了以下兩問(wèn):
            1. 何時(shí)釋放通過(guò)new所創(chuàng)建的Singleton對(duì)象?
            2. 如果不通過(guò)new、malloc等操作,是否能做到在第一次使用時(shí)才創(chuàng)建Singleton對(duì)象。

                 在針對(duì)以上兩個(gè)問(wèn)題做了一番思考和嘗試之后,終于有了成果。現(xiàn)呈現(xiàn)出來(lái),供大家參考,也希望有更好妙招的朋友能不吝賜教。礙于連代碼帶文字,篇幅較長(zhǎng),所以我將分為四篇來(lái)講。那么,開(kāi)始咯!^_^

             

                 一開(kāi)始,我先拿使用靜態(tài)成員變量的來(lái)實(shí)現(xiàn)的惰性單件來(lái)進(jìn)行嘗試,寫了個(gè)Demo,一運(yùn)行,O(∩_∩)O哈哈~,還真有意外的收獲呢!嗯~,抓緊時(shí)間,先把我的Demo上來(lái)給大家瞧瞧!~

              1// Singleton demo_0: Singleton instance is a static member of class.
              2
              3#include <Windows.h>
              4#include <iostream>
              5
              6class A 
              7{
              8private:
              9    static A ms_instance;
             10
             11public:
             12    static A& GetInstance() {
             13        return ms_instance;
             14    }

             15
             16private:
             17    A() : m_nStat1(-1), m_nStat2(-1{
             18        m_nStat1 = 0;
             19        std::cout << "Construct A" << std::endl;
             20        m_nStat2 = 0;
             21    }

             22    A(const A&);
             23
             24public:
             25    ~A() {
             26        m_nStat1 = 0;
             27        std::cout << "Destruct A" << std::endl;
             28        m_nStat2 = 0;
             29    }

             30
             31    void Do() {
             32        ++m_nStat1;
             33        ++m_nStat2;
             34        std::cout << "Called Do() by object of A. [" 
             35                  << m_nStat1 << "" 
             36                  << m_nStat2 << "]" 
             37                  << std::endl;
             38    }

             39
             40private:
             41    int m_nStat1;
             42    int m_nStat2;
             43}
            ;
             44
             45class B
             46{
             47public:
             48    B(int nID) : m_nID(nID) {
             49        std::cout << "Construct B: " << m_nID << std::endl;
             50        A::GetInstance().Do();
             51    }

             52    ~B() {
             53        std::cout << "Destruct B: " << m_nID << std::endl;
             54        A::GetInstance().Do();
             55    }

             56
             57private:
             58    int m_nID;
             59}
            ;
             60
             61class C
             62{
             63private:
             64    static C ms_instance;
             65
             66public:
             67    static C& GetInstance() {
             68        return ms_instance;
             69    }

             70
             71private:
             72    C() : m_nStat(-1{
             73        std::cout << "Construct C" << std::endl;
             74        m_nStat = 0;
             75    }

             76    C(const C&);
             77
             78public:
             79    ~C() {
             80        std::cout << "Destruct C" << std::endl;
             81        m_nStat = 0;
             82    }

             83
             84    void Do() {
             85        ++m_nStat;
             86        std::cout << "Called Do() by object of C. [" 
             87            << m_nStat << "]" 
             88            << std::endl;
             89    }

             90
             91private:
             92    int m_nStat;
             93}
            ;
             94
             95static B gs_B0(0);
             96B g_B1(1);
             97A A::ms_instance;
             98C C::ms_instance;
             99static B gs_B2(2);
            100B g_B3(3);
            101
            102int main(int argc, char * argv[])
            103{
            104    std::cout << "Enter main" << std::endl;
            105    A::GetInstance().Do();
            106    C::GetInstance().Do();
            107
            108    system("pause");
            109    return 0;
            110}

            為了能夠分析得細(xì)致些,Demo寫得長(zhǎng)了點(diǎn),見(jiàn)諒咯!~

                嗯,對(duì)了,還有運(yùn)行結(jié)果:

            仔細(xì)看看結(jié)果,有沒(méi)覺(jué)得這結(jié)果很出乎意料啊?!!(順便提下,我用的編譯工具是Visual C++ 2010)

            從這個(gè)運(yùn)行結(jié)果,對(duì)通過(guò)靜態(tài)成員實(shí)現(xiàn)的惰性單件,我得到了以下兩點(diǎn):

            1. 對(duì)于定義在單件對(duì)象之前的全局或靜態(tài)全局對(duì)象,雖然單件對(duì)象還是會(huì)在調(diào)用前及時(shí)構(gòu)造,但構(gòu)造函數(shù)內(nèi)的初始化操作卻可能在需要使用時(shí)還未能執(zhí)行完全。
              如:std::cout 就會(huì)使得單件對(duì)象的構(gòu)造函數(shù)調(diào)用被暫停(單件的其他操作還能繼續(xù)調(diào)用),直到單件之前的全局或靜態(tài)全局的構(gòu)造函數(shù)全執(zhí)行完了,才能繼續(xù)執(zhí)行。【*這個(gè)原因還請(qǐng)有知道的高手能賜教。
            2. 對(duì)于定義于單件對(duì)象之后的全局或靜態(tài)全局對(duì)象,如果在析構(gòu)中調(diào)用了單件,就會(huì)使得單件在釋放后又被再次重新創(chuàng)建使用。當(dāng)然,這時(shí)單件內(nèi)所存的數(shù)據(jù)已跟之前毫無(wú)關(guān)聯(lián)了。

            因此,我要奉勸各位開(kāi)發(fā)者,如果在你的全局或靜態(tài)全局對(duì)象的構(gòu)造或析構(gòu)方法中調(diào)用某個(gè)單件,那么對(duì)該單件的實(shí)現(xiàn)就不要以靜態(tài)成員來(lái)惰性地實(shí)現(xiàn)。

             

            posted @ 2012-03-12 02:04 青碧竹 閱讀(293) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題  
            国产精品久久久天天影视香蕉| 欧美亚洲另类久久综合| 精品久久久久一区二区三区| 久久精品国产亚洲一区二区| 亚洲午夜精品久久久久久人妖| 女人香蕉久久**毛片精品| 亚洲人成无码www久久久| 久久精品毛片免费观看| 久久精品亚洲福利| 亚洲女久久久噜噜噜熟女| 国产高潮国产高潮久久久91| 亚洲国产成人精品91久久久 | 久久精品亚洲中文字幕无码麻豆 | 国产成人精品久久亚洲| 婷婷久久综合九色综合九七| 成人国内精品久久久久一区| 亚洲欧洲精品成人久久曰影片| 2021少妇久久久久久久久久| 久久精品中文字幕大胸| 国产福利电影一区二区三区,免费久久久久久久精| 国产免费久久久久久无码| 看久久久久久a级毛片| 亚洲午夜福利精品久久| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 人人妻久久人人澡人人爽人人精品| 69SEX久久精品国产麻豆| 欧美午夜精品久久久久免费视| 亚洲?V乱码久久精品蜜桃 | 亚洲AV无一区二区三区久久| 精品久久人人爽天天玩人人妻| 久久精品国产亚洲av麻豆色欲| 亚洲综合久久夜AV | 久久综合久久性久99毛片| 99久久国产主播综合精品| 久久线看观看精品香蕉国产| 久久精品无码专区免费青青| 人妻精品久久无码区| 精品国产乱码久久久久久1区2区 | 久久久久久综合网天天| 97视频久久久| 亚洲精品乱码久久久久66|