C++深度剖析教程2 --- C語言到C++的進階
C語言和c++的關係
1.c++繼承所有的C語言特性
2.c++在C語言的額基礎上提供了更多的語法與特性
3.c++的設計目標就是執行效率和開發效率的統一
主要新增的那些呢?
型別,函式加強 ,異常處理
一個升級;
1.c++更強調語言的實用性
2.所有的變數都可以在需要使用的時候再定義
C語言都是在作用域內進行定義!
for(int i=1; i<=3; i++) //直接在迴圈判斷新增內定義,這在C語言是不存在的特性 { for(int j=1; j<=3; j++) { c += i * j; } }
第二個升級
register關鍵字請求編譯器將區域性變數儲存於暫存器中
---在C語言中依然支援register關鍵字,但是優化可能已經放入裡面了,還有就是請求級別低,編譯器完全可以拒絕
---c++編譯器有自己的優化方式,但是這個關鍵字基本是看不到的
C語言中無法獲得register變數的地址
c++可以獲得register變數的地址
---在老版本的c++編譯器中需要獲取register變數的地址時,register對變數的宣告變得無效,但是現代的版本基本看不見register了
---早起C語言編譯器不會對程式碼進行優化,全是手工進行,register就是一個很好的補充
第三升級
1.在C語言中,重複定義多個同名的全域性變數是合法的
2.但是,在c++中,不允許定義多個同名的全域性變數
C語言中多個同名的全域性變數最終會被連結到全域性資料區的同一個地址空間上
例項1:幾個升級的實際程式碼
#include <stdio.h> int g_v; //int g_v; int main(int argc, char *argv[]) { printf("Begin...\n"); int c = 0; //區別 for(int i=1; i<=3; i++) //區別 { for(int j=1; j<=3; j++) { c += i * j; } } printf("c = %d\n", c); register int a = 0; printf("&a = %p\n", &a); //在c++是合法的,可以直接取地址,因為之前的規則是取地址都是針對記憶體來說的 printf("End...\n"); return 0; }
第四升級
struct關鍵字的加強
---C語言中的struct定義了一組變數的集合
---C語言中的struct定義的識別符號並不是一種新的型別
---c++的struct用於定義一個全新的型別
C語言和C++的結構的等價定義
typedef struct _tag_student Student; //C語言必須宣告才可以使用
struct _tag_student
{
const char* name;
int age;
};
struct Student //c++直接就可以,更簡便
{
const char* name;
int age;
};
C++有一個重要的升級
1.c++所有的識別符號都必須顯示的宣告型別 --- c++對識別符號是更加嚴格的
2.C語言中的預設型別在c++中是不合法
f(i)
{
printf("i = %d\n",i)
}
g()
{
return 5;
}
引出的問題是:
1.函式f的返回值與引數分別是什麼型別的?
2.函式g可以接受多少個引數?
答:需要看使用什麼編譯器編譯
若是C語言 int型別,引數為任意多個 ,後者是不接受任何引數
若是c++,編譯器認為是沒有區別的
實驗2:C語言到c++的升級
#include <stdio.h>
struct Student
{
const char* name;
int age;
};
f(i)
{
printf("i = %d\n", i);
}
g()
{
return 5;
}
int main(int argc, char *argv[])
{
Student s1 = {"Delphi", 30};
Student s2 = {"Tang", 30};
f(10);
printf("g() = %d\n", g(1,2,3,4,5));
return 0;
}
小結:
1.c++更強調實用性,可以在任意的地方宣告變數
2.c++中的register只是一個相容的作用
3.c++編譯器能夠更好的進行優化
4.c++中的任意表示符都必須顯示的指明型別