版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2014-12-07 葉茂野貓野貓野貓野貓野貓62/62野貓VisualStudio及編程技術(shù)總結(jié)總論編程基礎(chǔ)操作系統(tǒng)操作系統(tǒng)的種類相當(dāng)多,各種設(shè)備安裝的操作系統(tǒng)可從簡單到復(fù)雜,可分為智能卡操作系統(tǒng)、實(shí)時操作系統(tǒng)、傳感器節(jié)點(diǎn)操作系統(tǒng)、嵌入式操作系統(tǒng)、個人計(jì)算機(jī)操作系統(tǒng)、多處理器操作系統(tǒng)、網(wǎng)絡(luò)操作系統(tǒng)和大型機(jī)操作系統(tǒng)。按應(yīng)用領(lǐng)域劃分主要有三種:桌面操作系統(tǒng)、服務(wù)器操作系統(tǒng)和嵌入式操作系統(tǒng)。桌面操作系統(tǒng)主要用于個人計(jì)算機(jī)上。個人計(jì)算機(jī)市場從硬件架構(gòu)上來說主要分為兩大陣營,PC機(jī)與Mac機(jī),從軟件上可主要分為兩大類,分別為類Unix操作系統(tǒng)和Windows操作系統(tǒng)。其中Unix和類Unix操作系統(tǒng)有MacOSX,Linux發(fā)行版(如Debian,Ubuntu,LinuxMint,openSUSE,F(xiàn)edora等);微軟公司W(wǎng)indows操作系統(tǒng)有Windows98,WindowsXP,WindowsVista,Windows7,Windows8,Windows10。服務(wù)器操作系統(tǒng)一般指的是安裝在大型計(jì)算機(jī)上的操作系統(tǒng),比如Web服務(wù)器、應(yīng)用服務(wù)器和數(shù)據(jù)庫服務(wù)器等。服務(wù)器操作系統(tǒng)主要集中在三大類:Unix系列:SUNSolaris,IBM-AIX,HP-UX,F(xiàn)reeBSD,OSXServer[3]等;Linux系列:RedHatLinux,CentOS,Debian,UbuntuServer等;Windows系列:WindowsNTServer,WindowsServer2003,WindowsServer2008,WindowsServer2008R2等。嵌入式操作系統(tǒng)是應(yīng)用在嵌入式系統(tǒng)的操作系統(tǒng)。嵌入式系統(tǒng)廣泛應(yīng)用在生活的各個方面,涵蓋范圍從便攜設(shè)備到大型固定設(shè)施,如數(shù)碼相機(jī)、手機(jī)、平板電腦、家用電器、醫(yī)療設(shè)備、交通燈、航空電子設(shè)備和工廠控制設(shè)備等,越來越多嵌入式系統(tǒng)安裝有實(shí)時操作系統(tǒng)。在嵌入式領(lǐng)域常用的操作系統(tǒng)有嵌入式Linux、WindowsEmbedded、VxWorks等,以及廣泛使用在智能手機(jī)或平板電腦等消費(fèi)電子產(chǎn)品的操作系統(tǒng),如Android、iOS、Symbian、WindowsPhone和BlackBerryOS等。桌面和服務(wù)器操作系統(tǒng)多是C語言編寫,而嵌入式操作系統(tǒng)中手機(jī)系統(tǒng)多是Java語言編寫,但蘋果手機(jī)系統(tǒng)是object-C語言。編程語言計(jì)算機(jī)語言有3大類:機(jī)器語言、匯編語言、高級語言,機(jī)器語言是機(jī)器依賴的,而且非常煩瑣,后簡化為助記符語言,即匯編語言,后又在此基礎(chǔ)上進(jìn)一步簡化,而成為高級語言,顯然,高級語言需要通過編譯器轉(zhuǎn)換成機(jī)器語言才能使計(jì)算機(jī)理解。高級語言分為:Fortran(1954)、Cobol(1961)、Basic(1964)、C(1972)、object-C(1980)、C++(1983)、Java(1995)、C#(2000)。1999年隨著MicrosoftWindows圖形用戶界面GUI的推出,出現(xiàn)了VisualBasic、VisualC++、VisualC#。Fortran的最大特性是接近數(shù)學(xué)公式的自然描述,在計(jì)算機(jī)里具有很高的執(zhí)行效率。易學(xué),語法嚴(yán)謹(jǐn)??梢灾苯訉仃嚭蛷?fù)數(shù)進(jìn)行運(yùn)算,這一點(diǎn)類似MATLAB。自誕生以來廣泛地應(yīng)用于數(shù)值計(jì)算領(lǐng)域,積累了大量高效而可靠的源程序。很多專用的大型數(shù)值運(yùn)算計(jì)算機(jī)針對Fortran做了優(yōu)化。現(xiàn)在仍廣泛地應(yīng)用于并行計(jì)算和高性能計(jì)算領(lǐng)域。Cobol擅長于需要精確和有效地操作大量數(shù)據(jù)的商業(yè)應(yīng)用。目前仍然有大量的企業(yè)軟件是用它編寫的。它是數(shù)據(jù)處理領(lǐng)域最為廣泛的程序設(shè)計(jì)語言,是第一個廣泛使用的高級編程語言。Basic用于快速而方便地編寫簡單程序,主要目的是讓新手熟悉編程技術(shù)。屬于事件驅(qū)動語言。優(yōu)點(diǎn):簡單易學(xué),會話式,既能進(jìn)行科學(xué)計(jì)算,又能數(shù)據(jù)處理等、有兩種執(zhí)行方式:解釋方式和編譯方式。其中解釋方式可以邊輸程序邊運(yùn)行、非常適合初學(xué)者。C語言是一個有結(jié)構(gòu)化程序設(shè)計(jì)、具有變量作用域以及遞歸功能的過程式語言,與硬件無關(guān),具有廣泛可移植性。傳遞參數(shù)均是以值傳遞,另外也可以傳遞指針、不同的變量類型可以用結(jié)構(gòu)體組合在一起。通過指針,C語言可以容易的對存儲器進(jìn)行低級控制。編譯預(yù)處理讓C語言的編譯更具有彈性。開發(fā)了UNIX系統(tǒng)。Objective-C是非?!皩?shí)際”的語言。它使用一個用C寫成、很小的運(yùn)行庫,只會令應(yīng)用程序的大小增加很小。ObjC不包括命名空間機(jī)制,取而代之的是程序設(shè)計(jì)師必須在其類別名稱加上前綴,時常引致沖突。雖然Objective-C是C的母集,但它也不視C的基本型別為第一級的對象。和C++不同,Objective-C不支持運(yùn)算子多載(它不支持ad-hoc多型)。亦與C++不同,但和Java相同,Objective-C只容許對象繼承一個類別(不設(shè)多重繼承)。Categories和protocols不但可以提供很多多重繼承的好處,而且沒有很多缺點(diǎn),例如額外執(zhí)行時間過重和二進(jìn)制不兼容。C++語言在C語言的基礎(chǔ)上提供了面向?qū)ο缶幊烫匦?,C++是一種靜態(tài)數(shù)據(jù)類型檢查的、支持多重編程范式的通用程序設(shè)計(jì)語言。它支持過程化程序設(shè)計(jì)、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計(jì)、泛型程序設(shè)計(jì)等多種程序設(shè)計(jì)風(fēng)格。隨著代碼量和復(fù)雜度的增加,C++的優(yōu)勢將會越來越明顯。造成這種差別的就是C++的軟件工程性。但C++由于語言本身過度復(fù)雜,這甚至使人類難于理解其語義。更為糟糕的是C++的編譯系統(tǒng)受到C++的復(fù)雜性的影響,非常難于編寫,即使能夠使用的編譯器也存在了大量的問題,這些問題大多難于被發(fā)現(xiàn),在unix/linux領(lǐng)域受到抨擊。java是一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計(jì)語言,是由SunMicrosystems公司于1995年5月推出的Java程序設(shè)計(jì)語言和Java平臺(即JavaEE(j2ee),JavaME(j2me),JavaSE(j2se))的總稱。Java自面世后就非常流行,發(fā)展迅速,對C++語言形成了有力沖擊。Java技術(shù)具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應(yīng)用于個人PC、數(shù)據(jù)中心、游戲控制臺、科學(xué)超級計(jì)算機(jī)、移動電話和互聯(lián)網(wǎng),同時擁有全球最大的開發(fā)者專業(yè)社群。在全球云計(jì)算和移動互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢和廣闊前景。C#是一種安全的、穩(wěn)定的、簡單的、優(yōu)雅的,由C和C++衍生出來的面向?qū)ο蟮木幊陶Z言。它在繼承C和C++強(qiáng)大功能的同時去掉了一些它們的復(fù)雜特性(例如沒有宏以及不允許多重繼承)。C#綜合了VB簡單的可視化操作和C++的高運(yùn)行效率,以其強(qiáng)大的操作能力、優(yōu)雅的語法風(fēng)格、創(chuàng)新的語言特性和便捷的面向組件編程的支持成為.NET開發(fā)的首選語言??偨Y(jié):高級語言各有應(yīng)用領(lǐng)域,F(xiàn)ortran用于復(fù)雜數(shù)學(xué)計(jì)算的科學(xué)工程,Cobol用于大數(shù)據(jù)量的商業(yè)應(yīng)用,Basic用于初學(xué),C語言用于底層開發(fā)系統(tǒng),而C++、C#、Java多用于開發(fā)各種應(yīng)用軟件。越高級的語言,就越遠(yuǎn)離低層,因此要全面衡量各種語言,根據(jù)實(shí)際的項(xiàng)目需要選擇。運(yùn)行效率要求高的、底層控制要求高的用C/C++,否則可以選擇Java/C#;跨平臺的要求高的可以用Java。運(yùn)算符優(yōu)先級:單操作>算術(shù)>比較>邏輯>賦值。ASCII字符集是一個比較精簡的字符集,為方便全球共用一個字符集,人們創(chuàng)建了Unicode標(biāo)準(zhǔn),它又分為UTF-8、UTF-16、UTF-32,它們的區(qū)別是用幾位表示字符,ASICII是用1個字節(jié),UTF-8用1到4個字節(jié),UTF-16用2個以上字節(jié)。編程感想編程就是讓計(jì)算機(jī)為解決某個問題而使用某種程序設(shè)計(jì)語言編寫程序代碼,并最終得到結(jié)果的過程。為了使計(jì)算機(jī)能夠理解人的意圖,人類就必須要將需解決的問題的思路、方法、和手段通過計(jì)算機(jī)能夠理解的形式告訴計(jì)算機(jī),使得計(jì)算機(jī)能夠根據(jù)人的指令一步一步去工作,完成某種特定的任務(wù)。這種人和計(jì)算機(jī)之間交流的過程就是編程。操作系統(tǒng)將一些簡單的指令封裝成一個簡單的操作,使得我們的操作更容易更簡單,然而操作系統(tǒng)提供的操作始終是有限的,如果要擴(kuò)展計(jì)算機(jī)的軟件系統(tǒng),就需要編程了。程序編寫需要有通用函數(shù)的思想、分解的思想、顯化調(diào)試的思想。調(diào)試技巧調(diào)試的根本方法是顯化操作,可以監(jiān)視、可以messagebox。利用{}的匹配作用,如果{}之間有錯誤,那么鼠標(biāo)指在{上時會{變紅,因此可以此判斷錯誤就在{}之間,進(jìn)而可以分段找出錯誤,此為大型代碼查錯速法。斷點(diǎn),逐語句F10、逐過程F11、和監(jiān)控。分解調(diào)試。調(diào)試(F5、shift+F5)——局部變量和自動變量,調(diào)出變量窗口,它們都負(fù)責(zé)顯示一些當(dāng)前斷住狀態(tài)下的變量的值,注意,這些只有在程序中斷的時候才有意義。自動變量選項(xiàng)卡并非指auto變量,而是指VS幫我們猜想我們可能感興趣的一些變量的值,或者函數(shù)返回值,而局部變量基本上就是本過程的一些變量的值了。注意,這些選項(xiàng)卡不僅僅可以用于查看,甚至可以用于你臨時修改它們的值,方法就是雙擊值就可以了。調(diào)試——監(jiān)視,調(diào)試——調(diào)用堆棧。右擊你想查看的變量,選擇快速監(jiān)視。程序分為debug和release版本,前者用于調(diào)試,后者優(yōu)化發(fā)布。常見錯誤符號缺失、名字拼寫錯誤、重復(fù)定義、找不到。下標(biāo)越界、=與==誤用、死循環(huán)。程序默認(rèn)讀寫在雙重“工程名”文件夾內(nèi)。找不到關(guān)鍵字。VS中double(1/3*pi)=0常見英文簡寫ADO ActiveXDataObjects 一組優(yōu)化的訪問數(shù)據(jù)庫的專用對象集API ApplicationProgrammingInterface應(yīng)用編程接口ASPActiveServerPage 動態(tài)服務(wù)器頁面BBS BulletinBoardSystem 論壇CEO ChiefExecutiveOfficer 首席執(zhí)行官CLR CommonLanguageRuntime 公共語言運(yùn)行環(huán)境CLI CommonLanguageInfrastructure 公共語言基礎(chǔ)結(jié)構(gòu)DBA DataBaseAdministrator 數(shù)據(jù)庫管理員FCL FrameworkClassLibrary 框架類庫HTTP HyperTextTransferProtocol 超文本傳輸協(xié)議HTML HyperTextMark-upLanguage 超文本標(biāo)記語言IT InformationTechnology 信息技術(shù)ISOInternationalOrganizationforStandardization 國際標(biāo)準(zhǔn)化組織OA OfficeAutomatization 辦公自動化OOP Object-OrientedProgramming 面向?qū)ο缶幊蘋OD Object-OrientedDesign 面向?qū)ο笤O(shè)計(jì)OOA Object-OrientedAnalysis 面向?qū)ο蠓治鯬HP PersonalHomePage 超級文本預(yù)處理語言SDK SoftwareDevelopmentKit 軟件開發(fā)包SOAP SimpleObjectAccessProtoco 簡單對象訪問協(xié)議SGMLStandardGeneralizedMarkupLanguage 標(biāo)準(zhǔn)通用標(biāo)記語言URI UniversalResourceIdentifier 通用資源標(biāo)志符URL UniformResourceLocation 統(tǒng)一資源定位符WWWWorldWideWeb 萬維網(wǎng),是默認(rèn)的web主機(jī)名XML ExtensibleMarkupLanguage 可擴(kuò)展性的語言VSVS優(yōu)點(diǎn)一統(tǒng)VB、VC++、VC#、VF#4種語言,推出.NET來實(shí)現(xiàn)跨語言、跨平臺。VS設(shè)置添加篩選器了,默認(rèn)情況下VS為我們創(chuàng)建三個篩選器:頭文件、源文件和資源文件,實(shí)際上我們可以再增加很多。下載安裝一個SVNForVS使你的項(xiàng)目管理更加強(qiáng)大,可以還原代碼至任意編譯過的時間。如果你已經(jīng)安裝好了AnkhSVN插件但是又看不到的話,那么請檢查下系統(tǒng)選項(xiàng)卡里面是否選擇了它作為默認(rèn)的源代碼管理工具。VisualAssistX(簡稱VAX)是一款優(yōu)秀的VS輔助插件,下載安裝后可以輔助你編程,比如智能聯(lián)想補(bǔ)全代碼。隨著VisualStudio的不斷完善,VisualAssistX逐漸失去作用。安裝好本地幫助文件,則可以在程序任何地方F1獲取幫助。需要更改項(xiàng)目名稱時,利用記事本打開所有項(xiàng)目文件夾中的重要文件,查找替換掉原名字即可。工具——選項(xiàng)——環(huán)境——鍵盤可以查看快捷鍵對應(yīng)的操作和操作對應(yīng)的快捷鍵,并可創(chuàng)建或修改快捷鍵。工具-選項(xiàng)-文本編輯器-所有語言-常規(guī)-取消勾選“沒有選定內(nèi)容時對穿行應(yīng)用剪切或復(fù)制命令”,可以防止復(fù)制空行。程序發(fā)布技巧(有疑問立即百度,不留問題過夜)形成自己的編程風(fēng)格每個人都有自己的編程習(xí)慣,許多習(xí)慣的集合就是編程風(fēng)格。我習(xí)慣分3個層次:類名單詞首字母都大寫,方法名除第一個單詞以外都大寫首字母,實(shí)例化對象和變量(屬性)皆小寫,多個單詞通過下劃線連接。常用Ctrl+K,Ctrl+S來合并大段代碼,常用Ctrl+K,Ctrl+F來格式化代碼,常用////來添加方法的說明。舉例:publicclassPerson{publicstringgod_name;//FieldpublicPerson()//Constructor{name="unknown";}publicvoidsetName(stringnew_name)//Method{name=new_name;}}用VS2005打開VS2008的方法先用記事本打開.sln文件,你將看到:MicrosoftVisualStudioSolutionFile,FormatVersion10.00#VisualStudio2008你把它改成:MicrosoftVisualStudioSolutionFile,FormatVersion9.00#VisualStudio2005即可用2005來打開,若還不行則把.vcproj這樣的文件打開,把Version="9.00改為Version="8.00斷點(diǎn)被跳過說明代碼編碼出現(xiàn)問題,可以用記事本打開該cpp文件,然后另存為unicode編碼方式,用另存為的cpp文件覆蓋原cpp文件就ok了??旖萱I(所有快捷鍵都按常理出牌)Ctrl+shift+ins可以在過去剪切或復(fù)制到剪貼板上的20條內(nèi)容間進(jìn)行循環(huán)粘貼。Ctrl+enter在上方插入一行,ctrl+shift+enter在下方插入一行。雙擊可以選中單詞。Ctrl+L剪切當(dāng)前行,Ctrl+shift+L刪除當(dāng)前行。Alt+shift+T交換當(dāng)前行與它下面的行。Ctrl+U小寫化,ctrl+shift+U大寫化。Ctrl+shift+PgDn可以選擇當(dāng)前光標(biāo)位置以下至編輯器視圖頂部之間的所有文本。Ctrl+-向后導(dǎo)航,Ctrl+shift+-向前導(dǎo)航先Ctrl+D定位到查找欄,再輸入一個數(shù)字,再按Ctrl+G就可跳轉(zhuǎn)至該行。同時按住Alt和鼠標(biāo)可以實(shí)現(xiàn)塊選。插入跟蹤點(diǎn),可以實(shí)現(xiàn)對指定斷點(diǎn)處某個變量的值進(jìn)行完整跟蹤。在編輯的中輸入代碼片段,比如"for",通過按"tab"兩次插入代碼塊,此時你可以把第一個"i"改成"j",然后按Tab鍵,則所有的i變量都變成了"j"。Ctrl+]可以跳到相應(yīng)的另一個匹配標(biāo)記處,比如{}互相跳轉(zhuǎn)。Ctrl+C復(fù)制當(dāng)前行,Ctrl+X剪切當(dāng)前行F9在當(dāng)前行插入斷點(diǎn),Ctrl+F9禁用或啟用斷點(diǎn),右擊紅色斷點(diǎn)可以設(shè)置斷點(diǎn)的條件,程序運(yùn)行到斷點(diǎn)時可以修改斷點(diǎn)處變量的值。Ctrl+Alt+F7重新生成解決方案,F(xiàn)5啟動調(diào)試,F(xiàn)12轉(zhuǎn)到定義Ctrl+K、Ctrl+F可以設(shè)置選定內(nèi)容或當(dāng)前行的格式,而Ctrl+K、Ctrl+D可以設(shè)置整個文檔的格式。Ctrl+K、Ctrl+S可以將選中代碼用#region套起來,方便折疊Ctrl+M、Ctrl+O折疊到定義,使代碼最容易閱讀Ctrl+K、Ctrl+K設(shè)置書簽,Ctrl+K、Ctrl+N轉(zhuǎn)到下一個書簽,Ctrl+K、Ctrl+P轉(zhuǎn)到上一個書簽(書簽用于標(biāo)記位置),可以為快速查找的所有對象創(chuàng)建書簽。視圖-書簽窗口。Ctrl+I漸進(jìn)式搜索,Ctrl+Shift+I漸進(jìn)式反向搜索,真的好強(qiáng)大呀!右擊"工程"中打開菜單可以打開文件所在文件夾。Ctrl+Tab打開IDE導(dǎo)航器,快速查看并瀏覽所有打開的文件和工具窗口。刪除空行使用正則表達(dá)式,有以下2種方法:把\n*\n替換為\n把^:b*$\n替換為空VB常見問題解決:安裝VB6.0中文企業(yè)版后,保存中文工程時出現(xiàn)中文亂碼請安裝補(bǔ)丁程序。讓開發(fā)環(huán)境支持鼠標(biāo)滾輪下載一個動態(tài)庫VisualBasic6mousewheel.exe,我的軟件庫里有。為何彈出”addthisprojecttosourcesafe?”當(dāng)你安裝過VisualSourceSafe,保存文件時就會自動彈出此框,主要是為了和其他人組成一個開發(fā)組開發(fā)軟件,對個人用戶的用處只在于保存所有修改過的版本。VB程序調(diào)用類文件方法先運(yùn)行類文件所在的vbp文件,點(diǎn)擊文件——生成*.dll,覆蓋原dll文件。然后在主程序vbp中工程引用中添加該dll文件。語句End不是函數(shù),是一條語句??梢詥问褂?結(jié)束整個應(yīng)用程序)也可以和別的關(guān)鍵字配合使用,用來結(jié)束某個特定的過程.主要有以下幾種用法:End停止執(zhí)行。不是必要的,可以放在過程中的任何位置關(guān)閉代碼執(zhí)行、關(guān)閉以O(shè)pen語句打開的文件并清除變量。EndFunction必要的,用于結(jié)束一個Function語句。EndIf必要的,用于結(jié)束一個If…Then…Else語句塊。EndProperty必要的,用于結(jié)束一個PropertyLet、PropertyGet、或PropertySet過程。EndSelect必要的,用于結(jié)束一個SelectCase語句。EndSub必要的,用于結(jié)束一個Sub語句。EndType必要的,用于結(jié)束一個用戶定義類型的定義(Type語句)。EndWith必要的,用于結(jié)束一個With語句。VB中1/2=0.5而VC中1/2=0。在默認(rèn)情況下,VB是按ByRef傳遞參數(shù)的,在一般情況下ByVal方式要比ByRef傳遞參數(shù)快,但當(dāng)你要傳遞比較大的字符串或數(shù)組時,ByRef方式就要比ByVal方式快,因?yàn)锽yRef僅僅需要傳遞指向數(shù)據(jù)的四字節(jié)指針,而不是實(shí)際的數(shù)據(jù).所以,在進(jìn)行應(yīng)用的時候,可以考慮實(shí)際情況進(jìn)行處理,以便達(dá)到最佳的運(yùn)行速度.長整型變量(Long)是VB中最快的變量類型.在做運(yùn)算的時候,如果不是必須要保留小數(shù),盡量避免使用浮點(diǎn)運(yùn)算,因?yàn)檎麛?shù)運(yùn)算不需要使用數(shù)字協(xié)處理器.盡量避免使用對象的屬性代替常量進(jìn)行運(yùn)算,針對于任何對象屬性的訪問都會影響運(yùn)算的速度.盡量使用動態(tài)數(shù)組,而避免使用靜態(tài)數(shù)組,因?yàn)橥ㄟ^Erase方法可以清空動態(tài)數(shù)組中不需要的元素并釋放出占用的內(nèi)存,而對于靜態(tài)數(shù)組,只能將數(shù)組中元素的內(nèi)容清空,并不會釋放數(shù)組元素所使用的內(nèi)存符號!單精度Single#雙精度Double&長整型Long%整型IntegerVB中定義數(shù)組會自動初始化,而VC中不會。VC++與C#大體相同,比如函數(shù)重載基礎(chǔ)const關(guān)鍵字常量不允許更改值constinta=1;constintb=2;指向常量的指針不能改變常量值constint*c=a;c=&b;(*c++;是錯誤的)常量指針不能改變指向int*constd=a;對比:指向常量的指針可以改地址值而不可改對象值,常量指針可以改對象值而不可改地址值,指向常量的常量指針二者皆不可改。對于任何一個類,如果期望它被廣泛使用,就應(yīng)該把那些不修改類數(shù)據(jù)成員的成員函數(shù)聲明為const成員函數(shù)。如:char*get_data()const{returndata;}不可將會改變數(shù)據(jù)成員的函數(shù)定義為常量成員函數(shù),如voidwrite(charvalue)const{cursor++;}是錯誤的。如果一個類成員函數(shù)不會修改類成員變量的值,則聲明定義時最后在其后加上const限定符。引用引用主要被用作函數(shù)的形式參數(shù)。字符(串)頭文件:<string.h>是C標(biāo)準(zhǔn)庫中的字符串處理函數(shù)的頭文件如strcmpstrcat等等函數(shù);<cstring>是與C標(biāo)準(zhǔn)庫的<string.h>相對應(yīng)的,但被加入到std名字空間的版本,是C++的組成部分,它可以說是把C的string.h的升級版,但它不是C的組成部分。所以如果你用的是C++,那么請用cstring,如果你用的是C請用string.h。string.h和C++中的string類是有很大區(qū)別的,<string>并非<string.h>的“升級版本”,他們是毫無關(guān)系的兩個頭文件。string是C++定義的std::string所使用的文件,是string類的頭文件,屬于STL范疇。它有很多對字符串操作的方法。一般一個C++庫老的版本帶“.h”擴(kuò)展名的庫文件,比如iostream.h,在新標(biāo)準(zhǔn)后的標(biāo)準(zhǔn)庫中都有一個不帶“.h”擴(kuò)展名的相對應(yīng),區(qū)別除了后者有好多改進(jìn)之外,還有一點(diǎn)就是后者的東東都塞進(jìn)了“std”名字空間中。最后總結(jié)為:<string.h>是標(biāo)準(zhǔn)C頭文件,對應(yīng)的是基于char*的字符串處理函數(shù),這類頭文件的內(nèi)容因?yàn)榕f,不在名字空間std中;<cstring>是C++頭文件,標(biāo)準(zhǔn)C頭文件的升級版,這類頭文件的內(nèi)容在名字空間std中;<string>是C++string類的頭文件,有很多對字符串操作的方法,這類頭文件的內(nèi)容在名字空間std中。在沒有#include<string>此頭文件時,無法輸出使用string標(biāo)志符定義的字符串,注意string類型變量的定義,比如strings1("test");即定義了一個字符串s1,它的值為test。等價于chars2[5]=”test”;可以首地址賦值s1=s2,但不可以s2=s1.2、strcpy:VC從2005版本開始,微軟引入了一系列的安全加強(qiáng)的函數(shù)來增強(qiáng)CRT(C運(yùn)行時),這里對應(yīng)的是strcpy_s。_s意為safe的意思,同樣的道理,strcat也是同樣。因此要解決這個問題,我們可以用strcpy_s來替換strcpy,但是注意strcpy_s并非所有編譯器都提供,因此如果要跨編譯器,請采用錯誤信息中所提示的方式,定義_CRT_SECURE_NO_WARNINGS宏來掩耳盜鈴吧。3、TCHAR、wchar_t、char:這個問題太普遍了,幾乎所有的初學(xué)者都會遇到而且感到難以應(yīng)付,因?yàn)榘凑仗崾臼褂?LPCWSTR)強(qiáng)制轉(zhuǎn)型貌似并不能幫助我們解決問題,而且這個程序在VC6下面應(yīng)該是沒有任何問題的,問題的根本就是字符集問題,在VC6中,我們默認(rèn)使用的是多字節(jié)字符集,而現(xiàn)在我們默認(rèn)需要的是UNICODE字符集,簡單的,我們把這個字符集改成多字節(jié)字符集這個問題就解決了。右鍵單擊解決方案瀏覽器下面的項(xiàng)目,屬性。但是我并不推薦大家這么做,因?yàn)樽屪约旱某绦蜻m應(yīng)各種字符集是我們寫代碼的人義不容辭的義務(wù)。我們把程序改成下面這樣:#include<iostream>#include<Windows.h>#include<tchar.h>usingnamespacestd;intmain(){MessageBox(NULL,TEXT("你好HelloWorld!"),TEXT("Information"),0);MessageBox(NULL,_T("你好HelloWorld!"),_T("Information"),0);return0;}用兩個宏TEXT或者_(dá)T都可以解決這個問題,它們兩個并沒有太大區(qū)別,也許區(qū)別在于前者是通過windows.h頭文件引入的,而_T是通過tchar.h引入的,我推薦大家使用_T和tchar.h,因?yàn)閠char.h還幫助我們引入了其它一些很有用的宏,比如_tcscpy_s,這個宏在使用UNICODE字符集的時候被替換成wcscpy_s,在使用多字節(jié)字符集的使用被替換成strcpy_s。關(guān)于這部分的內(nèi)容,請大家不要錯過《Windows核心編程》的第二章(第四版或第五版都可以),以及《深入學(xué)習(xí)C++String2.1版》。它們都有提到。LPCSTR,Pointertoaconstantnull-terminatedstringof8-bitWindows(ANSI)characters.LPCTSTR,AnLPCWSTRifUNICODEisdefined,anLPCSTRotherwise._T,用于VC++.NET中定義通用字符串。有三個函數(shù)可以將字符串的內(nèi)容轉(zhuǎn)換為字符數(shù)組和Cstring1.data(),返回沒有“\0”的字符串?dāng)?shù)組2,c_str(),返回有“\0”的字符串?dāng)?shù)組3,copy()string是c++標(biāo)準(zhǔn)庫里面其中一個,封裝了對字符串的操作把string轉(zhuǎn)換為char*有3中方法:1.data如:stringstr="abc";char*p=str.data();2.c_str如:stringstr="gdfd";char*p=str.c_str();3.copy比如stringstr="hello";charp[40];str.copy(p,5,0);//這里5,代表復(fù)制幾個字符,0代表復(fù)制的位置*(p+5)='\0';//要手動加上結(jié)束符cout<<p;示例程序:#include<iostream>#include<string>usingnamespacestd;intmain(){stringline;getline(cin,line);charstr[20];intsize=line.size();line.copy(str,line.size(),0);//charstr[20]="liuyanbo";charupper[20];for(inti=0;i<size;++i){//cout<<static_cast<char>(toupper(str[i]));upper[i]=static_cast<char>(toupper(str[i]));}upper[i]='\0';cout<<upper<<endl;return0;}CStringCString是一種很有用的數(shù)據(jù)類型。它們很大程度上簡化了MFC中的許多操作,使得MFC在做字符串操作的時候方便了很多。CString位于頭文件afx.h中。如果普通Window程序想用CString,需要設(shè)置工程屬性/配置屬性/常規(guī)/MFC/使用動態(tài)DLL。CString作用如下:對象連接多個CString對象的連接可以通過重載運(yùn)算符+、+=實(shí)現(xiàn)。例如:CStringstr(_T("jizhuomi"));//str內(nèi)容為"jizhuomi"str=_T("www")+str+_T("-");//str為"wwwjizhuomi-"str+=_T("com");//str為wwwjizhuomi-comCStringgray("Gray");CStringcat("Cat");CStringgraycat=gray+cat;//thengraycat="GrayCat"要比用下面的方法好得多:chargray[]="Gray";charcat[]="Cat";char*graycat=malloc(strlen(gray)+strlen(cat)+1);strcpy(graycat,gray);strcat(graycat,cat);2、格式化字符串與其用sprintf()函數(shù)或wsprintf()函數(shù)來格式化一個字符串,還不如用CString對象的Format()方法:CStrings;s.Format(_T("Thetotalis%d"),total);用這種方法的好處是你不用擔(dān)心用來存放格式化后數(shù)據(jù)的緩沖區(qū)是否足夠大,這些工作由CString類替你完成。3、CString類的構(gòu)造函數(shù)CString類有很多構(gòu)造函數(shù),這里只介紹幾個比較常用的:CString(constCString&stringSrc);將一個已經(jīng)存在的CString對象stringSrc的內(nèi)容拷貝到該CString對象。例如:CStringstr1(_T(jizhuomi));//將常量字符串拷貝到str1CStringstr2(str1);//將str1的內(nèi)容拷貝到str2CString(LPCTSTRlpch,intnLength);將字符串lpch中的前nLength個字符拷貝到該CString對象。例如:CStringstr(_T("wwwjizhuomi"),3);//構(gòu)造的字符串對象內(nèi)容為"www"CString(TCHARch,intnLength=1);使用此函數(shù)構(gòu)造的CString對象中將含有nLength個重復(fù)的ch字符。例如:CStringstr(_T('w'),3);//str為"www"4、CString類的大小寫轉(zhuǎn)換及順序轉(zhuǎn)換函數(shù)CString&MakeLower();將字符串中的所有大寫字符轉(zhuǎn)換為小寫字符。CString&MakeUpper();將字符串中的所有小寫字符轉(zhuǎn)換為大寫字符。CString&MakeReverse();將字符串中所有字符的順序顛倒。例如:CStringstr(_T("JiZhuoMi"));str.MakeLower();//str為"jizhuomi"str.MakeUpper();//str為"JIZHUOMI"str.MakeReverse();//str為"IMOUHZIJ"6、CString對象的比較CString對象的比較可以通過==、!=、<;、>;、<=、>=等重載運(yùn)算符實(shí)現(xiàn),也可以使用Compare和CompareNoCase成員函數(shù)實(shí)現(xiàn)。intCompare(PCXSTRpsz)const;將該CString對象與psz字符串比較,如果相等則返回0,如果小于psz則返回值小于0,如果大于psz則返回值大于0。intCompareNoCase(PCXSTRpsz)constthrow();此函數(shù)與Compare功能類似,只是不區(qū)分大小寫。例如:CStringstr1=_T("JiZhuoMi");CStringstr2=_T("jizhuomi");if(str1==str2){//因?yàn)閟tr1、str2不相等,所以不執(zhí)行下面的代碼...}if(0==str1.CompareNoCase(str2)){//因?yàn)椴粎^(qū)分大小寫比較時,CompareNoCase函數(shù)返回0,所以執(zhí)行下面的代碼...}7、CString對象字符串的提取操作CStringLeft(intnCount)const;提取該字符串左邊nCount個字符的子字符串,并返回一個包含這個子字符串的拷貝的CString對象。CStringRight(intnCount)const;提取該字符串右邊nCount個字符的子字符串,并返回一個包含這個子字符串的拷貝的CString對象。CStringMid(intiFirst,intnCount)const;提取該字符串中以索引iFirst位置開始的nCount個字符組成的子字符串,并返回一個包含這個子字符串的拷貝的CString對象。CStringMid(intiFirst)const;提取該字符串中以索引iFirst位置開始直至字符串結(jié)尾的子字符串,并返回一個包含這個子字符串的拷貝的CString對象。例如:CStringstr1=_T("jizhuomi");CStringstr2=str1.Left⑶;//str2為"jiz"str2=str1.Right⑵;//str2為"mi"str2=str1.Mid(1,3);//str2為"izh"str2=str1.Mid⑸;//str2為"omi"8、CString對象字符串的查找操作intFind(PCXSTRpszSub,intiStart=0)constthrow();intFind(XCHARch,intiStart=0)constthrow();在CString對象字符串的iStart索引位置開始,查找子字符串pszSub或字符ch第一次出現(xiàn)的位置,如果沒有找到則返回-1。intFindOneOf(PCXSTRpszCharSet)constthrow();查找pszCharSet字符串中的任意字符,返回第一次出現(xiàn)的位置,找不到則返回-1。intReverseFind(XCHARch)constthrow();從字符串末尾開始查找指定的字符ch,返回其位置,找不到則返回-1。這里要注意,盡管是從后向前查找,但是位置的索引還是要從開始算起。CStringstr=_T("jizhuomi");intnIndex1=str.Find(_T("zh"));//nIndex1的值為2intnIndex2=str.FindOneOf(_T("mui"));//nIndex2的值為1intnIndex3=str.ReverseFind(_T('i'));//nIndex3的值為79、CString類對象字符串的替換與刪除intReplace(PCXSTRpszOld,PCXSTRpszNew);用字符串pszNew替換CString對象中的子字符串pszOld,返回替換的字符個數(shù)。intReplace(XCHARchOld,XCHARchNew);用字符chNew替換CString對象中的字符chOld,返回替換的字符個數(shù)。intDelete(intiIndex,intnCount=1);從字符串中刪除iIndex位置開始的nCount個字符,返回刪除操作后的字符串的長度。intRemove(XCHARchRemove);刪除字符串中的所有由chRemove指定的字符,返回刪除的字符個數(shù)。例如:CStringstr=_T("jizhuomi");intn1=str.Replace(_T('i'),_T('j'));//str為"jjzhuomj",n1為2intn2=str.Delete(1,2);//str為"jhuomj",n2為6intn3=str.Remove(_T('j'));//str為"ihuomi",n3為110、CString類的格式化字符串方法使用CString類的Format成員函數(shù)可以將int、short、long、float、double等數(shù)據(jù)類型格式化為字符串對象。void__cdeclFormat(PCXSTRpszFormat,[,argument]...);參數(shù)pszFormat為格式控制字符串;參數(shù)argument可選,為要格式化的數(shù)據(jù),一般每個argument在pszFormat中都有對應(yīng)的表示其類型的子字符串,int型的argument對應(yīng)的應(yīng)該是"%d",float型的應(yīng)對應(yīng)"%f",等等。例如:CStringstr;inta=1;floatb=2.3f;str.Format(_T("a=%d,b=%f"),a,b);//str為"a=1,b=2.300000"[1]11、類型轉(zhuǎn)換把CString類型的數(shù)據(jù)轉(zhuǎn)化成整數(shù)類型最簡單的方法就是使用標(biāo)準(zhǔn)的字符串到整數(shù)轉(zhuǎn)換例程。雖然通常你懷疑使用_atoi()函數(shù)是一個好的選擇,它也很少會是一個正確的選擇。如果你準(zhǔn)備使用Unicode字符,你應(yīng)該用_ttoi(),它在ANSI編碼系統(tǒng)中被編譯成_atoi(),而在Unicode編碼系統(tǒng)中編譯成_wtoi()。你也可以考慮使用_tcstoul()或者_(dá)tcstol(),它們都能把字符串轉(zhuǎn)化成任意進(jìn)制的長整數(shù)(如二進(jìn)制、八進(jìn)制、十進(jìn)制或十六進(jìn)制),不同點(diǎn)在于前者轉(zhuǎn)化后的數(shù)據(jù)是無符號的(unsigned),而后者相反??聪旅娴睦樱篊Stringhex=_T("FAB");CStringdecimal=_T("4011");ASSERT(_tcstoul(hex,0,16)==_ttoi(decimal));char*轉(zhuǎn)換這是初學(xué)者使用CString時最常見的問題。有了C++的幫助,很多問題你不需要深入的去考慮它,直接拿來用就行了,但是如果你不能深入了解它的運(yùn)行機(jī)制,又會有很多問題讓你迷惑,特別是有些看起來沒有問題的代碼,卻偏偏不能正常工作。比如,你會奇怪為什么不能寫像下面這樣的代碼呢:CStringgraycat="Gray"+"Cat";或者這樣:CStringgraycat("Gray"+"Cat");事實(shí)上,編譯器將抱怨上面的這些嘗試。為什么呢?因?yàn)獒槍String和LPCTSTR數(shù)據(jù)類型的各種各樣的組合,"+"運(yùn)算符被定義成一個重載操作符。而不是兩個LPCTSTR數(shù)據(jù)類型,它是底層數(shù)據(jù)類型。你不能對基本數(shù)據(jù)(如int、char或者char*)類型重載C++的運(yùn)算符。你可以象下面這樣做:CStringgraycat=CString("Gray")+CString("Cat");或者這樣:CStringgraycat=CString("Gray")+"Cat";研究一番就會發(fā)現(xiàn):"+"總是使用在至少有一個CString對象和一個LPCSTR的場合。注意,編寫有Unicode意識的代碼總是一件好事,比如:CStringgraycat=CString(_T("Gray"))+_T("Cat");這將使得你的代碼可以直接移植。char*轉(zhuǎn)化為CString你有一個char*類型的數(shù)據(jù),或者說一個字符串。怎么樣創(chuàng)建CString對象呢?這里有一些例子:char*p="Thisisatest";或者象下面這樣更具有Unicode意識:TCHAR*p=_T("Thisisatest")或LPTSTRp=_T("Thisisatest");你可以使用下面任意一種寫法:CStrings="Thisisatest";//8-bitonlyCStrings=_T("Thisisatest");//Unicode-awareCStrings("Thisisatest");//8-bitonlyCStrings(_T("Thisisatest"));//Unicode-awareCStrings=p;CStrings(p);用這些方法可以輕松將常量字符串或指針轉(zhuǎn)換成CString。需要注意的是,字符的賦值總是被拷貝到CString對象中去的,所以你可以象下面這樣操作:TCHAR*p=_T("Gray");CStrings(p);p=_T("Cat");s+=p;結(jié)果字符串肯定是"GrayCat"。格式化是一種把其它不是字符串類型的數(shù)據(jù)轉(zhuǎn)化為CString類型的最常用技巧,比如,把一個整數(shù)轉(zhuǎn)化成CString類型,可用如下方法:CStrings;s.Format(_T("%d"),total);CString和string的輸出string是控制臺程序所用,利用cout直接輸出,CString是MFC程序所用,利用ofstream定義的fout直接輸出。//ceshi.cpp:定義控制臺應(yīng)用程序的入口點(diǎn)。//此程序用于異于char、string、CString的輸出異同#include"stdafx.h"#include<string>#include<iostream>#include<afx.h>#include<fstream>usingnamespacestd;int_tmain(intargc,_TCHAR*argv[]){ stringa("one");//定義字符串a(chǎn),取值為one charb[6]="two"; //CStringsTest(a.c_str());//利用a賦值給sTest,等價于CStringsTest(_T("one")); CStringsTest(b);//利用b賦值給sTest,等價于CStringsTest(_T("two")); cout<<"a="<<a<<endl; cout<<"b="<<b<<endl; a=b; //將b字符數(shù)組賦給a字符串,不可串賦給數(shù)組。 cout<<"a=b="<<a<<endl; ofstreamOutToFile("c:\\test.txt"); wchar_t*chTest=newwchar_t[sTest.GetLength()+1];//動態(tài)申請空間,由于GetBuffer返回為wchar_t chTest=sTest.GetBuffer(0);//獲取CString內(nèi)容的地址,wchar_t為寬char型。 for(inti=0;i<sTest.GetLength();i++) { OutToFile<<(char)*(chTest+i); } sTest.ReleaseBuffer();//調(diào)用了GetBuffer后一定要調(diào)用ReleaseBuffer釋放,否則會出現(xiàn)內(nèi)存泄露 OutToFile.close(); cout<<"sTest的內(nèi)容已輸出至文件!"<<endl; cin>>a; return0;}CString,int,string,char*之間的轉(zhuǎn)換1、轉(zhuǎn)成CStringstring轉(zhuǎn)CString——CString.format("%s",string.c_str());char*轉(zhuǎn)CString——CString.format("%s",char*);int轉(zhuǎn)CString——CString.format("%d",int);常見錯誤:strValue.Format(_T("%d"),pSlider->GetPos());可以用_T解決兼容。2、轉(zhuǎn)成stringCString轉(zhuǎn)string——strings(CString.GetBuffer());//GetBuffer()后一定要ReleaseBuffer(),否則就沒有釋放緩沖區(qū)所占的空間.char轉(zhuǎn)string——strings(char*);int轉(zhuǎn)成string——除了用CString::Format,還有FormatV、sprintf和不需要借助于Afx的itoa3、轉(zhuǎn)成char*string轉(zhuǎn)char*——char*p=string.c_str();CString轉(zhuǎn)char*——char*p=CString.GetBuffer(CString.GetLength()));或(LPCSTR)CStringstring.c_str()只能轉(zhuǎn)換成constchar*,要轉(zhuǎn)成char*這樣寫:stringmngName;chart[200];memset(t,0,200);strcpy(t,mngName.c_str());轉(zhuǎn)成intCString轉(zhuǎn)int——intint_change=atoi((LPCSTR)CString);string轉(zhuǎn)int——atoi、_atoi_l、_wtoi_ltypedef有四個用途:1、定義一種類型的別名,而不只是簡單的宏替換。用在舊的C的代碼中(具體多舊沒有查),幫助struct。以前的代碼中,聲明struct新對象時,必須要帶上struct,即形式為:struct結(jié)構(gòu)名對象名,如:structtagPOINT1{intx;inty;};structtagPOINT1p1;而在C++中,則可以直接寫:結(jié)構(gòu)名對象名,即:tagPOINT1p1;估計(jì)某人覺得經(jīng)常多寫一個struct太麻煩了,于是就發(fā)明了:typedefstructtagPOINT{intx;inty;}POINT;POINTp1;//這樣就比原來的方式少寫了一個struct,比較省事,尤其在大量使用的時候;2、用typedef來定義與平臺無關(guān)的類型。當(dāng)跨平臺時,只要改下typedef本身就行,不用對其他源碼做任何修改。標(biāo)準(zhǔn)庫就廣泛使用了這個技巧,比如size_t。另外,因?yàn)閠ypedef是定義了一種類型的新別名,不是簡單的字符串替換,所以它比宏來得穩(wěn)健(雖然用宏有時也可以完成以上的用途)。易錯點(diǎn):1、typedef在語法上是一個存儲類的關(guān)鍵字(如auto、extern、mutable、static、register等一樣),雖然它并不真正影響對象的存儲特性,如:typedefstaticintINT2;//不可行編譯將失敗,會提示“指定了一個以上的存儲類”。2、typedefchar*pStr;charstring[4]="abc";constchar*p1=string;constpStrp2=string;p1++;p2++;以上代碼中p2++出錯了。這個問題再一次提醒我們:typedef和#define不同,它不是簡單的文本替換。上述代碼中constpStrp2并不等于constchar*p2。constpStrp2和constlongx本質(zhì)上沒有區(qū)別,都是對變量進(jìn)行只讀限制,只不過此處變量p2的數(shù)據(jù)類型是我們自己定義的而不是系統(tǒng)固有類型而已。因此,constpStrp2的含義是:限定數(shù)據(jù)類型為char*的變量p2為只讀,因此p2++錯誤。數(shù)據(jù)結(jié)構(gòu)指針if(ptr!=NULL) //用于判斷指針有無值*ptr++;數(shù)組intnum[5];定義了一個數(shù)組,ptr=num;注意,num是數(shù)組名,存儲的是數(shù)組的首地址,但它不是指針,不能num++之類的修改num存儲的地址。指針強(qiáng)于數(shù)組名,因此ptr[3]等同于num[3]。&、*、[]是常見的運(yùn)算符,都可以重載。num[3]等同于*(num+3)。動態(tài)數(shù)組利用new操作符可以操作堆(heap),生成動態(tài)數(shù)組。如cin>>num;int*ptr=newint[num];就定義了一個長度為num的整形動態(tài)數(shù)組。動態(tài)數(shù)組需要手動銷毀,否則會發(fā)生內(nèi)存泄漏(在停止或重新啟動程序后這塊內(nèi)存才可再度被利用),為防止內(nèi)存泄漏,可以利用delete[]ptr;(可將ptr數(shù)組全部銷毀,若只是deleteptr;則只釋放數(shù)組首元素)。在對指針使用delete后,指針可以賦值后繼續(xù)使用。例如ptr=newint;*ptr=5;ptr=newint;執(zhí)行之后第一次聲明的動態(tài)變量所占的內(nèi)存就無法訪問、無法重用了。if(checks[capacity]!=0){Check*tempPtr=newCheck[capacity*2];for(inti=0;i<capacity;i++)tempPtr[i]=checks[i];delete[]checks;checks=tempPtr;capacity*=2;}以上代碼實(shí)現(xiàn)了當(dāng)動態(tài)數(shù)組用滿時,將其大小加倍。棧stack棧就是一堆元素,last-infirst-out數(shù)據(jù)結(jié)構(gòu),每個元素都屬于相同的類型,任何類型的元素都可用于棧(如字符串棧、浮點(diǎn)型棧、對象棧)。push、pop操作,peek函數(shù)獲取某元素,使用前就先確認(rèn)此棧不空。棧是最簡單的數(shù)據(jù)結(jié)構(gòu),因此當(dāng)擁有一個有關(guān)對象的棧時,不需要為這些對象重載運(yùn)算符函數(shù)。棧的類模板在stack.h文件中。鏈表鏈表是一個項(xiàng)集合,其中的每個項(xiàng)是某節(jié)點(diǎn)的一部分,這個節(jié)點(diǎn)又包含到達(dá)其他節(jié)點(diǎn)的鏈接。在每一種情況下,從第一個節(jié)點(diǎn)開始跟蹤,直到最后一個節(jié)點(diǎn),定義了一個項(xiàng)的順序排列。數(shù)組也定義了一組順序排列的項(xiàng),不過,在數(shù)組中,順序組織由數(shù)組中的位置隱式提供。數(shù)組還支持通過索引隨機(jī)訪問,而鏈表不支持。鏈表節(jié)點(diǎn)及鏈接:typedefstructnode*link;structnode{Itemitem;linknext;};只要想使用一個新節(jié)點(diǎn),就要創(chuàng)建一個node結(jié)構(gòu)的實(shí)例,并為它保留內(nèi)存,用linkx=malloc(sizeof*x);來引導(dǎo)stdlib.h中的malloc函數(shù)和sizeof運(yùn)算符來節(jié)點(diǎn)保留足夠的內(nèi)存,并在x中返回一個指向它的指針。鏈接x用法:(*x).item和(*x).next,等同于x->item和x->next.鏈接與C指針之間的這種對應(yīng)關(guān)系是必需的,但前者是一種抽象,后者是一種具體的表現(xiàn)形式。我們也可以用數(shù)組索引表達(dá)鏈接。刪除節(jié)點(diǎn)x的下一個節(jié)點(diǎn)t,語句:t=x->next;x->next=t->next;free(t);或者更簡單形式:x->next=x->next->next;在表中節(jié)點(diǎn)x之后位置插入節(jié)點(diǎn)t,語句:t->next=x->next;x->next=t;語句很容易理解(畫圖),插入和刪除的簡單性正是鏈表存在的理由。數(shù)組與鏈表恰好優(yōu)勢互補(bǔ),鏈表不太適合于查找一個已知索引的項(xiàng)或者查找已知項(xiàng)之前的項(xiàng)。函數(shù)聲明若定義在執(zhí)行之后,則必須先聲明。比如intThreeAdd(int,int,int);即為申明默認(rèn)值函數(shù)使用默認(rèn)值時intThreeAdd(int,int,int=2);即為第3個參數(shù)提供了默認(rèn)值。游長變元表voidConnectData(inti,...)函數(shù)第一個參數(shù)為整型,其后使用3個句號定義可變參數(shù),利用VS內(nèi)部定義的va_arg獲取多余的輸入形參。函數(shù)模板template<classT>TAdd(Tone,Ttwo){returnone+two;}intmain(intargc,char*argv[]){doublei;i=Add(10.52,20.24);intm;m=Add(20,30);printf(“%f”,i);printf(“%d”,m);return0;}主函數(shù)win32的控制臺程序,主函數(shù)不是intmain(),而是int_tmain(),頭文件也不是<iostream.h>而是<stdafx.h>,"_t"是為了支持Unicode而準(zhǔn)備的一個宏,_tmain是main為了支持unicode所使用的main的別名。而<stdafx.h>是用來預(yù)編譯用的頭文件,旨在減小文件的大小和減少編譯的時間,這個<stdafx.h>中包括了<iostream.h>和<tchar.h>。_tmain的定義在<tchar.h>可以找到,如#define_tmainmain,則要加#include<tchar.h>才能用。因此_tmaincompile后仍為main,所以都可以執(zhí)行。main是C/C++的標(biāo)準(zhǔn)入口函數(shù)名WinMain是windowsAPI窗體程序的入口函數(shù)。(intWINAPIWinMain())中WINAPI是__stdcall宏,在windef.h中定義的。_tmain_tWinMain是Unicode版本函數(shù)別名,對應(yīng)與wmain和wWinMain。C語言的WindowsAPI編程,并不一定需要使用WinMain入口函數(shù)。如果不使用WinMain的四個參數(shù),那么直接使用main代替WinMain就完全可以了。如果程序中使用了WinManin的某個參數(shù),那么也可以用main替代,但是需要增加WinMain的四個參數(shù)作為變量。WinMain只要能使用windowsAPI的軟件都支持,但用main就未必了。常用函數(shù)Sleep函數(shù)在C++語言中是非常重要并且非常常用的一個函數(shù),它的作用為當(dāng)程序執(zhí)行到這個函數(shù)時,將暫停,然后到達(dá)條件后才繼續(xù)執(zhí)行,此處的條件為暫停的時間,即實(shí)參部分,單位是毫秒。(注:1秒=1000毫秒)。比如你的實(shí)參部分為100,即Sleep(1000);那么,當(dāng)程序執(zhí)行到這里是,將暫停1000毫秒,即一秒,然后才繼續(xù)執(zhí)行。#include<windows.h>//頭文件類結(jié)構(gòu)struct類似class而又比class簡單,結(jié)構(gòu)的對象可以賦值給同一結(jié)構(gòu)的另一個對象,可以用結(jié)構(gòu)傳遞參數(shù)。class比struct多了函數(shù)成員和封裝性(即不可訪問對象的數(shù)據(jù)成員),由class生成的每個對象都被認(rèn)為與程序的其他部分是分離的。struct的定義比class多一個大括號后類定義構(gòu)造函數(shù)等函數(shù)同C#,可以不定義使用默認(rèn)的,但定義方式不同,方法可定義在類內(nèi)部,也可定義在其后。一個類如果含有純虛函數(shù),則該類被稱為抽象類,但不需要abstract修飾類名。純虛函數(shù)定義:virtualvoidDrawShape()=0;其中等于0就表明它是一個純虛函數(shù)。開發(fā)程序時,可以將某些類的共有的數(shù)據(jù)和方法封裝成一個抽象類。在抽象類中聲明公共的方法(純虛方法),每一個從抽象類中派生的子類實(shí)現(xiàn)這些公共方法。這樣,定義一個抽象類指針,將其指向不同的子類,在調(diào)用抽象類中的純虛方法時,同樣的語句可能實(shí)現(xiàn)不同的功能。主程序只跟對象的函數(shù)成員通信,由對象的函數(shù)成員與對象的數(shù)據(jù)成員通信。即對象的公用部分(函數(shù)成員)充當(dāng)程序和對象的數(shù)據(jù)之間的接口,故稱公用部分為類接口。使用公共接口比直接調(diào)用數(shù)據(jù)更慢一點(diǎn),但卻更安全、易修改的多。數(shù)據(jù)結(jié)構(gòu)有時候可以加速數(shù)據(jù)的處理,但函數(shù)調(diào)用對速度的影響不值得考慮。類的每個函數(shù)都知道類定義中的數(shù)據(jù)成員,每定義1個類就編寫一個對之測試的程序,確保類完全無誤。類的定義文件.cpp文件和實(shí)現(xiàn)文件.cpp文件,還有主程序.cpp文件,所有cpp文件自動關(guān)聯(lián),所以無需#include我們類中聲明變量而不在函數(shù)中聲明變量的原因是對象總是可以記住類定義中的變量的值,即使對象的代碼已經(jīng)不再運(yùn)行。利用operate關(guān)鍵字可以重載運(yùn)算符,當(dāng)左操作數(shù)不是類的對象,但是右操作數(shù)是類的對象時,函數(shù)原型直接定義在類定義的下面,反之則定義在類定義中。除了對賦值運(yùn)算符=進(jìn)行重載外,一般不為數(shù)據(jù)結(jié)構(gòu)的類重載操作符。字符串實(shí)際上就是一個類,它有重載運(yùn)算符[]函數(shù),字符串也是一種抽象數(shù)據(jù)類型(abstractdatatype,ADT),不僅擁有數(shù)據(jù),而且擁有函數(shù)??梢哉J(rèn)為類一種抽象數(shù)據(jù)類型。C++比較特別的是支持多重繼承,這有風(fēng)險。classCDog{public: unsignedintm_Weight; unsignedintm_Age; CDog();//默認(rèn)構(gòu)造函數(shù) CDog(intweight,intage);//自定義構(gòu)造函數(shù) ~CDog();析構(gòu)函數(shù)};CDog::CDog(){ m_Age=1; m_Weight=2; printf("defaultfunctionwasinvoked\n");}CDog::CDog(intweight,intage){ m_Weight=weight; m_Age=age; printf("customfunctionwasinvoked\n");}CDog::~CDog(){}intmain(intargc,char*argv[]){ CDogmydog;//調(diào)用默認(rèn)的構(gòu)造函數(shù) CDogcustomdog(3,20);//調(diào)用自定義的構(gòu)造函數(shù) return0;}類模板CWnd、CWindow的區(qū)別CWindow是ATl中封裝的窗口類,沒有ClassWizzard支持的。CWnd是MFC的封裝有ClassWizzard支持。CWindow是在windowce平臺上使用的,CWnd是mfc中所有窗口類的基類Windows應(yīng)用程序肯有相對固定的基本結(jié)構(gòu),由入口函數(shù)WinMain、窗口(處理)函數(shù)WndPro構(gòu)成基本框架,并包含各種數(shù)據(jù)類型,數(shù)據(jù)結(jié)構(gòu)與函數(shù)等。WinMain函數(shù)有3個基本的組成部分:函數(shù)說明、初始化、和消息循環(huán)。利用GetMessage函數(shù)來從消息隊(duì)列中讀取一條消息,并將消息放在一個MSG結(jié)構(gòu)對象中。窗口函數(shù)定義了應(yīng)用程序?qū)邮盏讲煌⒌捻憫?yīng),其中包含了應(yīng)用程序?qū)Ω鞣N可能接收到的消息的處理程序,是消息處理分支控制語句的集合(switch)。MessageBox()與afxMessageBoxMessageBox()是Win32API函數(shù),afxMessageBox是MFC中的全局函數(shù).在MFC中能用MessageBox()的地方都能用AfxMessageBox().AfxMessageBox比MessageBox方便,而MessageBox比AfxMessageBox靈活(如指定對話框標(biāo)題等)!Afx開頭的都是全局函數(shù),也就是說AfxMessageBox可以用于任何程序;而MessageBox只能用在CWnd及其派生類中。MessageBox可以任意設(shè)置標(biāo)題,其參數(shù)分別為內(nèi)容、類型、幫助標(biāo)識,而AfxMessageBox不能設(shè)置標(biāo)題,其參數(shù)分別為內(nèi)容、標(biāo)題、類型,二者皆可只有第一個參數(shù)。AfxMessageBox的函數(shù)原型:intAfxMessageBox(LPCTSTRlpszText,UINTnType=MB_OK,UINTnIDHelp=0);intAFXAPIAfxMessageBox(UINTnIDPrompt,UINTnType=MB_OK,UINTnIDHelp=(UINT)–1);在第一種形式中,lpszText表示在消息框內(nèi)部顯示的文本,消息框的標(biāo)題為應(yīng)用程序的可執(zhí)行文件名(如Hello)。在第二種形式中,nIDPrompt為要顯示的文本字符串在字符串表中的ID。函數(shù)調(diào)用時會自動從字符串表中載入字符串并顯示在消息框中。nType為消息框中顯示的按鈕風(fēng)格和圖標(biāo)風(fēng)格的組合,可以采用|(或)操作符組合各種風(fēng)格。intMessageBox(LPCTSTRlpszText,LPCTSTRlpszCaption=NULL,UINTnType=MB_OK);參數(shù):lpszText:消息正文lpszCaption:消息框標(biāo)題(默認(rèn)沒有)nType:消息框的風(fēng)格舉例:AfxMessageBox("Areyousure?",MB_YESNO|MB_ICONQUESTION);inta=MessageBox("是否確認(rèn)刪除?","Warning!!",MB_YESNO|MB_ICONWARNING);if(a==IDYES)AfxMessageBox("Yes");elseAfxMessageBox("No");//MessageBox用法舉例#include<Windows.h>MessageBox(NULL,_T("Hello!"),_T("警告"),MB_ICONWARNING);文件操作#include"stdafx.h"#include<iostream>#include<fstream>#include<Windows.h>usingnamespacestd;int_tmain(intargc,_TCHAR*argv[]){ ifstreamfin("in.txt"); ofstreamfout("out.txt"); doublea[100]={0}; inti=0; while(!fin.eof()) { fin>>a[i]; fout<<a[i++]<<""; } fin.close(); fout.close(); MessageBox(NULL,_T("示例用法"),_T("demo"),MB_OK); return0;}MFCMFC介紹MicrosoftFoundationClasses,是一個微軟公司提供的類庫(classlibraries),以C++類的形式封裝了Windows的API,并且包含一個應(yīng)用程序框架,以減少應(yīng)用程序開發(fā)人員的工作量。其中包含的類包含大量Windows句柄封裝類和很多Windows的內(nèi)建控件和組件的封裝類。MFC框架定義了應(yīng)用程序的輪廓,并提供了用戶接口的標(biāo)準(zhǔn)實(shí)現(xiàn)方法,MicrosoftVisualC++提供了相應(yīng)的工具來完成這個工作:AppWizard可以用來生成初步的框架文件(代碼和資源等),資源編輯器用于幫助直觀地設(shè)計(jì)用戶接口,ClassWizard用來協(xié)助添加代碼到框架文件,最后,經(jīng)過編譯,通過類庫實(shí)現(xiàn)了應(yīng)用程序特定的邏輯。(Windows系統(tǒng)目錄下的一系列mfc*.dll文件)常用控件作為一般窗口,控件具有通用的窗口屬性。可以使用ShowWindwo、MoveWindow函數(shù)等窗口管理函數(shù)來顯示或隱藏控件,改變控件的位置、尺寸。控件通過發(fā)送WM_COMMAND消息進(jìn)行相關(guān)的通信,不同控件類型發(fā)送消息的通知代碼是不一樣的。C++的MFC控件大體同C#,但代碼看起來比C#復(fù)雜一些,內(nèi)部原理一樣。ScrolllBar、ProgressCtrl、DateTimeCtrl.控件的成員變量有2種,一種是用來控制控件行為,稱為control類型變量,control類型變量比value類型變量功能更強(qiáng),另一種用來記錄/顯示控件內(nèi)容,稱為Value類型變量,多用于和用戶有交互輸入/輸出的控件(比如編輯框控件)中。以下的使用的是control類型的成員變量:下面這個例子用了GetDlgItem、SetWindowText、AfxGetApp()等常用函數(shù)。voidCMyStaticDlg::OnOK(){ CStatic*static1=(CStatic*)GetDlgItem(IDC_STATIC1); static1->SetWindowText("明日科技"); }voidCMyStaticDlg::OnOk2(){ if(!IsWindow(m_Dynamic.m_hWnd))//m_Dynamic是在窗口類中定義的CStatic對象m_Dynamic.Create("歡迎您!",WS_CHILD,CRect(110,50,180,100),this,1525); m_Dynamic.ShowWindow(SW_SHOW); }voidCMyStaticDlg::OnOk3(){ CStatic*static2=(CStatic*)GetDlgItem(IDC_STATIC2); static2->ModifyStyle(0,SS_BITMAP);//修改按鈕風(fēng)格 static2->SetBitmap(LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP1)));//設(shè)置位圖}voidCMyStaticDlg::OnOk4(){ CStatic*static3=(CStatic*)GetDlgItem(IDC_STATIC3); static3->ModifyStyle(0,SS_ICON);//修改按鈕風(fēng)格 static3->SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));//加載圖標(biāo) }voidCMyStaticDlg::OnOk5(){ CStatic*static4=(CStatic*)GetDlgItem(IDC_STATIC4); static4->ModifyStyle(0,SS_NOTIFY);//修改按鈕風(fēng)格 }voidCMyStaticDlg::OnStatic4(){ CStatic*static4=(CStatic*)GetDlgItem(IDC_STATIC4); static4->SetWindowText(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房地產(chǎn)分銷代理合同
- 2024個人與公司合作協(xié)議書
- 工程維護(hù)居間合同格式
- 2024年婚前財(cái)產(chǎn)協(xié)議書示例
- 城市房屋拆遷流程指南
- 合作經(jīng)營協(xié)議書范本經(jīng)典案例
- 農(nóng)村分家協(xié)議書編寫指南
- 青島市購房合同范本
- 工程簡易合同范例
- 大學(xué)生兼職協(xié)議書格式
- 人教版三年級數(shù)學(xué)下冊數(shù)學(xué)廣角搭配二教案
- TMF自智網(wǎng)絡(luò)白皮書4.0
- 電視劇《國家孩子》觀影分享會PPT三千孤兒入內(nèi)蒙一段流淌著民族大愛的共和國往事PPT課件(帶內(nèi)容)
- 所水力除焦設(shè)備介紹
- 改革開放英語介紹-課件
- pet考試歷屆真題和答案
- 《企業(yè)員工薪酬激勵問題研究10000字(論文)》
- 大學(xué)英語三級B真題2023年06月
- GB/T 7909-2017造紙木片
- GB/T 25217.6-2019沖擊地壓測定、監(jiān)測與防治方法第6部分:鉆屑監(jiān)測方法
- 中醫(yī)學(xué)課件 治則與治法
評論
0/150
提交評論