C++ 與 C 到底有何不同? 
^^^^^^^^^^^^^^^^^^^^^^ 
簡單說, C++ 就是 C 多了"物件導向Object Oriented"的概念,
以及多了一點點不同規定! 
C++ 以前的名稱叫做 C with class (類別);
  還有, C++ 還多了女共匪寫的好用的 STL 類別程式庫! 
先講一些比較明顯的(當然還很多不同! 以後再說)

(1) 名稱不同 : 廢話!
(2) 變數的定義之規定不同: 
    C 規定任何 Block (區塊)內, 一旦開始寫會做事的句子後就不可再定義變數!
       (指述 statement 就是指令的描述, 阿就是白話文的"句子")
  例如:  int a;  a = a+3;
       然後再寫 int x; 這樣是錯的! ( 因為已經寫了 a = a+3;)

    C++ 則規定任何時候你想定義變數就給它定義下去!
  請注意, C/C++ 只規定變數要宣告(declare)之後才可用!
   並沒規定說 "定義過才可使用", 
  所以翻譯(編譯; compile)時, 只要宣告過就可用,
  至於有沒有定義則不是 compiler 的事情,
  那是 Link (鏈結, 連結) 時那個  Linker (連結器)要負責檢查的,
 所以, 就算編譯過了, 但是若要連結時找不到其定義還是生不出執行檔!

 ***還有, 在 Block 內才定義的變數在離開 Block 後就不見了!
  例如, 以下 C++ 的句子 (注意, 這句在 C 是錯的!): 
     for(int i=1; i <= 9; i++) {
        //...
     } // for 
  在 for Loop 結束後, i 就不見了 !  
(3) 編譯器(Compiler)編譯函數名稱的做法不同! 
   (a)全天下所有的 C compuler 編譯到函數名稱只是在它左邊補個底線號,
      例如, 函數 myScmp 會被編譯成 _myScmp
      底線號英文叫做 under line 或 under score
   (b) C++ 為了達到 function name overloading (重載),
      會把參數的type加到編譯出的函數名稱內,
      但因為C++手冊沒有很明確規定, 各 compiler 做法都不同!
      看看用 Dev-CPP 時, gcc 與 g++ 編譯的不同:
  註: 以下 gcc -c 或 g++ -c 的 -c 表示只做編譯不要偷叫Linker做Link
      至於 nm 則是仿照 Unix 系統內的 nm 在 Object file 內找出 name

    (請參考之前給大家九個版本的 strcmp 字串比較函數 strcmp99.c)

D:\test> path C:\Dev-Cpp\bin;%path%
D:\test> gcc -c strcmp99.c

D:\test> nm strcmp99.o
00000000 b .bss
00000000 d .data
00000000 t .text
00000000 T _myScmp
0000007f T _scmp2
000000ec T _scmp3
0000014d T _scmp4
000001b6 T _scmp5
0000021b T _scmp6
0000029a T _scmp7
00000312 T _scmp8
00000391 T _scmp9

D:\test> 
D:\test> g++ -c strcmp99.c


D:\test> nm strcmp99.o
00000000 b .bss
00000000 d .data
00000000 t .text
00000080 T __Z5scmp2PcS_
000000ee T __Z5scmp3PcS_
00000150 T __Z5scmp4PcS_
000001ba T __Z5scmp5PcS_
00000220 T __Z5scmp6PcS_
000002a0 T __Z5scmp7PcS_
00000318 T __Z5scmp8PcS_
00000398 T __Z5scmp9PcS_
00000000 T __Z6myScmpPcS_

D:\test>  
  看到了?
  函數 int scmp2(char*, char*); 在 C 被編譯成 _scmp2
  (注意, 全天下的 C compiler 在這點是統一的!)
  但是, 在當作 C++ 編譯時卻變成 __Z5scmp2PcS_
  這可以解釋這樣: __Z5 表示函數名稱 5 個 char : scmp2
   之後的 Pc 表示 char* 阿就是 Pointer of char,
   又接著 S_ 表示 Ditto (問問看過第六感生死戀的:)
   意思是"同上", 這表示第2參數與前一個相同啦!
** 所以, 只要參數 type 或參數的個數不同,
    編譯出的名稱就不同!
   這就是何以 C++ 可以寫很多同名的函數! 
** 請注意, 用別的 C++ 編譯器 compile 並不會生出相同的名稱!
   所以, 不同 C++ Compiler 編譯出的 object code 是不相容的!
 但是, 不同 C 的 compiler 編譯出的 object 是相容的喔!! 

以下是之前給大家的 string compare functions 之宣告:

int myScmp(char*, char*);
int scmp2(char*, char*), scmp3(char*, char*), scmp4(char*, char*);
int scmp5(char*, char*), scmp6(char*, char*);
int scmp7(char*, char*), scmp8(char*, char*), scmp9(char*, char*);