你要知道的C與C++的區別
如果要說C和C++的區別的話,可能可以列出很多方面出來,但是有許多方面的區別是我們學完這兩門語言之後就可以
很好的理解和區分的,比如C是面向過程的一門程式語言,C++雖然主要是以C的基礎發展起來的一門新語言,但它不是
C的替代品,不是C的升級,C++和C是兄弟關係,它可以很好地進行面向物件的程式設計。我要討論的不是這些比較顯
而易見的區別,而是哪些容易被我們所忽略或者混淆的區別。
區別一:過載問題
我用的比較多的IDE是VC6.0,編寫程式碼時通常就是建立“Win32 Console Application”,現在向工程中新增test.cpp,
在test.cpp中編寫程式碼,程式碼如下:
1 #include <stdio.h> 2 3 int Add(int a,int b) 4 { 5 return a+b; 6 } 7 int Add(int a,int b,int c) 8 { 9 return a+b+c; 10 } 11 12 void main() 13 { 14 Add(1,2); 15 Add(1,2,3); 16 return; 17 }
程式編譯通過,並且能夠正常執行。這說明C++程式可以實現過載,過載的條件是:
a.函式名相同,引數的個數不同;
b.函式名相同,引數的個數相同但引數型別不同。
而在test.c中編寫同樣的程式碼,編譯時就會出現如下的錯誤提示:
所以可以看出C語言是不支援過載,而C++支援過載。
區別二:C/C++的void引數
在C程式中如果在宣告函式的時候如果沒有任何引數那麼需要將引數定義為void以此來限定此函式不可傳遞任何引數,如果不進行限定讓引數表預設為空其意義是可以傳遞任何引數,這個問題的由來實際上是由於要相容早期的K&C標準造成的。K&C 在宣告函式時引數表為空,也就是說函式宣告時的函式原型簽名信息不包含引數資訊,如果要有明確的定義空引數的行為那麼就要自己去處理它。
我在test01.c中編寫c程式碼,程式碼如下:
1 #include <stdio.h> 2 #include <conio.h> 3
3 void SayHello() //是一個可變引數的函式
5 { 6 printf("\nHello World !"); 7 return; 8 } 9 10 void main() 11 { 12 SayHello(1); 13 SayHello(1,2,3); 14 SayHello('a','b'); 15 16 getch(); 17 return; 18 }
程式碼編譯通過,並且正常執行。可見C語言中的函式定義時不帶引數並不代表該函式在呼叫時不能傳參,而是這個函式
將成為一個可變參的函式,呼叫時可以傳遞不同個數的引數。如果要限制這個函式不能傳參,這需在定義時加void關鍵字,
void SayHello(void)。
再在test02.cpp中編寫程式碼,程式碼與上面的程式碼完全相同,但是在編譯的時候發生了錯誤:
可見在C++語言中,不帶引數的函式在呼叫時並不是和C語言一樣可以傳遞不同個數的引數,函式不能傳遞任何引數,
此時C++中的 void SayHello()或者void SayHello(void)和C中的void SayHello(void)是一樣的。
區別三:struct的功能
我們都知道在C和C++程式碼中都可以定義結構體struct,然而C語言只能在struct中宣告變數(像int型別,char型別),
但是C++語言不僅可在struct中宣告變數,同時還可以定義函式,優點類似於類的既可以有成員變數又有方法。
我在test_struct.cpp中編寫的程式碼如下:
1 #include <stdio.h> 2 #include <conio.h> 3 4 struct People 5 { 6 char *Name; //變數 7 int Age; 8 9 void SayHello(char *name,int age) //函式體 10 { 11 Name=name; 12 Age=age; 13 printf("\n My name is %s,I am %d years old .",name,age); 14 return; 15 } 16 }; 17 18 void main() 19 { 20 People p1; 21 p1.SayHello("Mike",18); 22 23 getch(); 24 return; 25 }
程式編譯通過,並且成功執行,執行結果:
如果在.c檔案中新增以上程式碼,則在編譯的時候就提示出錯:“函式不能作為結構體struct的成員”
所以可以說C++在struct的使用上是對C做了擴充套件的了。