C++從誕生之初就號稱和C是兼容的,正是這種兼容,使C++得以迅猛發展,然而也正是這種兼容,讓C++背上了沉重的歷史包袱。且不論其利弊,讓咱們來看看C++在兼容C的那部分中,與C語言有什麼不一樣。html
在C語言中,沒有bool類型,咱們一般的作法是:數組
1: #ifndef FALSE
2: #define FALSE 0
3: #endif
4:
5: #ifndef TRUE
6: #define TRUE (!(FALSE))
7: #endif
而在C++中,事情簡單了不少,bool是內置類型,true和false也是C++的關鍵字,咱們能夠直接使用。函數
C語言容許void *類型隱式轉換爲其餘類型指針,而C++不容許。好比咱們使用malloc申請內存,在C和C++中的寫法是不同的:spa
1: // C
2: char *a = malloc(10);
3:
4: // C++
5: char *a = (char*)malloc(10);
固然,將其餘指針類型轉換爲void *在兩種語言中都是能夠的,由於它是「向上類型轉換」。指針
在C和C++中,char類型都是佔用1個字節。可是字符常量在兩種語言中大小倒是不同的,在C中,字符常量與int類型同樣,32位機器上佔用爲4個字節,而C++中,字符常量與char類型同樣,佔用爲1個字節。code
1: // C, output:1 4
2: char a = 'a';
3: printf("%d %d\n", sizeof(a), sizeof('a'));
4:
5: // C++, output:1 1
6: char a = 'a';
7: cout<<sizeof(a)<<" "<<sizeof('a')<<endl;
const變量在C語言中聲明時能夠不初始化,它的值根據做用域而定(若是是全局變量或static變量,初始化爲0,不然爲垃圾值),而在C++中聲明時必須被初始化,且默認僅本文件內可見。在C中,const變量不能用於數組的聲明(C99中引入的可變數組除外),而在C++中,const變量能夠用在數組聲明中標明數組大小。htm
一樣的函數聲明void f();在C中,調用該函數時,能夠傳入任意個數的參數,可是在函數中沒法正常取到傳入參數的值。而在C++中,這樣的函數聲明就是說:我不接受任何參數。內存
1: // C, output: hello
2: void f()
3: {
4: printf("hello\n");
5: }
6:
7: int main(int argc, char *argv[])
8: {
9: f(1, 2, 3, 4);
10:
11: return 0;
12: }
13:
14: // C++, compile error: too many arguments to function 'void f()'
15: void f()
16: {
17: cout<<"hello"<<endl;
18: }
19:
20: int main(int argc, char *argv[])
21: {
22: f(1, 2, 3, 4);
23:
24: return 0;
25: }
如何在C語言中聲明不接受任何參數的函數呢?答案是:作用域
1: // C, function f accept no arguments
2: void f(void)
3: {
4: printf("hello\n");
5: }
此外,在C語言中,在調用函數的時候不必定須要函數已經聲明,找不到合式的函數聲明時,編譯器會默認生成一個返回類型爲int的函數聲明,只有在連接時若是找不到函數實現纔會報錯;而在C++中,調用函數時要求該函數必須已經聲明,不然在編譯階段就會產生錯誤。rem
在C語言中,聲明結構體變量時必須有struct關鍵字,而在C++中,struct和class是同樣的,僅用結構體名稱就能夠聲明變量。
此外,空結構體的大小在C和C++也也有差別,C語言中爲0,而C++中爲1。
1: // C, output:0 0
2: struct str_empty {
3:
4: };
5: int main(int argc, char *argv[])
6: {
7: struct str_empty s;
8: printf("%d %d\n", sizeof(struct str_empty), sizeof(s));
9:
10: return 0;
11: }
12:
13: // C++, output: 1 1
14: struct str_empty {
15:
16: };
17: int main(int argc, char *argv[])
18: {
19: str_empty s;
20: cout<<sizeof(str_empty)<<" "<<sizeof(s)<<endl;
21:
22: return 0;
23: }
在C和Java中,都沒有函數默認參數,而在C++和Python中,均可以提供默認參數。
C++一直以來就是一個龐然大物,而隨着它的發展,又不斷被加入新的東西,如今的C++的複雜程度實在是讓人望而生畏。這裏且看看C++中有哪些比較有用而又不多被人說起的功能。