a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > Delphi > 正文

《delphi高手突破》節(jié)選二

2019-11-18 18:42:38
字體:
供稿:網(wǎng)友

完成了第三章 異常及錯(cuò)誤處理,節(jié)選一節(jié)

構(gòu)造函數(shù)與異常

這個(gè)話題在C++社區(qū)中經(jīng)常會(huì)被提起,而在Delphi社區(qū)中似乎從來沒有人注意過。也許由于語言的特性,使得Delphi程序員不必關(guān)心這個(gè)問題。但我想Delphi程序員也應(yīng)該對(duì)該問題有所了解,知道語言為我們提供了什么而使得我們?nèi)绱溯p松,不必理會(huì)它。正所謂“身在福中須知福”。
我們知道,類的構(gòu)造函數(shù)是沒有返回值的,如果構(gòu)造函數(shù)構(gòu)造對(duì)象失敗,不可能依靠返回錯(cuò)誤代碼。那么,在程序中如何標(biāo)識(shí)構(gòu)造函數(shù)的失敗呢?最“標(biāo)準(zhǔn)”的方法就是:拋出一個(gè)異常。
構(gòu)造函數(shù)失敗,意味著對(duì)象的構(gòu)造失敗,那么拋出異常之后,這個(gè)“半死不活”的對(duì)象會(huì)被如何處理呢?
在此,我想讀著有必要先對(duì)C++對(duì)這種情況的處理方式先有個(gè)了解。
在C++中,構(gòu)造函數(shù)拋出異常后,析構(gòu)函數(shù)不會(huì)被調(diào)用。這種做法是合理的,因?yàn)榇藭r(shí)對(duì)象并沒有被完整構(gòu)造。
如果構(gòu)造函數(shù)已經(jīng)做了一些諸如分配內(nèi)存、打開文件等操作的話,那么C++類需要有自己的成員來記住做過哪些動(dòng)作。當(dāng)然,這樣做對(duì)于類的實(shí)現(xiàn)者來說非常麻煩,因此一般C++類的實(shí)現(xiàn)者都避免在構(gòu)造函數(shù)中拋出異常(可以提供一個(gè)諸如Init和UnInit的成員函數(shù),由構(gòu)造函數(shù)或類的客戶去調(diào)用它們,以處理初始化失敗的情況)。而每一本C++的經(jīng)典著作所提供的方案是使用智能指針(STL的標(biāo)準(zhǔn)類auto_ptr)。
在Object Pascal中,這個(gè)問題變得非常的簡單,程序員不必為此大費(fèi)周折。如果Object Pascal的類在構(gòu)造函數(shù)中拋出異常,編譯器會(huì)自動(dòng)調(diào)用類的析構(gòu)函數(shù)(由于析構(gòu)函數(shù)不允許被重載,可以保證只有唯一一個(gè)析構(gòu)函數(shù),因此編譯器不會(huì)迷惑于多個(gè)析構(gòu)函數(shù)之中)。析構(gòu)函數(shù)中一般會(huì)析構(gòu)成員對(duì)象,而Free()方法保證了不會(huì)對(duì)nil對(duì)象(即尚未被創(chuàng)建的成員對(duì)象)調(diào)用析構(gòu)函數(shù),因此在使得代碼簡潔優(yōu)美的前提下,又保證了安全。
type MyClass = class
PRivate
FStr : PChar; // 字符串指針
public
constructor Create();
destructor Destroy(); override;
end;
 
constructor MyClass.Create();
begin
FStr := StrAlloc(10); // 構(gòu)造函數(shù)中為字符串指針分配內(nèi)存
StrCopy(FStr, 'ABCDEFGHI');
raise Exception.Create('error'); // 拋出異常,沒有理由,呵呵
end;
 
destructor A.Destroy();
begin
StrDispose(FStr); // 析構(gòu)函數(shù)中釋放內(nèi)存
WriteLn('Free Resource');
end;
 
var
Obj : TMyClass;
i : integer;
begin
try
Obj := TMyClass.Create();
Obj.Free();
WriteLn('Succeeded');
except
Obj := nil;
WriteLn('Failed');
end;
 
Read(i); // 暫停屏幕,以便觀察運(yùn)行結(jié)果
end.
 
在這段代碼中,構(gòu)造函數(shù)拋出異常,執(zhí)行的結(jié)果是:
Free Resource
Failed
此時(shí)的“Free Resource”輸出是由編譯器自動(dòng)調(diào)用析構(gòu)函數(shù)所產(chǎn)生的。
因此,如果類的說明文檔或類的作者告知你,類的構(gòu)造函數(shù)可能會(huì)拋出異常,那就要記得用try…except包住它!
C++與Object Pascal對(duì)于構(gòu)造函數(shù)拋出異常后的不同處理方式,其實(shí)正是兩種語言的設(shè)計(jì)思想的體現(xiàn)。C++秉承C的風(fēng)格,注重效率,一切交給程序員來掌握,編譯器不作多余動(dòng)作。Object Pascal繼承Pascal的風(fēng)格,注重程序的美學(xué)意義,編譯器幫助程序員完成復(fù)雜的工作。

上一篇:用DELPHI制作在線程序升級(jí)信息查詢

下一篇:《delphi高手突破》節(jié)選一

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: av在线一区二区 | 久草免费电影 | 超碰美女 | 久久亚| 成人在线视频免费观看 | 日韩亚洲欧美一区二区 | 午夜激情福利视频 | 成人激情综合 | 日韩一区二区在线播放 | 99综合 | 日韩免费av一区二区 | 日韩一区二区三区在线观看 | 久久视频免费 | 99久久久无码国产精品 | 精品国产一区二区 | 欧美激情视频一区二区三区在线播放 | 国产一级黄片毛片 | 亚洲精品美女久久久 | 91tv亚洲精品香蕉国产一区 | 精品suv一区二区 | 色十八| 美女网站视频免费黄 | 中文字幕日本一区 | 狠狠色丁香九九婷婷综合五月 | 国产婷婷色综合av蜜臀av | 午夜成人在线视频 | 欧美一二 | 麻豆精品久久久 | 麻豆一区二区三区 | 日韩中文字幕一区二区 | 精品国产乱码久久久久久久 | 久久久久久网站 | 国产九九精品视频 | 99久久婷婷国产精品综合 | 午夜成人在线视频 | 欧美久久精品 | 日本私人网站在线观看 | 在线观看v片 | 国产伦理精品一区二区三区观看体验 | 日韩视频免费在线 | 色在线免费观看 |