【1】“實用用性”增強
C語言中的變量都必須在作用域開始的位置定義!!
C++中更強調(diào)語言的“實用性”峦耘,所有的變量都可以在需要使用時再定義。
【2】 變量檢測增強
在C語言中旅薄,重復(fù)定義多個同名的全局變量是合法的
在C++中辅髓,不允許定義多個同名的全局變量
C語言中多個同名的全局變量最終會被鏈接到全局數(shù)據(jù)區(qū)的同?一個地址空間上
int g_var;
int g_var = 1;
C++直接拒絕這種?二義性的做法。
【3】struct 類型增強
C語言的struct定義了?一組變量的集合少梁,C編譯器并不認為這是?一種新的類型
C++中的struct是?一個新類型的定義聲明
【4】C++中所有變量和函數(shù)都必須有類型
C++中所有的變量和函數(shù)都必須有類型
C語言中的默認類型在C++中是不合法的
在C語言中
int f( )洛口;表示返回值為int,接受任意參數(shù)的函數(shù)
int f(void)凯沪;表示返回值為int的無參函數(shù)
在C++中
int f( );和int f(void)具有相同的意義第焰,都表示返回值為int的無參函數(shù)
C++更加強調(diào)類型,任意的程序元素都必須顯示指明類型
【5】新增bool類型關(guān)鍵字
C++在C語言的基本類型系統(tǒng)之上增加了bool
C++中的bool可取的值只有true和false
理論上bool只占用?一個字節(jié)妨马, 如果多個bool變量定義在?一起挺举,
可能會各占?一個bit,這取決于編譯器的實現(xiàn)
true代表真值烘跺,編譯器內(nèi)部用1來表?示
false代表?非真值湘纵,編譯器內(nèi)部用0來表?示
bool類型只有true(?非0)和false(0)兩個值
C++編譯器會在賦值時將?非0值轉(zhuǎn)換為true,0值轉(zhuǎn)換為false
【6】 三目運算符功能增強
- C語言返回變量的值 C++語言是返回變量本身
C語言中的三目運算符返回的是變量值滤淳,不能作為左值使用
C++中的三目運算符可直接返回變量本身梧喷,因此可以出現(xiàn)在程序的任何地方- 注意:三目運算符可能返回的值中如果有一個是常量值,則不能作為左值使用
(a < b ? 1 : b )= 30;
- C語言如何支持類似C++的特性呢脖咐?
當左值的條件:要有內(nèi)存空間伤柄;C++編譯器幫助程序員取了一個地址而已,c可如下*(a < b ? &a : &b )= 30;
【7】 const增強
- const為給讀代碼的人傳達非常有用的信息文搂,實際上适刀,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的。
- 通過給優(yōu)化器一些附加的信息煤蹭,使用關(guān)鍵字 const 也許能產(chǎn)生更緊湊的代碼笔喉。
- 合理地使用關(guān)鍵字 const 可以使編譯器很自然地保護那些不希望被改變的參數(shù)取视,防止其被無意的代碼修改。簡而言之常挚,這樣可以減少 bug 的出現(xiàn)
C++中的const常量類似于宏定義
const int c = 5; ≈ #define c 5
C++中的const常量與宏定義不同
const常量是由編譯器處理的作谭,提供類型檢查和作用域檢查
宏定義由預(yù)處理器處理,單純的文本替換
C++中的const修飾的奄毡,是一個真正的常量折欠,而不是C中變量(只讀)。在const修飾的常量編譯期間吼过,就已經(jīng)確定下來了
C語言中的const變量是只讀變量锐秦,有自己的存儲空間
C++中的const常量可能分配存儲空間,也可能不分配存儲空間
當const常量為全局,并且需要在其它文件中使用盗忱,會分配存儲空間
當使用&操作符酱床,取const常量的地址時,會分配存儲空間
當const int &a = 10; const修飾引用時趟佃,也會分配存儲空間
【問題】:那有如何解釋取地址扇谣,編譯過程中若發(fā)現(xiàn)對const使用了extern或者&操作符,則給對應(yīng)的常量分配存儲空間(為了兼容C)闲昭。C++編譯器雖然可能為const常量分配空間(進行&運算時候)罐寨,但不會使用其存儲空間中的值。
【8】 真正的枚舉
C語言中枚舉本質(zhì)就是整型,枚舉變量可以用任意整型賦值序矩。而C++中枚舉變量, 只能用被枚舉出來的元素初始化衩茸。