|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
閑扯C++ ——觀宇宙飛船帖有感 |
| 作者:赤鑄 欄目:單片機 |
我11年前開始用C++。但最早打工的公司(就是做CAXA電子圖板的那個)當時用的是C。后來干單片機了,也用不上。有PC端程序,也用的是Delphi(開發(fā)速度快)。所以到今天也沒真正用C++寫過大程序。但在設(shè)計思想上,我還是一直盡量“OOD”的,所以也在C++的問題上,自覺有一點發(fā)言權(quán)。 先讓我們看看C++的兩個重要特點: 1. 適度的面向?qū)ο。與一些比較“純粹”的OOP語言(不論是早期的Smalltalk還是新潮的Java)相比,C++中的面向?qū)ο箫@得很不完全,因為它沒有虛擬構(gòu)造函數(shù)、沒有類屬(用模板代替)、沒有動態(tài)數(shù)據(jù)類型、沒有自動內(nèi)存管理,保留了指針、全局對象和全局函數(shù),等等。這些還是從效率和實用出發(fā)的,這也是我最欣賞C++的地方:直面現(xiàn)實,不沉迷于理想主義。 2. 基于文本替換的實例化機制。C++中的模板,本質(zhì)和C語言中的宏一樣,都是文本替換,都是為了在代碼重用的同時保證效率。 所以,盡管總有人說要把C++看作全新語言,不要看作C語言的“改良”,但C++在骨子里仍然是C語言的繼承者——它繼承的是C的靈魂:實用主義,注重效率,行文簡潔優(yōu)美(教科書上總說Pascal語法優(yōu)美嚴謹云云)。 看來Microsoft也領(lǐng)會到了這個,也不枉它們使用C語言一場。從早期Windows的那些.h,到后來的MFC,都能反映這一點。這恐怕也是Microsoft早期的成功法寶之一。要知道,早在那個號稱“劃時代”的Windows95“橫空出世”之前很久,這地球上就已經(jīng)誕生了可以與后來的WindowsXP,至少是98相媲美的交互圖形用戶界面了。但是Microsoft卻能在PC機上照貓畫虎,所以它大獲成功(當年也有人對PC很不屑,所以他們相對失敗了)。由此也可見,Microsoft成功的關(guān)鍵,并不在于技術(shù)本身,而在于市場頭腦,在于技術(shù)服從市場。當然,更深層次的原因是PC行業(yè)崛起這個時代大背景。 總之,作為編程技巧和奇思妙想的范例(我統(tǒng)稱這類東西為《九陰真經(jīng)》下半部),Microsoft的代碼的確不錯。但是,如果你想成為真正的高手,而不僅僅停留在黑風(fēng)雙煞的級別,就必須從《九陰真經(jīng)》上半部,從真正的C++語言,從設(shè)計思想和體系結(jié)構(gòu)開始。 上半部的基本組成: 1. B.S.(C++的發(fā)明者)著《The C++ PROGRAMMING Language》。(多霸氣的書名!) 2. 面向?qū)ο蟮恼嬲A(chǔ)。推薦Bertrand Meyer的《Object-Oriented SOFTWARE Construction:2nd Edtion》?赐赀@個,你就知道OOP/OOD/OOS之類到底是什么。 3. Erich Gamma等,設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ),機械工業(yè)出版社,2000。想知道軟件到底應(yīng)該怎么設(shè)計?看這本書就可以了。 即使只做嵌入式(特指低端嵌入式)開發(fā),上述精神財富也絕對是大有裨益的。 |
| 2樓: | >>參與討論 |
| 作者: chunyang 于 2005/7/9 0:01:00 發(fā)布:
好帖! |
|
| 3樓: | >>參與討論 |
| 作者: hotpower 于 2005/7/9 0:22:00 發(fā)布:
哈哈,一個外星人搞的"全球C++大戰(zhàn)"... 搬個小凳學(xué)習(xí)學(xué)習(xí)... |
|
| 4樓: | >>參與討論 |
| 作者: taoest 于 2005/7/9 0:43:00 發(fā)布:
OOP OOP只是一個概念。設(shè)計的時候,心理一定要想著OOP,其實,心里想東西的方式都會變成OOP了。 C++只是一個工具,他與C比也就多了一些東西。如果你心里有OOP,用標準C 也能寫出OOP的東西來。 OOP是方法,不是語法。 |
|
| 5樓: | >>參與討論 |
| 作者: 宇宙飛船 于 2005/7/9 8:13:00 發(fā)布:
超級形象,原來我倒過來練功了!樓主分析的精妙之處擇錄如下 1. 適度的面向?qū)ο。與一些比較“純粹”的OOP語言(不論是早期的Smalltalk還是新潮的Java)相比,C++中的面向?qū)ο箫@得很不完全,因為它沒有(抽象?)虛擬構(gòu)造函數(shù)、沒有類屬(用模板代替)、沒有動態(tài)數(shù)據(jù)類型、沒有自動內(nèi)存管理,保留了指針、全局對象和全局函數(shù),等等。這些還是從效率和實用出發(fā)的,這也是我最欣賞C++的地方:直面現(xiàn)實,不沉迷于理想主義。 2. 基于文本替換的實例化機制。C++中的模板,本質(zhì)和C語言中的宏一樣,都是文本替換,都是為了在代碼重用的同時保證效率。 所以,盡管總有人說要把C++看作全新語言,不要看作C語言的“改良”,但C++在骨子里仍然是C語言的繼承者——它繼承的是C的靈魂:實用主義,注重效率,行文簡潔優(yōu)美(教科書上總說Pascal語法優(yōu)美嚴謹云云)。 //---------------------------------------------------------------- 樓主的分析正是我當時放棄PASCAL同JAVA的的再一次復(fù)習(xí)!樓主的精妙見解! 不知哪位自認為是高手的朋友能把樓主的導(dǎo)論駁倒。。。。? 注:修正一個致命的錯誤。 * - 本貼最后修改時間:2005-7-9 10:44:07 修改者:宇宙飛船 |
|
| 6樓: | >>參與討論 |
| 作者: 宇宙飛船 于 2005/7/9 8:21:00 發(fā)布:
樓主的以上精妙分析,希望對C++沒有印象的朋友認真默讀 10000000000.......遍,作用為C++ 的最高心法! |
|
| 7樓: | >>參與討論 |
| 作者: hotpower 于 2005/7/9 8:42:00 發(fā)布:
好看... |
|
| 8樓: | >>參與討論 |
| 作者: stintair 于 2005/7/9 9:09:00 發(fā)布:
學(xué)習(xí)中 凡事追求精藝求情 |
|
| 9樓: | >>參與討論 |
| 作者: pheavecn 于 2005/7/9 9:26:00 發(fā)布:
怎么會沒有虛擬構(gòu)造函數(shù)呢? 看看BCB中TButton的構(gòu)造函數(shù)定義: __fastcall virtual TButton(Classes::TComponent* AOwner); |
|
| 10樓: | >>參與討論 |
| 作者: 潛艇8421 于 2005/7/9 9:42:00 發(fā)布:
又見到一個超級高手浮現(xiàn)! 顯示C++ 太精深了。。。 |
|
| 11樓: | >>參與討論 |
| 作者: 潛艇8421 于 2005/7/9 9:45:00 發(fā)布:
沒有虛擬構(gòu)造函數(shù)應(yīng)該改為==》沒有虛擬抽象構(gòu)造函數(shù)! |
|
| 12樓: | >>參與討論 |
| 作者: zhousd 于 2005/7/9 9:57:00 發(fā)布:
超級高手真多,樓主太大意打漏了兩個字,整體分 析不知還有哪位自認是大師能駁倒!是大師的請站起來說話! 搬凳子坐著觀戲,呵呵。。。! 好戲連場。。。 |
|
| 13樓: | >>參與討論 |
| 作者: 宇宙飛船 于 2005/7/9 10:40:00 發(fā)布:
的確是有錯,希望樓主能在主貼中作修正! |
|
| 14樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2005/7/9 10:45:00 發(fā)布:
拿著磚頭,不知道砸誰好 |
|
| 15樓: | >>參與討論 |
| 作者: 宇宙飛船 于 2005/7/9 11:04:00 發(fā)布:
請問這個是不是還要受砸:沒有動態(tài)數(shù)據(jù)類型? 目前的C++編譯器已支持動態(tài)類型識別,RTTI機制。 |
|
| 16樓: | >>參與討論 |
| 作者: wolaiye3 于 2005/7/9 13:53:00 發(fā)布:
偶也在學(xué)習(xí)中 |
|
| 17樓: | >>參與討論 |
| 作者: 赤鑄 于 2005/7/9 19:00:00 發(fā)布:
支持虛擬構(gòu)造函數(shù)和RTTI的其實是Object Pascal 我所說的C++是“標準”C++(當然,C++的一個致命問題就是標準的姍姍來遲)。C++在發(fā)展,具體的編譯器廠家也會做各種擴充,所以必須限定個范圍。由于C++的復(fù)雜性(這與它的簡潔性并不矛盾,正如美國佬集強權(quán)和公正為一體的特性一樣),完整實現(xiàn)C++的編譯器并不多,反正Visual C++就不夠?qū)I(yè)(到6.0為止,后來的我不了解,但鑒于Microsoft后來的精力在.net而不在Virsual xxx上,估計不會有什么改進)。BCB不僅號稱完整支持C++,而且增加了一些重要的特性,包括虛擬構(gòu)造函數(shù)和RTTI。根源在于BCB的基礎(chǔ)是Delphi(VCL)。為了支持VCL,不得不實現(xiàn)Object Pascal中的相關(guān)特性。 人們通常所說的C++的“虛擬構(gòu)造函數(shù)”其實并不是BCB中那種"virtual"的constructor,而是一種間接實現(xiàn)。至于RTTI,號稱支持RTTI的C++編譯器越來越多,但跟Object Pascal中的根本不是一個層次。Object Pascal的RTTI類似于Java/C#中的Reflection,是一種“高級”的運行期類型機制。標準C++中的RTTI只能得到類名稱(具體編譯器的擴充也很有限),而Object Pascal中的RTTI卻可以得到類名稱、類繼承關(guān)系、對象實例大小,還有屬性、方法等信息。 * - 本貼最后修改時間:2005-7-9 19:38:20 修改者:赤鑄 |
|
| 18樓: | >>參與討論 |
| 作者: 汽車電子 于 2005/7/9 20:52:00 發(fā)布:
嵌入式程序有標準可言嗎?全都是擴展的C/C++,或... 個人認為,程序代碼量為K級的,根本沒必要用C++;代碼量為M級的,才用C++比較好... |
|
| 19樓: | >>參與討論 |
| 作者: pheavecn 于 2005/7/9 21:16:00 發(fā)布:
赫赫,赤鑄兄對OOP研究的很透呀。 科班出身吧? 我是半路出家搞得BCB,OOP也是半桶水來的。 |
|
| 20樓: | >>參與討論 |
| 作者: IceAge 于 2005/7/9 23:13:00 發(fā)布:
盡管可以間接實現(xiàn),標準C++ 沒有虛擬構(gòu)造函數(shù) 虛擬函數(shù)是為了實現(xiàn)通用接口,并不需要知道具體的派生類類型。而構(gòu)造函數(shù)則必須確切了解細節(jié),以便正確的初始化。 Borland,microsoft 為了自己的方便,都對 ISO C++ 做出了擴展。 關(guān)于 BCB, 這里有一些文章: http://www2.borland.com.tw/tw/nw03111001.html http://bbs.openlab.net.cn/ShowThread.aspx?PostID=193482 |
|
| 21樓: | >>參與討論 |
| 作者: 路過看看 于 2005/7/11 0:13:00 發(fā)布:
是不是久經(jīng)考驗的飛船? |
|
| 22樓: | >>參與討論 |
| 作者: dontium 于 2005/7/11 0:50:00 發(fā)布:
原來樓主對VC的研究也頗深 |
|
| 23樓: | >>參與討論 |
| 作者: 宇宙飛船 于 2005/7/11 9:35:00 發(fā)布:
反正Visual C++就不夠?qū)I(yè),到6.0為止??? VC++6不夠?qū)I(yè)嗎? 假如用電子電路來等效:VC++6 的MFC架構(gòu)的實現(xiàn)相當于分立的TTL,CMOS電路模塊組成的微處理器,Object PACASL 的編譯器相當于單片大規(guī)模集成的微處理器。 用分立TTL,CMOS,IC做的微處理器功能模塊電路我們能夠很好地深入學(xué)習(xí)CPU的原理。 MFC之所以有研究價值,就是因為并沒有把這些功能完全集成在編譯器中,VC++6 編譯器本身已有RTTI 功能,但MFC 并沒用編譯器的功能,而是用另一種方法實現(xiàn),這正是我們應(yīng)該學(xué)習(xí)研究的地方。 貼主在主貼內(nèi)容上講C++沒有虛擬構(gòu)造函數(shù),這很容易誤導(dǎo)C++ 初學(xué)者,虛擬是C++ 很重要的特性,是效率,是方便程序設(shè)計的接口,是編譯器本身要做的事。 |
|
| 24樓: | >>參與討論 |
| 作者: 宇宙飛船 于 2005/7/11 19:41:00 發(fā)布:
懂‘C’就直接用API來的快,又穩(wěn)定! 把一個最小的WINDOWS ‘C’(SDK) 程序弄透了(一兩天的事),再準備一本API手冊,就可以為所欲為了! |
|
| 25樓: | >>參與討論 |
| 作者: hotpower 于 2005/7/11 20:06:00 發(fā)布:
我是加盲,但AVR好象不玩過家家確實不夠意思 |
|
| 26樓: | >>參與討論 |
| 作者: 宇宙飛船 于 2005/7/11 20:41:00 發(fā)布:
RE lufeijian ,API就是煩, 用C++ 可以直接用ATX 控件(我可沒做過). |
|
| 27樓: | >>參與討論 |
| 作者: lufeijian 于 2005/7/11 21:00:00 發(fā)布:
再次謝謝各位,日后有麻煩再來請教各位! 這里的高手多,熱心的人也多!心里是那個高興。‖F(xiàn)在比以前熱了不少。。。 |
|
| 28樓: | >>參與討論 |
| 作者: 赤鑄 于 2005/7/12 4:37:00 發(fā)布:
補充 “反正Visual C++就不夠?qū)I(yè),到6.0為止” 看清楚上下文,我指的是“在完整實現(xiàn)C++方面不夠?qū)I(yè)”。與之相比,BCB完整的多。 至于RTTI,可能我上面說的不夠明確,我認為VC里面那種RTTI算不上真正的RTTI。(而且我認為按照C++的設(shè)計思想,這種東西也不是很必要) 我11年前用的是Watcom C/C++,當時(可能至今仍然)是代碼優(yōu)化最牛,調(diào)試器功能最強大(不等于最方便)的C/C++開發(fā)工具。你們見過別的調(diào)試器可以“倒著”執(zhí)行代碼的嗎?呵呵 |
|
| 29樓: | >>參與討論 |
| 作者: 赤鑄 于 2005/7/12 4:40:00 發(fā)布:
另外,類屬可不是類 類屬是類似C++的template的東西,有點“參數(shù)化的類”的意思 C++沒有元類(類似Object Pascal中的TClass的東西),也就不可能支持類屬 template功能比類屬簡單,但效率更高,還是體現(xiàn)了它的設(shè)計初衷 |
|
| 30樓: | >>參與討論 |
| 作者: dpjmxd 于 2005/7/12 9:43:00 發(fā)布:
本論題感覺赤鑄最深入了解C++ 其它人都是了解一點皮毛(包括我一個),向赤鑄同志學(xué)習(xí)!天天向上。 呵呵! |
|
| 31樓: | >>參與討論 |
| 作者: yadog 于 2005/7/19 21:07:00 發(fā)布:
c++相關(guān) 先在這里mark一下 |
|
| 32樓: | >>參與討論 |
| 作者: hgem 于 2005/7/19 21:46:00 發(fā)布:
學(xué)習(xí)學(xué)習(xí) |
|
| 33樓: | >>參與討論 |
| 作者: yzh4531 于 2005/8/30 14:40:00 發(fā)布:
怎么做虛擬儀器,用vc++!哭求例子 怎么做虛擬儀器,用vc++!哭求例子 |
|
| 34樓: | >>參與討論 |
| 作者: dable_hn 于 2005/8/30 18:38:00 發(fā)布:
為何要用VC做虛擬儀器呢? 其實即使用VC開發(fā)虛擬儀器也得有板卡的驅(qū)動,這樣和開發(fā)普通的程序區(qū)別已經(jīng)不大,跟硬件打交道變得很簡單了。 但反過來,有了驅(qū)動用LabWindows開發(fā)程序也很簡單,簡直比VC還簡單,況且LabWindows提供的界面和信號處理函數(shù)都使虛擬儀器開發(fā)變得什么簡單。為何非要VC實現(xiàn)那華麗的界面和復(fù)雜的算法呢? |
|
| 35樓: | >>參與討論 |
| 作者: jackf125 于 2005/9/11 23:31:00 發(fā)布:
實用就行 實用就行 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |