C++對C的增強:
學習工具:wxDev-C++(在VC++6.0中是不一樣的)
(1)const用法的變化:
在C語言程序中,const的用法可以是:
1 int main() 2 { 3 const int a = 5; 4 int *p = (int *)&a; 5 (*p) = 10; 6 return 0; 7 }
在這裡,a的值為5;(分配空間內存)
在C++中,const的用法是確實是常量的,它一般通過以下方法來完成:
1、當碰見常量聲明時在符號表中放入常量;
2、編譯過程若使用常量則直接以符號表中的值替換;
3、編譯過程中,若發現使用extern或&操作符,則給對應常量分配空間;(在這種情況下,C++才為變量分配內存)
注意:C++編譯器雖然可能為常量分配空間但是不使用常量
同樣上面的代碼在c++中,a的值為0;
可以說c語言中const是一個只讀變量,而在c++中const是一個常量;
const的引用:
const的引用可以用常量來進行初始化:
const int &a = 1; //不會報錯
const引用讓變量擁有只讀屬性;
1 int main() 2 { 3 const int &a = 1; 4 int *p = (int *)&a; 5 (*p) = 5; 6 return 0; 7 }
這時a的值會改變變為5;
我們知道引用是有其存儲空間的,Type + &a = Type * const a;相當於一個常指針的作用;
C++編譯器在編譯過程中使用常指針作為引用的內部實現,因此引用所占用的空間是存在的,可以認為是這個指針的空間(網上是存在爭議的)
但我認為C++的引用只是為了實用性做出的細節隱藏;
(2)變量的定義的變化
在c語言中
1 main() 2 { 3 int a = 0, b = 0; 4 int i = 10; 5 for(a=0; a<i; a++) 6 { 7 for(b=0; b<i; b++) 8 { 9 //執行內容 10 } 11 } 12 } 13 //其中a和b不能在循環體中定義
在C++中
main() { for(int a=0; a<10; a++) { //執行內容 } } //以上代碼在C++中是可以運行通過的,但是在c語言中是不行的
(3)register關鍵字的變化
在C語言中,register關鍵字無法取得其變量地址;而在C++中則可以做優化,取得register的關鍵字;
(4)函數參數的變化
在c語言中,f()可接受任何參數;
在C++中,f()和f(void)是一樣的;
(5)struct類型的增強
在C語言中,struct類型不屬於新的類型;
而在c++中,struct類型定義的類型屬於一種新的類型;