ckmarkhsu 7 發表於 July 21, 2008 檢舉 Share 發表於 July 21, 2008 版上常有人問,C++ / C 有什麼區別? 絕大多數的人都會說沒什麼差別此言差矣,其實差距是非常大的,相較於 C,C++ 改良與新增了許多功能我簡單陳述幾點如下: C++ 支援型態安全的 IO 輸出相較於 C 使用 printf,C++ 改使用 cout, cin 物件處理輸入輸出由於 printf 需要自行指定型態,在輸出的時候很可因為程式設計師的指定錯誤,而產生錯誤的輸出結果而 C++ 的 cout 則會自動判斷變數型態,因此較為安全與方便 C++ 支援較大規模程式開發相對於 C,C++ 可適用於更大規模的程式開發例如支援 namespace(命名空間),可以讓函數、物件命名上更有彈性 左值(Lvalue)與右值(Rvalue)在 C 中,大多數的運算結果都是回傳數值(也就是右值)而在 C++ 中,則改成回傳記憶體位址(左值)因此,++++x 這種運算在 C++ 是合法的而 C 則不被允許 引進 bool 型態 更安全的變數型態轉換 支援函數多載(Function Overloading)舉例來說,如果你今天寫了一個處理整數開平方根的函數int sqare(int);但你又需要一個能處理浮點數的函數,那你應該是要重寫一個呢還是將原本的函數改成支援浮點數的版本,無論是哪一個都相當不方便。因此 C++ 中允許你做這樣的宣告int sqare(int);float sqare(float);double sqare(double);他會視你傳入的參數決定要呼叫哪個函數,此即為函數多載(Function Overloading) 支援 inline function許多較短的函數,若能合併編譯便能提升許多速度,例如這一個判斷奇數的bool even(int n) { return (n&1)==0; }這個函數相當短,但程式執行時仍需要花費時間在參數傳遞與結果回傳上,若能改成inline bool even(int n) { return (n&1)==0; }則編譯器會將此段程式碼直接編譯到呼叫的程式碼中,不需要再進行傳遞 函數模板在許多時候一個函數可能需要處理很多不同的參數型態雖然我們可以用 function overloading 解決此問題,但這樣你就必須撰寫許多不同版本的程式碼而函數模板則允許你不將 function 回傳與傳入型態寫死,而是在你實際呼叫的時候才指定編譯器會在編譯時幫你自動產生對應的 function 減少開發者的困擾。 Reference 參數傳遞型態參數傳遞進入 function 時通常是在記憶體中複製一份資料到新的空間但若參數資料量龐大,複製會花費很多記憶體空間與時間(回傳也是)因此, C++ 中如果參數傳遞時加上 & 符號,則他僅會傳入 address,不會重新複製一份 支援函數指標 (略) 支援 物件導向程式設計 概念我想這是 C++ 最困難也最強大的部分,前面所提及的部分頂多是 C++ 改善 C 的基本項目而 class 則是 C++ 相對於 C 全新的概念,因此很難三言兩語說完,故暫時不說XD以我修課的感覺來說,C 僅包含 1/3 C++ 的內容,因此學習 C++ 的難度與時間可想而知但是否只有 C++ 才能寫出程式呢? 當然不是這樣,C++ 可以做的,C 也完全可以,C++ 改善的是程式開發的效率與難度事實上在許多記憶體與運算資源有限的環境下,相對於 C++,C 仍是最佳的選擇所以到底要學哪個好? 其實都好,反正程式設計重視觀念,等學會以後,要再學習其他語言都是很快速的註:本文參考交通大學資工系黃問泙教授的教案。ckmarkhsu 鏈接文章 分享到其他網站
TerryW 10 發表於 July 21, 2008 檢舉 Share 發表於 July 21, 2008 這篇文讚!講得很清楚!在Effective C++裡面第一項條款就講到「視C++為一個語言聯邦」作者把C++分成四個部分:1)C2)Object-oriented C++3)Template C++4)STLC只是其中一個小部分,而每個部分都有不同的規則要遵守(想知道可以去翻這本書,推薦!) 鏈接文章 分享到其他網站
TerryW 10 發表於 July 21, 2008 檢舉 Share 發表於 July 21, 2008 對了,關於以下這點[*] 左值(Lvalue)與右值(Rvalue)在 C 中,大多數的運算結果都是回傳數值(也就是右值)而在 C++ 中,則改成回傳記憶體位址(左值)因此,++++x 這種運算在 C++ 是合法的而 C 則不被允許不是所有的operator都回傳位址(我覺得應該要講reference比較適合),像+-*/就不是 鏈接文章 分享到其他網站
ckmarkhsu 7 發表於 July 21, 2008 作者 檢舉 Share 發表於 July 21, 2008 對了,關於以下這點不是所有的operator都回傳位址(我覺得應該要講reference比較適合),像+-*/就不是唔 不好意思,這點可以請您舉個例子嗎XD 因為這樣的描述其實我不是很明瞭^^" 鏈接文章 分享到其他網站
TerryW 10 發表於 July 21, 2008 檢舉 Share 發表於 July 21, 2008 唔 不好意思,這點可以請您舉個例子嗎XD 因為這樣的描述其實我不是很明瞭^^"例如以下程式碼無法通過編譯int x=2, y=3;++(x+y);x+y傳回的值是無法被更動的,也就是並非l-value此外,當我們對自行定義的class過載operator +(or - * /)時,是這樣做的(以大數為例):class Bignumber{private: //略public: ... void add(const Bignumber &obj){ //略,讓物件本身加上另一個大數 } [COLOR="Red"]const Bignumber[/COLOR] operator +(const Bignumber &rhs) { Bignumber temp(*this); temp.add(rhs); return temp; } ...}可以看到operator +的回傳型態是const Bignumber,一個常數值這樣做的目的是避免出現x+y=b或是++(x+y)等情況至於= ++ --等operator就是回傳reference了 鏈接文章 分享到其他網站
Recommended Posts
請登入後來留意見
在登入之後,您才能留意見
立即登入