第一課, 從C到C++
C與C++的關係
(1)C++繼承了所有的C特性;
(2)C++在C的基礎上提供了更多的語法和特性;
(3)C++的 設計目標是執行效率與開發效率的統一;
C++對C的加強
(1)C++中更強調語言的實用性,所有的變數都可以在需要使用時再定義
可以for括號內宣告變數,C不可以。
(2)register關鍵字的變化
register關鍵字請求“編譯器”將區域性變數儲存在暫存器中,C語言無法取得register變數地址。
在C++中依然支援register關鍵字,C++編譯器有自己的優化方式,不使用register也可能做優化;C++中可以取得register變數的地址,C++編譯器發現程式中需要取register變數的地址時,register對變數的宣告變得無效。
早期C語言編譯器不會對程式碼進行優化,因此register變數是一個很好的補充。
在C++可以不用register,它在C++存在的目的僅僅是相容C,在C++中出現register時,僅僅把它當做一個普通的變數。
(3)在C語言中可以定義多個全域性變數,是合法的;
(4)在C++語言中,不允許定義多個同名的區域性變數,C語言中多個同名的區域性變數最終會被連結到全域性資料區的同一地址空間上。C++直接拒絕這種二義性的做法。
這是在C中執行
這是在在C++中執行
(5)C++編譯器對const常量的處理
當碰見常量宣告在符號表中放入常量;
編譯過程中若發現使用常量則直接以符號表中的值替換;
編譯過程中若發現對const使用了extern或者&操作符,則給對應常量分配儲存空間
注意:C++編譯器可能為const常量分配空間,但不會使用其儲存空間的值。
(6)C語言中的const變數
C語言中const變數只是只讀變數,有自己的儲存空間;
(7)C++中的 const常量
可能分配儲存空間:當const常量為全域性,並且需要在其他檔案中使用;當使用&操作符取const常量的地址;
例項分析:C++中的const常量
在C中編譯出錯,沒法確定陣列有多大。a和b是變數;
在C++不會,a和b是常量;
(8)struct型別的加強
C語言的struct定義了一組變數的集合,C編譯器並不認為這是一種新的型別;
C++中的struct是一個新型別的定義宣告;
(9)C++中所有的變數和函式都必須要有型別,C語言中的預設型別在C++中是不合法的。
C語言中什麼都不寫可以接收引數,C++加不加void都不接收。
(10)在C語言中,int f();表示返回值為int,接受任意引數的函式;
int f(void);表示返回值為int的無參函式;
(11)在C++中,int f(),和int f(void)具有相同的意義,都表示返回值為int的無參函式。