一、C與C++的關係
C與C++的關係示意圖如下圖所示:
從圖中可以看出以下幾點:
- C++繼承了所有的C特性
- C++在C的基礎上提供了更多的語法和特性
- C++的設計目標是運行效率與開發效率的統一
- C與C++不是競爭關係,而是 C++是從C進化而來的。
二、C到C++的升級
C++更強調語言的實用性,所有變量都可以在需要使用時再定義,而C語言中的變量都必須在作用域開始的位置定義。如下圖展示了是C++代碼是如何定義變量的。
register關鍵字是請求編譯器將局部變量存儲於寄存器中,從提高訪問變量的效率,C++爲了兼容C依然支持register關鍵字,但是C++編譯器有自己的優化方式。但C++編譯器發現程序中需要取register變量的地址師,register對量的聲明會變得無效。而C語言中是無法獲取register變量的地址,早期C語言編譯器不會對代碼進行優化,因此register變量是一個很好的補充。
在C語言中,重複定義多個同名的全局變量是合法的,多個同名的全局變量最終會被鏈接到全局數據區的同一個地址空間上。而C++中,不允許定義多個同名的全局變量。
struct關鍵字的加強,C語言中struct定義了一組變量的集合,而struct定義的標識符並不是一種新的類型,需用typedef關鍵字才能定義新類型。而C++中的struct用於定義一個全新的類型。例如下圖所示:
C++中所有的標識符都必須顯示聲明類型,而C語言中的默認類型在C++中是不合法的;在C語言中,int f()表示返回值爲int,接受任意參數的函數;f(void)表示返回值爲int的無參數函數。在C++中,int f()和int f(void)具有相同的意義,表示返回值爲int的無參函數。例如下圖代碼C語言和C++將會有不同的解釋。
在C語言中f(i)表示返回值爲 int類型,可接受參數爲int類型的函數。g()也是表示返回值爲 int類型,可接受任意參數的函數。而在C++中,f()和g()都不是合法的函數。
三、總結
- C++更強調實用性,可以在任意的地方聲明變量
- C++中的register只是一個兼容的作用,編譯器能夠更好的進行優化。
- C++中的任意標識符都必須顯示指明類型。