標籤:com 變數 style 進階 面向 gcc def 關係 資料
C與C++的關係:
C++在C語言的基礎上進行的升級最重要的是兩個方面:
1、類型的加強,C++更稱得上是進階語言,C++語言對於類型的檢查更嚴格
2、物件導向的支援,天生支援物件導向軟體開發方法學
C++語言是C語言的進化。
C++語言更強調語言的實用性,有一些文法方面的加強
所有變數都可以在需要使用時再定義
而C語言中的變數必須在範圍開始的位置定義(老的C語言版本)
register關鍵字:
register關鍵字在C語言中很雞肋,編譯器發展到後期,最佳化能力很強。C++雖然依舊支援register,這僅僅是為了相容C語言。C++有自己的最佳化方式,基本不看是否存在regster關鍵字。register在C++中形同虛設。
C++中的register關鍵字:
在C語言中,重複定義多個同名的全域變數是合法的
在C++中,不允許定義多個同名的全域變數,C++直接拒絕這種二義性的做法
C語言中的多個同名的全域變數最終會被連結到全域資料區的同一個地址空間上
樣本程式:
上述的程式變數c不是在main函數的起始範圍處定義的,for迴圈中也定義了i,這在C語言是不合法的,會報錯。int型的register變數a,在C++中register會被編譯器忽略。
C++如果定義兩個相同的全域變數會直接報錯:
用gcc編譯器編譯會得到如下錯誤:
struct關鍵字的加強:
C語言中的struct定義了一組變數的集合
C語言中的struct定義的標識符並不是一種新的類型
C++中的struct用於定義一個全新的類型
C++中進行了類型的加強,非常注重類型,C++中把struct關鍵字當成是一個定義新類型的關鍵字,只要struct出現了,C++就認為產生了一種全新的類型。C語言中定義新類型必須要用typedef。
上面的等價定義中,左邊的在C語言中,編譯器認為struct定義了一種變數的集合,並且這個變數的集合有一個名字叫做_tag_student,它並不是一種新的類型,如果要將它當做類型來使用,必須要用typedef關鍵字來定義一個類型名。而在右邊的定義中,C++編譯器認為struct定義了一種Student新類型。
面試中的小問題:
標識符:C語言中的預設類型是int,函數在定義時如果沒有給出參數或者傳回值,則預設為int,也就是中i預設為int,f的傳回值也預設為int。g的傳回值也預設為int,g預設接受任意參數。
這種預設類型在當代的軟體開發中是絕對不允許支援的,因為會引入二義性。因此,C++對這種預設類型進行了升級,使得int f() 和 int f(void)具有相同的意義。並且int f(void)這種寫法是為了相容C語言。
第2課 C到C++的升級