雕欄玉砌應(yīng)猶在,只是朱顏改
2008年7月21日 #
2006年11月29日 #
2006年11月10日 #
多吃堿性食物。研究發(fā)現(xiàn),多食堿性食物,可保持血液呈弱堿性,使得血液中乳酸、尿素等酸性物質(zhì)減少,并能防止其在管壁上沉積,因而有軟化血管的作用,故有人稱堿性食物為“血液和血管的清潔劑”。這里所說(shuō)的酸堿性,不是食物本身的性質(zhì),而是指食物經(jīng)過(guò)消化吸收后,留在體內(nèi)元素的性質(zhì)。常見(jiàn)的酸性元素有氮、碳、硫等;常見(jiàn)的堿性元素有鉀、鈉、鈣、鎂等。有的食物口味很酸,如番茄、橘子,卻都是地地道道的強(qiáng)堿性食物,因?yàn)樗鼈冊(cè)隗w內(nèi)代謝后的最終元素是鉀元素等。
何謂酸性或堿性食物 所謂酸性食物或堿性食物,并不是指味道酸或咸的食物,而是指食物經(jīng)過(guò)消化吸收和代謝后產(chǎn)生的陽(yáng)離子或陰離子占優(yōu)勢(shì)的食物。也就是說(shuō),某種食物如經(jīng)代謝后產(chǎn)生的鉀、鈉、鈣、鎂等陽(yáng)離子占優(yōu)勢(shì)的則屬堿性食物;而代謝后產(chǎn)生磷、氯、硫等陰離子占優(yōu)勢(shì)的食物屬酸性食物。檸檬、柑桔、楊桃等味道雖酸,但它經(jīng)代謝后,有機(jī)酸變成了水和二氧化碳,后者經(jīng)肺呼出體外,剩下的陽(yáng)離子占優(yōu)勢(shì),仍屬堿性食物;同理,肉、魚、蛋類和米面雖無(wú)酸味,但代謝后產(chǎn)生的陰離子較多,仍屬于酸性食物。因此,不能從食物的味道來(lái)區(qū)分酸性或堿性食物。看起來(lái)挺恐怖的。。。看來(lái)得注意下伙食了,以后要多吃水果、蔬菜。。。~~~
2006年10月26日 #
這幾天拿到公司以前項(xiàng)目中的一個(gè)用C++Builder做的程序,在我機(jī)器上調(diào)試,結(jié)果提示出錯(cuò):Operation not applicable
使用斷點(diǎn)跟蹤之后發(fā)現(xiàn)錯(cuò)誤出在使用TQuery時(shí)執(zhí)行open方法時(shí),回追根源,得出以下反饋:
執(zhí)行完這句之后,按正常情況,參數(shù)PId應(yīng)該被賦予了一個(gè)整形值,但是Debug跟蹤顯示其值還是跟未賦值前是同樣表示的未知值。所以在執(zhí)行open方法時(shí)出錯(cuò)了。
如果我不是用該方法,直接把SQL語(yǔ)句寫死:
運(yùn)行正常
或者用
也運(yùn)行正常
查了下,原來(lái)給參數(shù)賦值的方法并沒(méi)有錯(cuò)誤,編譯也能通過(guò),況且以前該程序肯定是能正常運(yùn)行的。。真是奇怪為什么在我這里就賦不上值。。調(diào)試了很久也沒(méi)能找到原因,只好作罷,為了順利運(yùn)行,只能改為sprintf和直接連接字符串的方式。在這里記上一筆,希望以后能夠找到原因。。。
2006年9月28日 #
本文對(duì)我前面幾篇隨筆中提到的問(wèn)題也作出了一個(gè)總結(jié),感覺(jué)很有必要記下來(lái)。以上內(nèi)容原文引用自參考書籍中內(nèi)容。參考書籍:C++PrimerPlus author:Stephen Prata
?
以上代碼片斷中,pc1和pc3為布局new操作符來(lái)分配內(nèi)存,而pc2和pc4為常規(guī)new操作符來(lái)分配內(nèi)存?。對(duì)于常規(guī)new操作符分配的內(nèi)存,可以直接使用:delete?pc2; 這樣的語(yǔ)句操作來(lái)釋放內(nèi)存。而對(duì)于布局new操作符分配的內(nèi)存就不能這樣做:delete?pc1;
因?yàn)閜c1和pc3并沒(méi)有直接收到new操作符返回的地址,而是由布局操作符指向了buffer的地址,new/delete系統(tǒng)知道已分配的512字節(jié)塊buffer,但對(duì)布局new操作符對(duì)該內(nèi)存塊做了何種處理一無(wú)所知。另一方面,buffer的地址是用new []初始化的,因此必須使用delete[]而不是delete。注意:即使buffer是使用new而不是new[]初始化的,delete pc1 也將釋放buffer,而不是pc1。
以上的代碼確實(shí)釋放了buffer:delete [] buffer;但是由此產(chǎn)生了新的問(wèn)題,它沒(méi)有為布局new操作符在該內(nèi)存塊中創(chuàng)建的對(duì)象調(diào)用析構(gòu)函數(shù),我們只需要在析構(gòu)函數(shù)中放入一段顯示語(yǔ)句就可以清楚的看到,程序并沒(méi)有銷毀“JustTesting”和“Bad Idea”,也就是pc1和pc3指向的對(duì)象。那么這里就需要我們顯式的為布局new操作符創(chuàng)建的對(duì)象調(diào)用析構(gòu)函數(shù)。正常情況下將自動(dòng)調(diào)用析構(gòu)函數(shù),這是需要顯示調(diào)用析構(gòu)函數(shù)的少數(shù)幾種情況之一。顯式調(diào)用析構(gòu)函數(shù)時(shí),必須指定要銷毀的對(duì)象。由于有指向?qū)ο蟮闹羔槪虼丝梢赃@樣寫:
把這段代碼放到delete [] buffer;之前,這段程序才算完整無(wú)錯(cuò)。
參考書籍:C++PrimerPlus author:Stephen Prata
在使用new來(lái)初始化對(duì)象的指針成員時(shí)必須特別小心,以下是幾點(diǎn)注意事項(xiàng):
例如有以下class:
在構(gòu)造函數(shù)和析構(gòu)函數(shù)定義當(dāng)中有如下定義:
那么在程序當(dāng)中如果有以下代碼:
以上的第二條初始化語(yǔ)句將會(huì)調(diào)用什么構(gòu)造函數(shù)?記住,這種形式的初始化等效于下面的語(yǔ)句:
因?yàn)閟ports的類型為StringBad,因此相應(yīng)的構(gòu)造函數(shù)原型應(yīng)該如下:
當(dāng)我們使用一個(gè)對(duì)象來(lái)初始化另一個(gè)對(duì)象時(shí),編譯器將自動(dòng)生成上述構(gòu)造函數(shù)(稱為復(fù)制構(gòu)造函數(shù),因?yàn)樗鼊?chuàng)建對(duì)象的一個(gè)副本)。現(xiàn)在我們不妨總結(jié)一下所謂的隱式成員函數(shù),即C++自動(dòng)提供了以下這些成員函數(shù):
現(xiàn)在我們來(lái)看看我們沒(méi)有定義復(fù)制構(gòu)造函數(shù)的情況下調(diào)用隱式復(fù)制構(gòu)造函數(shù)將會(huì)出現(xiàn)什么情況。從構(gòu)造函數(shù)定義的代碼片斷可以看到,當(dāng)中使用new操作符初始化了一個(gè)指針str,而隱式的復(fù)制構(gòu)造函數(shù)是按值進(jìn)行復(fù)制的,那么對(duì)于指針str,將會(huì)進(jìn)行如下復(fù)制:
這里復(fù)制的不是字符串,而是一個(gè)指向字符串的指針!也就是說(shuō),我們將得到兩個(gè)指向同一個(gè)字符串的指針!由此會(huì)產(chǎn)生的問(wèn)題將不言而喻。當(dāng)其中一個(gè)對(duì)象調(diào)用了析構(gòu)函數(shù)之后,其str指向的內(nèi)存將被釋放,這個(gè)時(shí)候我們?nèi)绻{(diào)用另一個(gè)對(duì)象,其str指向的地址數(shù)據(jù)會(huì)是什么?很明顯將會(huì)出現(xiàn)不可預(yù)料的結(jié)果。
所以由此可見(jiàn),如果類中包含了使用new初始化的指針成員,應(yīng)當(dāng)定義一個(gè)復(fù)制構(gòu)造函數(shù),以復(fù)制指向的數(shù)據(jù),而不是指針,這被稱為深度復(fù)制。因?yàn)槟J(rèn)的淺復(fù)制(或成為成員復(fù)制)僅淺淺的賦值指針信息。
我們?cè)倏匆韵麓a片斷,我們稍做修改:
這里的最后一行將與以上例子有所區(qū)別,現(xiàn)在是將已有對(duì)象賦給另一個(gè)已有對(duì)象,這將會(huì)采取其他操作,即使用重載的賦值操作符。(我們需要知道的是:初始化總是會(huì)調(diào)用復(fù)制構(gòu)造函數(shù),而使用=操作符時(shí)也可能調(diào)用賦值操作符)因?yàn)镃++允許對(duì)象賦值,這是通過(guò)自動(dòng)為類重載賦值操作符實(shí)現(xiàn)的。其原型如下:
它接受并返回一個(gè)指向類對(duì)象的引用。與隱式的復(fù)制構(gòu)造函數(shù)一樣,隱式的對(duì)象賦值操作符也會(huì)產(chǎn)生同樣的問(wèn)題,即包含了使用new初始化的指針成員時(shí),只會(huì)采用淺復(fù)制。所以我們需要使用同樣的解決辦法,即定義一個(gè)重載的賦值操作符來(lái)實(shí)現(xiàn)深度復(fù)制。
所以綜上所述,如果類中包含了使用new初始化的指針成員,我們應(yīng)該顯式定義一個(gè)復(fù)制構(gòu)造函數(shù)和一個(gè)重載的賦值操作符來(lái)實(shí)現(xiàn)其深度復(fù)制,避免由此帶來(lái)的成員復(fù)制問(wèn)題參考書籍:C++PrimerPlus author:Stephen Prata
Powered by: C++博客 Copyright © 愛(ài)上青菜的包子