雕欄玉砌應(yīng)猶在,只是朱顏改
2008年7月21日 #
2006年11月29日 #
2006年11月10日 #
多吃堿性食物。研究發(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ū)分酸性或堿性食物。看起來挺恐怖的。。。看來得注意下伙食了,以后要多吃水果、蔬菜。。。~~~
2006年10月26日 #
這幾天拿到公司以前項目中的一個用C++Builder做的程序,在我機(jī)器上調(diào)試,結(jié)果提示出錯:Operation not applicable
使用斷點跟蹤之后發(fā)現(xiàn)錯誤出在使用TQuery時執(zhí)行open方法時,回追根源,得出以下反饋:
執(zhí)行完這句之后,按正常情況,參數(shù)PId應(yīng)該被賦予了一個整形值,但是Debug跟蹤顯示其值還是跟未賦值前是同樣表示的未知值。所以在執(zhí)行open方法時出錯了。
如果我不是用該方法,直接把SQL語句寫死:
運(yùn)行正常
或者用
也運(yùn)行正常
查了下,原來給參數(shù)賦值的方法并沒有錯誤,編譯也能通過,況且以前該程序肯定是能正常運(yùn)行的。。真是奇怪為什么在我這里就賦不上值。。調(diào)試了很久也沒能找到原因,只好作罷,為了順利運(yùn)行,只能改為sprintf和直接連接字符串的方式。在這里記上一筆,希望以后能夠找到原因。。。
2006年9月28日 #
本文對我前面幾篇隨筆中提到的問題也作出了一個總結(jié),感覺很有必要記下來。以上內(nèi)容原文引用自參考書籍中內(nèi)容。參考書籍:C++PrimerPlus author:Stephen Prata
?
以上代碼片斷中,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ū)ο蟮闹羔槪虼丝梢赃@樣寫:
把這段代碼放到delete [] buffer;之前,這段程序才算完整無錯。
參考書籍:C++PrimerPlus author:Stephen Prata
在使用new來初始化對象的指針成員時必須特別小心,以下是幾點注意事項:
例如有以下class:
在構(gòu)造函數(shù)和析構(gòu)函數(shù)定義當(dāng)中有如下定義:
那么在程序當(dāng)中如果有以下代碼:
以上的第二條初始化語句將會調(diào)用什么構(gòu)造函數(shù)?記住,這種形式的初始化等效于下面的語句:
因為sports的類型為StringBad,因此相應(yīng)的構(gòu)造函數(shù)原型應(yīng)該如下:
當(dāng)我們使用一個對象來初始化另一個對象時,編譯器將自動生成上述構(gòu)造函數(shù)(稱為復(fù)制構(gòu)造函數(shù),因為它創(chuàng)建對象的一個副本)。現(xiàn)在我們不妨總結(jié)一下所謂的隱式成員函數(shù),即C++自動提供了以下這些成員函數(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ù)制:
這里復(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ù)制)僅淺淺的賦值指針信息。
我們再看以下代碼片斷,我們稍做修改:
這里的最后一行將與以上例子有所區(qū)別,現(xiàn)在是將已有對象賦給另一個已有對象,這將會采取其他操作,即使用重載的賦值操作符。(我們需要知道的是:初始化總是會調(diào)用復(fù)制構(gòu)造函數(shù),而使用=操作符時也可能調(diào)用賦值操作符)因為C++允許對象賦值,這是通過自動為類重載賦值操作符實現(xiàn)的。其原型如下:
它接受并返回一個指向類對象的引用。與隱式的復(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
Powered by: C++博客 Copyright © 愛上青菜的包子