【教學】淺談 C 與 C++


Recommended Posts

版上常有人問,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

鏈接文章
分享到其他網站

這篇文讚!講得很清楚!

在Effective C++裡面第一項條款就講到

「視C++為一個語言聯邦」

作者把C++分成四個部分:

1)C

2)Object-oriented C++

3)Template C++

4)STL

C只是其中一個小部分,而每個部分都有不同的規則要遵守

(想知道可以去翻這本書,推薦!)

鏈接文章
分享到其他網站

對了,關於以下這點

[*] 左值(Lvalue)與右值(Rvalue)

在 C 中,大多數的運算結果都是回傳數值(也就是右值)

而在 C++ 中,則改成回傳記憶體位址(左值)

因此,++++x 這種運算在 C++ 是合法的而 C 則不被允許

不是所有的operator都回傳位址(我覺得應該要講reference比較適合),像+-*/就不是

鏈接文章
分享到其他網站
唔 不好意思,這點可以請您舉個例子嗎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了

鏈接文章
分享到其他網站

請登入後來留意見

在登入之後,您才能留意見



立即登入