What is the full name of C++.

2006-10-20 4:16 am
I want to know more about C++, the full name of C++(in English) is the most important think that I need to know.

回答 (1)

2006-10-20 4:58 am
✔ 最佳答案
C++ 已經是全名了,佢係程式語言ge名
---
C++ 是到目前為止最受歡迎的語言。每 7.5到 9個月 C++的使用者
都會加倍。「懂 C++」是個很好的求職資格(但你必須把它當成 OOPL,而不只是一
個更好的 C 來用才行)。

「封裝性 encapsulation」:藉由隱藏內部的資料結構,讓我們可以改變系統的某部
份,而不必更動其他部份。我們為軟體元件(稱之為 class,類別)提供一個安全的
介面,用戶只碰得到這個介面而已;而相對起來比較容易變動的介面「實作」部份,
就被封裝起來(就像被包在膠囊裡),以避免用戶過於依賴他一時的實作決定。在比
較簡單的 C 裡頭,可由模組內的靜態(static)資料來辦到,以避免其他模組存取
到它。

「多重案例 multiple instances」:典型的 C 語言「封裝」方法(剛才有提),做
不到多重的資料案例(我們很難替模組的 "static" 資料做出多重案例)。如果在 C
中要做到的話,我們得使用 "struct" 結構(但是它沒有「封裝性」)。在 C++裡,
我們可用 "class"(物件類別)來做到多重案例與封裝性:"public"公共部份包含了
它的介面(通常這裡會有個特別的函數:成員函數),"private" 私有部份包含了它
的實作細節(通常這兒就是內部資料結構的所在)。

「行內函數呼叫」:在 C 中,可以在 struct 裡放個 "void*"(該存取函數 [access
functions] 會用到指標轉型)來達到「封裝的 structs」。這樣會喪失型別安全性
,而且會造成過多的函數呼叫,即使你只存取結構內的小小欄位(假如你允許直接存
取結構內欄位的話,它內部的資料結構就很難再變更了,因為你的程式有太多地方“
依賴”它以前的樣子)。函數呼叫的額外負擔不大,但是會累積起來。C++ 的類別允
許函數作 "inline" 行內擴展,就有以下好處:①封裝的安全性,②多重案例的方便
性,③直接存取的速度。而且,編譯器也會檢查行內函數的參數,這就比 C 的
#define 巨集更好了。

「多載運算子」:C++ 能對物件類別的運算子加以多載(overload),以合乎我們的
直覺(譬如,"myString + yourString" 可做字串串接,"myDate++"可用來遞增日期
,"z1 * z2" 可將兩複數 z1 及 z2 相乘,"a" 可用來存取 "a" 這個連結串列的
第 i 個元素……等等)。你甚至可以做出個“聰明的指標”(smart pointer),以指
向磁碟或其他地方去("x = *p" 可 dereference [解參用] 指標,也就可以在磁碟
中找到 p 所“指到”的地方,並傳回其值)。這可讓使用者以切近該問題的方式來
寫程式,而非以機器的語言來解題。

【譯註】STL (Standard Template Library) 就大量利用到「聰明的指標」功能。

「繼承性 inheritance」:我們還只是在表層而已,事實上,我們還沒進入「物件導
向」的部份呢!假設你有個 Stack 堆疊型態,有 push﹑pop 運算。若你還想要個
InvertableStack 型態,它“很像”Stack,只是它還有個 "invert" 運算。以 C 的
方式,你不是得①修改現存的 Stack模組(如果它在其他地方也用到的話,就麻煩了
),就是得②把 Stack拷貝到另一個檔案,再加以修改之(這會導致過多重複的程式
碼、容易破壞到 InvertableStack 裡某些源自 Stack 的小地方,尤有甚者,得維護
雙倍的程式碼)。C++提供了更乾淨的解決法:繼承。你可以說:「InvertableStack
繼承了 Stack的一切,且 InvertableStack又添加了 invert 運算。」這樣子就好了
!Stack本身仍然是封閉的(未被更動到),而 InvertableStack也沒重複 push/pop
等的程式碼。

「多型」與「動態繫結」:OOP 真正的力量不僅是繼承性,還有把 InvertableStack
當成是一個 Stack來傳遞的能力。這是安全的,因為(至少在 C++裡)此乃「是一個
……」的關係("is-a" relation),透過公共繼承達到的(亦即:InvertableStack
“是一個”Stack,且它還能自我 invert 反轉)。多型(polymorphism)與動態繫
結(dynamic binding)最容易從實例來理解了,所以我提個典型的例子:繪圖軟體
得處理圓形﹑方形﹑矩形﹑多邊形及直線,這些都是「形狀 shape」。大部份繪圖軟
體的內部函數都需要個“形狀”的參數(相對於某些像是“方形”這種特定的形狀)
,譬如:當我們用滑鼠選取某個圖形,它就可能被拖曳放到螢幕某處。多型和動態繫
結讓程式能正確運作,即使編譯器只知道該參數是個「形狀」,而不知它到底是什麼
形狀。我們再假設剛才提到的 "pick_and_drag(Shape*)" 函數於星期二編譯好了,
到了星期三,你打算再加個六邊形。聽起來很奇怪,但 pick_and_drag() 仍然能夠
處理這個六邊形,即使當 pick_and_drag() 編譯時六邊形還不存在!(若你明瞭
C++ 是怎麼做的,它就再也不驚異了--但它仍然是很方便的!)


收錄日期: 2021-04-23 21:17:44
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20061019000051KK03732

檢視 Wayback Machine 備份