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

            被無視的伊謝爾倫

            雕欄玉砌應(yīng)猶在,只是朱顏改

              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              9 隨筆 :: 0 文章 :: 6 評論 :: 0 Trackbacks

            2008年7月21日 #

            轉(zhuǎn)眼已經(jīng)2008年了,留下一筆,繼續(xù)努力!!
            posted @ 2008-07-21 20:51 愛上青菜的包子 閱讀(148) | 評論 (0)編輯 收藏

            2006年11月29日 #

            首先需要確認(rèn)的是,編譯器對非虛方法使用靜態(tài)聯(lián)編,對虛方法使用動態(tài)聯(lián)編。
            看起來,在大多數(shù)情況下,動態(tài)聯(lián)編都更好,因為它讓程序能夠選擇為特定類型設(shè)計的方法,這樣問題就來了,既然動態(tài)聯(lián)編這么好,為什么還要設(shè)計兩種類型的聯(lián)編?為什么默認(rèn)的聯(lián)編方法是靜態(tài)的而不是動態(tài)?

            原因關(guān)鍵就在于效率。Strousstrup說過(很經(jīng)典,呵呵):C++的指導(dǎo)原則之一是,不要為不使用的特性付出代價(內(nèi)存或處理時間)。

            因為通常情況下,編譯器處理虛函數(shù)的方法為:給每個對象添加一個隱藏成員,該成員中保存了一個指向函數(shù)地址數(shù)組的指針(稱為虛函數(shù)表 virtual function table,vtbl)。虛函數(shù)表中存儲了為類對象進(jìn)行聲明的虛函數(shù)的地址。例如,基類包含一個指針,指向了基類中所有虛函數(shù)的地址表,派生類對象將包含一個指向獨立地址表的指針,如果派生類提供了虛函數(shù)的新定義,該虛函數(shù)表將保存新函數(shù)的地址,如果沒有重新定義,則保留原始版本的地址。調(diào)用虛函數(shù)時,程序?qū)⒉榭创鎯υ趯ο笾械膙tbl地址,然后轉(zhuǎn)向相應(yīng)的函數(shù)地址表。

            所以顯而易見的是,使用虛函數(shù)時,在內(nèi)存和執(zhí)行速度方面有一定的額外成本,包括:
            每個對象都將增大,增大量為存儲地址的空間;對每個類,編譯器都創(chuàng)建一個虛函數(shù)地址表(數(shù)組);每個函數(shù)調(diào)用都需要執(zhí)行一步額外的操作,即到表中查找地址。

            所以咱們要養(yǎng)成的習(xí)慣是,在設(shè)計類時,可能包含一些不在派生類重新定義的成員函數(shù),那么這些函數(shù)就不要設(shè)置為虛函數(shù)。這樣首先會有更好的效率,其次被聲明為虛函數(shù)的成員函數(shù)就表明是預(yù)期在派生類中會被重新定義的,在閱讀代碼時也將比較方便。
            posted @ 2006-11-29 17:27 愛上青菜的包子 閱讀(614) | 評論 (0)編輯 收藏

            2006年11月10日 #

            最近全面檢查了下身體,拿到體檢報告的時候,發(fā)現(xiàn)有一項血液尿酸偏高,醫(yī)生在后面批注,少食動物內(nèi)臟。

            疑惑了一下,正準(zhǔn)備網(wǎng)上查查,結(jié)果有同事發(fā)了封公司郵件,正好是說這個事的,貌似出現(xiàn)該情況的人也有不少。看了看內(nèi)容,如下:

            出現(xiàn)尿酸偏高的現(xiàn)象,這是酸性體質(zhì)的表現(xiàn)。是由于進(jìn)食過多高蛋白、高脂肪、高糖類美食造成的。要改變偏酸性體質(zhì),關(guān)鍵在于飲食,要多吃堿性食物。所謂食物的酸堿性,是說食物中的無機(jī)鹽屬于酸性還是屬于堿性。一般金屬元素鈉、鈣、鎂等,在人體內(nèi)其氧化物呈堿性,含這種元素較多的食物就是堿性食物,如大豆、豆腐、菠菜、萵筍、蘿卜、土豆、藕、洋蔥、海帶、西瓜、香蕉、梨、蘋果、牛奶等。一些食物中含有較多的非金屬元素,如磷、硫、氯等,在人體內(nèi)氧化后,生成帶有陰離子的酸根,屬于酸性食物。如豬肉、牛肉、雞肉、鴨、蛋類、鯉魚、牡蠣、蝦,以及面粉、大米、花生、大麥、啤酒等。所以不要誤以為蘋果等吃起來很酸就是酸性食物,那是大錯特錯的,剛好相反,蘋果是一種堿性的食物。

            酸性體質(zhì),健康新殺手

            ???吃得好了,身體卻變?"酸"了
            ???"俺們那年代,缺飯又少菜;如今這年代,吃得真不賴"的確如此,現(xiàn)代人生活水平不斷在提高,每天大魚大肉,頓頓都離不開葷,年輕人去麥當(dāng)勞、肯德基吃洋快餐更是家常便飯.可是根據(jù)一項調(diào)查研究表明:生活水平越來越好,醫(yī)療水平越來越高,現(xiàn)代文明病卻越來越多;發(fā)病率越來越高;患者越來越年輕化。有數(shù)字顯示:我國目前的高血壓人群已達(dá)到1.6?個億,我國的高血脂人群是?6500萬,糖尿病人?4800萬并以每年10%的速度高速增長,每年死于癌癥的有130?多萬人,死于心腦血管疾病的有200?多萬人。70年代我們國家就呼吁要讓高血壓低頭,可現(xiàn)在我們在高血壓面前低了頭。我國心臟病的發(fā)病年齡比80?年代初期整整提早了15年,也就是說原來50歲開始得心臟病的,現(xiàn)在35歲的人就開始得心臟病。多么觸目驚心的數(shù)字,而這些數(shù)字只是官方統(tǒng)計,還沒有加上未檢查出來的。我們不禁要問:這到底是怎么了?越來越多的醫(yī)學(xué)家、營養(yǎng)學(xué)家和研究機(jī)構(gòu)為此現(xiàn)象設(shè)立課題進(jìn)行研究,最后得出一致結(jié)論:酸性體質(zhì)是病魔元兇。
            ????挖出酸性體質(zhì)的根
            ????那么酸性體質(zhì)是怎么來的呢?現(xiàn)代醫(yī)學(xué)研究向我們揭示了真相:魚肉禽蛋油米面等這些高蛋白、高脂肪、高糖類美食在為我們提供能量和營養(yǎng)的同時,也在提供大量的酸性物質(zhì)。那么到底什么物質(zhì)產(chǎn)生什么酸呢??我們一起來看看:?蛋白質(zhì)(主要來源于瘦肉、魚、蛋等)在體內(nèi)代謝產(chǎn)生含硫氨基酸、含磷氨基酸、尿酸等等;脂肪(主要來源于肥肉、油等)在體內(nèi)代謝產(chǎn)生烴丁酸、乙酰乙酸(也稱酮酸);碳水化合物(糖類,主要來源于米面)在體內(nèi)代謝產(chǎn)生甘油酸、丙酮酸、乳酸。
            ????"酸"不除,后患無窮
            ????人體攝入的酸性食物過多,超過了人體酸堿平衡的調(diào)節(jié)能力,肝腎等身體重要部位超負(fù)荷運(yùn)作,人體的酸堿平衡就會被破壞,使體內(nèi)酸堿失衡,甚至出現(xiàn)輕度酸中毒反應(yīng),這就是我們所說的酸性體質(zhì)。
            ????其實我們?nèi)梭w就象個養(yǎng)魚的池塘,占人體體重70%的體液就是池塘里的水,水被污染了魚就要生病死亡,同樣的道理,人體體液被酸性物質(zhì)污染了,組成我們?nèi)梭w的60萬億個細(xì)胞的生態(tài)環(huán)境就會發(fā)生變化,細(xì)胞就會發(fā)生突變和病變而影響我們的健康。我們都知道:酸性物質(zhì)沉積在肝臟中會產(chǎn)生脂肪肝;酸性物質(zhì)沉積在腎臟中會影響腎的排泄功能,使尿酸偏高而產(chǎn)生痛風(fēng);酸性物質(zhì)沉積在關(guān)節(jié)或組織器宮內(nèi)引起相應(yīng)炎癥,導(dǎo)致關(guān)節(jié)炎等疾病;酸性物質(zhì)沉積在胰腺中,會影響胰島細(xì)胞的活性、影響胰島素的敏感性引發(fā)糖尿病及其并發(fā)癥等等。更為嚴(yán)重的是酸性物質(zhì)沉積在血液里、血管壁使血管壁增厚,引起動脈硬化,引發(fā)中風(fēng)、心肌梗塞等各種心腦血管疾病。

            …………

            含鈉、鉀、鈣、鎂等金屬元素較多的乃是堿性食品。并非味道酸的就是酸味食品,應(yīng)該掌握一點:所有酸味的水果、豆制品都為堿性食物而不是酸性食物,堿性食物被認(rèn)為是具有美容作用的食物。
            豆腐、牛奶、芹菜、土豆、竹筍、香菇、胡蘿卜、海帶、綠豆、香蕉、西瓜、草莓等及大部分的蔬菜、水果都是堿性的。
            食物的“酸堿性”會影響體態(tài)和皮膚健美。
             經(jīng)測定,弱堿性的食物有:豆腐、豌豆、大豆、綠豆、油菜、芹菜、番薯、蓮藕、洋蔥、茄子、南瓜、黃瓜、蘑菇、蘿卜、牛奶等。而呈堿性的食物有:菠菜、白菜、卷心菜、生菜、胡蘿卜、竹筍、馬鈴薯、海帶、柑橘類、西瓜、葡萄、香蕉、草莓、板粟、柿子、咖啡、葡萄酒等。  還有一些食物因吃起來酸,人們就錯誤地把它們當(dāng)成了酸性食物,如山植、西紅柿、醋等,其實這些東西正是典型的堿性食物

            多吃堿性食物。研究發(fā)現(xiàn),多食堿性食物,可保持血液呈弱堿性,使得血液中乳酸、尿素等酸性物質(zhì)減少,并能防止其在管壁上沉積,因而有軟化血管的作用,故有人稱堿性食物為“血液和血管的清潔劑”。這里所說的酸堿性,不是食物本身的性質(zhì),而是指食物經(jīng)過消化吸收后,留在體內(nèi)元素的性質(zhì)。常見的酸性元素有氮、碳、硫等;常見的堿性元素有鉀、鈉、鈣、鎂等。有的食物口味很酸,如番茄、橘子,卻都是地地道道的強(qiáng)堿性食物,因為它們在體內(nèi)代謝后的最終元素是鉀元素等。

            何謂酸性或堿性食物  所謂酸性食物或堿性食物,并不是指味道酸或咸的食物,而是指食物經(jīng)過消化吸收和代謝后產(chǎn)生的陽離子或陰離子占優(yōu)勢的食物。也就是說,某種食物如經(jīng)代謝后產(chǎn)生的鉀、鈉、鈣、鎂等陽離子占優(yōu)勢的則屬堿性食物;而代謝后產(chǎn)生磷、氯、硫等陰離子占優(yōu)勢的食物屬酸性食物。檸檬、柑桔、楊桃等味道雖酸,但它經(jīng)代謝后,有機(jī)酸變成了水和二氧化碳,后者經(jīng)肺呼出體外,剩下的陽離子占優(yōu)勢,仍屬堿性食物;同理,肉、魚、蛋類和米面雖無酸味,但代謝后產(chǎn)生的陰離子較多,仍屬于酸性食物。因此,不能從食物的味道來區(qū)分酸性或堿性食物

            看起來挺恐怖的。。。看來得注意下伙食了,以后要多吃水果、蔬菜。。。~~~

            posted @ 2006-11-10 16:09 愛上青菜的包子 閱讀(249) | 評論 (0)編輯 收藏

            2006年10月26日 #

            這幾天拿到公司以前項目中的一個用C++Builder做的程序,在我機(jī)器上調(diào)試,結(jié)果提示出錯:Operation not applicable

            使用斷點跟蹤之后發(fā)現(xiàn)錯誤出在使用TQuery時執(zhí)行open方法時,回追根源,得出以下反饋:

            m_pqQuery -> SQL -> Add(? " Select?*?From?Table1?Where?Id?=?:PId? " ?);
            m_pqQuery
            -> ParamByName(? " PId " ?) -> AsInteger????? = ?某個int變量;


            執(zhí)行完這句之后,按正常情況,參數(shù)PId應(yīng)該被賦予了一個整形值,但是Debug跟蹤顯示其值還是跟未賦值前是同樣表示的未知值。所以在執(zhí)行open方法時出錯了。

            如果我不是用該方法,直接把SQL語句寫死:

            m_pqQuery -> SQL -> Add(? " Select?*?From?Table1?Where?Id?=?0? " ?);


            運(yùn)行正常

            或者用

            char ?sql[ 80 ];
            int ?n? = ?某整形變量?;
            sprintf(sql,
            " Select?*?From?Table1?Where?Id?=?%d " ,n);
            pqQuery
            -> SQL -> Add(sql);


            也運(yùn)行正常

            查了下,原來給參數(shù)賦值的方法并沒有錯誤,編譯也能通過,況且以前該程序肯定是能正常運(yùn)行的。。真是奇怪為什么在我這里就賦不上值。。調(diào)試了很久也沒能找到原因,只好作罷,為了順利運(yùn)行,只能改為sprintf和直接連接字符串的方式。
            在這里記上一筆,希望以后能夠找到原因。。。

            posted @ 2006-10-26 21:25 愛上青菜的包子 閱讀(370) | 評論 (0)編輯 收藏

            2006年9月28日 #

            1. 重載<<操作符
              要重新定義<<操作符,以便將它和cout一起用來顯示對象的內(nèi)容,請定義下面的友元操作符函數(shù):
              ostream?&?operator?<<?(ostream?&?os,const?c_name?&?obj)
              {
              os?
              <<?;//?display?object?contents
              return?os;
              }

              其中c_name是類名。如果該類提供了能夠返回所需內(nèi)容的公有方法,則可在操作符函數(shù)中使用這些方法,這樣便不會將他們設(shè)置為友元函數(shù)了。
            2. 轉(zhuǎn)換函數(shù)
              要將單個值轉(zhuǎn)換為類類型,需要創(chuàng)建原型如下所示的類構(gòu)造函數(shù):
              c_name(type_name?value);

              其中c_name為類名,type_name是要轉(zhuǎn)換的類型的名稱。
              要將類轉(zhuǎn)換為其他類型,需要創(chuàng)建原型如下所示的類成員函數(shù):
              operator?type_name();

              雖然該函數(shù)沒有聲明返回類型,但應(yīng)返回所需類型的值。
              使用轉(zhuǎn)換函數(shù)時要小心。可以在聲明構(gòu)造函數(shù)時使用關(guān)鍵字explicit,以防止它被用于隱式轉(zhuǎn)換。
            3. 其構(gòu)造函數(shù)使用new的類
              如果類使用new操作符來分配類成員指向的內(nèi)存,在設(shè)計時應(yīng)采取一些預(yù)防措施。
            • 對于指向的內(nèi)存是由new分配的所有類成員,都應(yīng)在類的析構(gòu)函數(shù)中對其使用delete,該操作符將釋放分配的內(nèi)存。
            • 如果析構(gòu)函數(shù)通過對指針類成員使用delete來釋放內(nèi)存,則每個構(gòu)造函數(shù)都應(yīng)當(dāng)使用new來初始化指針,或?qū)⑺O(shè)置為空指針。
            • 構(gòu)造函數(shù)中要么使用new[],要么使用new,而不能混用。如果構(gòu)造函數(shù)使用的是new[],則析構(gòu)函數(shù)應(yīng)使用delete[];如果構(gòu)造函數(shù)使用的是new,則析構(gòu)函數(shù)應(yīng)適用delete。
            • 應(yīng)定義一個分配內(nèi)存(而不是將指針指向已有內(nèi)存)的復(fù)制構(gòu)造函數(shù)。這樣程序能夠?qū)㈩悓ο蟪跏蓟癁榱硪粋€對象。這種構(gòu)造函數(shù)原型如下:
              className(const?className?&)
            • 應(yīng)定義一個重載賦值操作符的類成員函數(shù),其函數(shù)定義如下(其中c_pointer是c_name的類成員,類型為指向type_name的指針)。下面的范例假設(shè)使用new[]來初始化變量c_pointer):
              c_name?&?c_name::operator?=?(const?c_name?&?cn)
              {
              if?(this?==?&?cn)
              return?*this;

              delete?[]?c_pointer;
              //?set?size?number?of?type_name?units?to?be?copyied
              c_pointer?=?new?type_name[size];
              //?then?copy?data?pointed?to?by?cn.c_pointer?to
              //?location?pointed?to?by?c_pointer

              return?*this;
              }

            本文對我前面幾篇隨筆中提到的問題也作出了一個總結(jié),感覺很有必要記下來。
            以上內(nèi)容原文引用自參考書籍中內(nèi)容。

            參考書籍:C++PrimerPlus author:Stephen Prata

            posted @ 2006-09-28 15:18 愛上青菜的包子 閱讀(798) | 評論 (1)編輯 收藏

            ?

            const ? int ?BUF? = ? 512 ?;

            class ?JustTesting
            {
            ????
            private :
            ????????JustTesting(
            const ? string ? & ?s? = ? " Just?Testing " , int ?n? = ? 0 )
            ????????
            {} ?
            ????????
            ~ JustTesting() {}
            ????
            public :
            ????
            }
            ;

            int ?main()
            {
            ????
            char ? * ?buffer? = ? new ? char ?[BUF];

            ????JustTesting?
            * pc1, * pc2, * pc3, * pc4;

            ????pc1?
            = ? new ?(buffer)?JustTesting;
            ????pc2?
            = ? new ?JustTesting(? " ?Heap1? " ?,? 20 ?);

            ????pc3?
            = ? new ?(buffer? + ? sizeof ?(JustTesting))?JustTesting( " Bad?Idea " , 6 );?? // ?此處用一個JustTesging對象大小的偏移量避免pc3與pc1占用同一塊內(nèi)存,因為如果類動態(tài)的為其成員分配內(nèi)存,占用同一內(nèi)存將會產(chǎn)生問題。?
            ????pc4? = ? new ?JustTesting( " Heap2 " , 10 )?

            ????

            ????delete?pc2;
            ????delete?pc4;
            ????delete?[]?buffer;
            ????
            return ? 0 ;
            }


            以上代碼片斷中,pc1和pc3為布局new操作符來分配內(nèi)存,而pc2和pc4為常規(guī)new操作符來分配內(nèi)存?。
            對于常規(guī)new操作符分配的內(nèi)存,可以直接使用:delete?pc2; 這樣的語句操作來釋放內(nèi)存。

            而對于布局new操作符分配的內(nèi)存就不能這樣做:delete?pc1;

            因為pc1和pc3并沒有直接收到new操作符返回的地址,而是由布局操作符指向了buffer的地址,new/delete系統(tǒng)知道已分配的512字節(jié)塊buffer,但對布局new操作符對該內(nèi)存塊做了何種處理一無所知。
            另一方面,buffer的地址是用new []初始化的,因此必須使用delete[]而不是delete
            注意:即使buffer是使用new而不是new[]初始化的,delete pc1 也將釋放buffer,而不是pc1。

            以上的代碼確實釋放了buffer:delete [] buffer;
            但是由此產(chǎn)生了新的問題,它沒有為布局new操作符在該內(nèi)存塊中創(chuàng)建的對象調(diào)用析構(gòu)函數(shù),我們只需要在析構(gòu)函數(shù)中放入一段顯示語句就可以清楚的看到,程序并沒有銷毀“JustTesting”和“Bad Idea”,也就是pc1和pc3指向的對象。
            那么這里就需要我們顯式的為布局new操作符創(chuàng)建的對象調(diào)用析構(gòu)函數(shù)。正常情況下將自動調(diào)用析構(gòu)函數(shù),這是需要顯示調(diào)用析構(gòu)函數(shù)的少數(shù)幾種情況之一。
            顯式調(diào)用析構(gòu)函數(shù)時,必須指定要銷毀的對象。由于有指向?qū)ο蟮闹羔槪虼丝梢赃@樣寫:

            pc3->~JustTesting();
            pc1->~JustTesting();

            把這段代碼放到delete [] buffer;之前,這段程序才算完整無錯。

            參考書籍:C++PrimerPlus author:Stephen Prata

            posted @ 2006-09-28 14:42 愛上青菜的包子 閱讀(2323) | 評論 (3)編輯 收藏

            在使用new來初始化對象的指針成員時必須特別小心,以下是幾點注意事項:

            • 如果在構(gòu)造函數(shù)中使用new來初始化指針成員,則應(yīng)在析構(gòu)函數(shù)中使用delete。
            • new和delete必須相互兼容。new對應(yīng)于delete,new[]對應(yīng)于delete[]。
            • 如果有多個構(gòu)造函數(shù),則必須以相同的方式使用new,要么都帶中括號,要么都不帶。因為只有一個析構(gòu)函數(shù),因此所有的構(gòu)造函數(shù)都必須與它兼容。不過可以在一個構(gòu)造函數(shù)中使用new來初始化指針,而在另外一個構(gòu)造函數(shù)中將指針初始化為空(Null或0),這是因為delete(無論是帶中括號還是不帶中括號)可以用于空指針。
            posted @ 2006-09-28 14:41 愛上青菜的包子 閱讀(1896) | 評論 (1)編輯 收藏

            例如有以下class:

            class ?StringBad
            {
            ????
            private :
            ????????
            char ? * ?str;
            ????????
            int ?len;
            ?????????
            ????
            public :
            ????????StringBad(
            const ? char ? * ?s);
            ????????StringBad();
            ????????
            ~ StringBad();
            ????????
            }
            ;

            在構(gòu)造函數(shù)和析構(gòu)函數(shù)定義當(dāng)中有如下定義:

            StringBad::StringBad( const ? char ? * ?s)
            {
            ????len?
            = ?std::strlen(s);
            ????str?
            = ? new ? char ?[len? + ? 1 ];
            ????
            }
            ?

            StringBad::StringBad()
            {
            ????len?
            = ? 4 ?;
            ????str?
            = ? new ? char [ 4 ];
            ????
            }
            ?

            StringBad::
            ~ StringBad()
            {
            ????
            ????delete?[]?str;
            }

            那么在程序當(dāng)中如果有以下代碼:

            StringBad?sports( " Spinach?Leaves?Bow1?for?bollars " );
            StringBad?sailor?
            = ?sports;

            以上的第二條初始化語句將會調(diào)用什么構(gòu)造函數(shù)?記住,這種形式的初始化等效于下面的語句:

            StringBad?sailor? = ?StringBad(sports);

            因為sports的類型為StringBad,因此相應(yīng)的構(gòu)造函數(shù)原型應(yīng)該如下:

            StringBad( const ?StringBad? & );

            當(dāng)我們使用一個對象來初始化另一個對象時,編譯器將自動生成上述構(gòu)造函數(shù)(稱為復(fù)制構(gòu)造函數(shù),因為它創(chuàng)建對象的一個副本)。
            現(xiàn)在我們不妨總結(jié)一下所謂的隱式成員函數(shù),即C++自動提供了以下這些成員函數(shù):

            • 默認(rèn)構(gòu)造函數(shù),如果沒有定義構(gòu)造函數(shù)。
            • 復(fù)制構(gòu)造函數(shù),如果沒有定義。
            • 賦值操作符,如果沒有定義。
            • 默認(rèn)析構(gòu)函數(shù),如果沒有定義。
            • 地址操作符,如果沒有定義。

            現(xiàn)在我們來看看我們沒有定義復(fù)制構(gòu)造函數(shù)的情況下調(diào)用隱式復(fù)制構(gòu)造函數(shù)將會出現(xiàn)什么情況。
            從構(gòu)造函數(shù)定義的代碼片斷可以看到,當(dāng)中使用new操作符初始化了一個指針str,而隱式的復(fù)制構(gòu)造函數(shù)是按值進(jìn)行復(fù)制的,那么對于指針str,將會進(jìn)行如下復(fù)制:

            sailor.str? = ?sports.str;

            這里復(fù)制的不是字符串,而是一個指向字符串的指針!也就是說,我們將得到兩個指向同一個字符串的指針!由此會產(chǎn)生的問題將不言而喻。當(dāng)其中一個對象調(diào)用了析構(gòu)函數(shù)之后,其str指向的內(nèi)存將被釋放,這個時候我們?nèi)绻{(diào)用另一個對象,其str指向的地址數(shù)據(jù)會是什么?很明顯將會出現(xiàn)不可預(yù)料的結(jié)果。

            所以由此可見,如果類中包含了使用new初始化的指針成員,應(yīng)當(dāng)定義一個復(fù)制構(gòu)造函數(shù),以復(fù)制指向的數(shù)據(jù),而不是指針,這被稱為深度復(fù)制。因為默認(rèn)的淺復(fù)制(或成為成員復(fù)制)僅淺淺的賦值指針信息。

            我們再看以下代碼片斷,我們稍做修改:

            StringBad?headline1( " Celery?Stalks?at?Midnight " );
            StringBad?knot;
            knot?
            = ?headline1;

            這里的最后一行將與以上例子有所區(qū)別,現(xiàn)在是將已有對象賦給另一個已有對象,這將會采取其他操作,即使用重載的賦值操作符。(我們需要知道的是:初始化總是會調(diào)用復(fù)制構(gòu)造函數(shù),而使用=操作符時也可能調(diào)用賦值操作符)因為C++允許對象賦值,這是通過自動為類重載賦值操作符實現(xiàn)的。其原型如下:

            Class_name? & ?Class_name:: operator ? = ?( const ?Class_name? & );

            它接受并返回一個指向類對象的引用。
            與隱式的復(fù)制構(gòu)造函數(shù)一樣,隱式的對象賦值操作符也會產(chǎn)生同樣的問題,即包含了使用new初始化的指針成員時,只會采用淺復(fù)制。所以我們需要使用同樣的解決辦法,即定義一個重載的賦值操作符來實現(xiàn)深度復(fù)制。

            所以綜上所述,如果類中包含了使用new初始化的指針成員,我們應(yīng)該顯式定義一個復(fù)制構(gòu)造函數(shù)和一個重載的賦值操作符來實現(xiàn)其深度復(fù)制,避免由此帶來的成員復(fù)制問題

            參考書籍:C++PrimerPlus author:Stephen Prata

            posted @ 2006-09-28 14:33 愛上青菜的包子 閱讀(1581) | 評論 (0)編輯 收藏

            很喜歡C++,學(xué)習(xí)也有一段時間了。但是看書+練手的同時,總感覺有必要將自己學(xué)習(xí)中覺得重要的地方整理出來,以便以后回頭參考。最終選擇了cppblog,呵呵。以后就在這里安家了~~
            筆記中參考了一些書籍中的范例和一些說明。都是自己學(xué)習(xí)過程中整理出來的,主要目的是給自己日后參考。
            posted @ 2006-09-28 14:23 愛上青菜的包子 閱讀(442) | 評論 (1)編輯 收藏

            僅列出標(biāo)題  
            亚洲综合久久久| 亚洲精品乱码久久久久66| 久久99精品久久久久久噜噜 | 亚洲国产日韩欧美综合久久| 一本一道久久a久久精品综合| 亚洲va久久久噜噜噜久久天堂| 国产精品欧美久久久天天影视| 久久精品这里只有精99品| 人妻无码精品久久亚瑟影视 | 久久亚洲欧洲国产综合| 精品久久久久久亚洲精品 | 久久久av波多野一区二区| 久久天天躁狠狠躁夜夜不卡| 久久久噜噜噜久久熟女AA片| 亚洲人成网站999久久久综合 | 99精品伊人久久久大香线蕉| 天堂久久天堂AV色综合| 色婷婷噜噜久久国产精品12p| 久久国产精品久久| 久久久久国产精品熟女影院| 综合久久一区二区三区| 国产精品成人无码久久久久久| 久久久久AV综合网成人| 久久人人爽人人爽人人片AV不| 久久精品国产精品亚洲| 99久久夜色精品国产网站| 国产精品久久久久久久| 97精品依人久久久大香线蕉97 | 麻豆久久久9性大片| 久久久久香蕉视频| 国产精品一区二区久久精品无码| 精品久久久久久中文字幕人妻最新| 亚洲日韩中文无码久久| 成人综合久久精品色婷婷| 亚洲欧洲久久久精品| 亚洲精品乱码久久久久久蜜桃| 久久精品国产99国产精品| 久久九色综合九色99伊人| 久久精品无码一区二区日韩AV| 九九久久精品国产| 欧美日韩精品久久久久|