c 對C語言的擴充套件(一)

2021-09-12 01:44:55 字數 2725 閱讀 6478

(一) c++對c的加強:

1)命名空間:

為什麼要引入命名空間這個概念:乙個中大型軟體往往由多名程式設計師共同開發,會使用大量的變數和函式,不可避免地會出現變數或函式的命名衝突。當所有人的**都測試通過,沒有問題時,將它們結合到一起就有可能會出現命名衝突。

例如小李和小韓都參與了乙個檔案管理系統的開發,它們都定義了乙個全域性變數 fp,用來指明當前開啟的檔案,將他們的**整合在一起編譯時,很明顯編譯器會提示 fp 重複定義(redefinition)錯誤。

為了解決合作開發時的命名衝突問題,c++ 引入了命名空間(namespace)的概念。

命名空間將全域性作用域分成不同的部分

不同命名空間中的識別符號可以同名而不會發生衝突

命名空間可以相互巢狀

全域性作用域也叫預設命名空間

怎樣使用命名空間:

1°命名空間的定義:

/**namespace 是c++中的關鍵字,用來定義乙個命名空間,語法格式為:

namespace name

name是命名空間的名字,它裡面可以包含變數、函式、類、typedef、#define 等,最後由包圍 

**/// 定義乙個命名空間,名字叫namespacea

namespace namespacea

// 命名空間的定義可以巢狀

namespace namespaceb;}

}2°命名空間的使用:

1°使用域解析符(::):// ::是乙個新符號,稱為域解析操作符,在c++中用來指明要使用的命名空間。

namespacea::a = 10;   // 使用命名空間 namespacea中的變數a

namespaceb::a = 20;   // 使用命名空間 namespaceb中的變數a

printf ("%d, %d\n", namespacea::a, namespaceb::a);

使用命名空間b中的命名空間c中的結構體 teacher

namespaceb::namespacec::teacher t2 = ;

3°使用using宣告:在這裡用using宣告了 namespacea::a, 它的意思是在宣告以後的程式中如果出現

未指明命名空間的a,就使用namespacea命名空間裡的a

如果要使用namespaceb命名空間中的a,則仍需要使用這樣的方式 namespaceb::a;

using namespacea::a;

a = 20;                // 使用命名空間namespacea中的a

namespaceb::a = 30;    // 使用命名空間namespaceb中的a

using 宣告不僅可以針對命名空間中的變數或者函式,還可以對整個命名空間進行宣告

這樣的方式宣告命名空間以後,在後面使用未指定具體命名空間的變數或者函式產生命名衝突的時候

預設使用 namespaceb中的變數和函式

using namespace namespaceb;

a = 10;

printf ("%d\n", namespaceb::a);

4°c++標準庫和std命名空間: c++ 引入了命名空間的概念,計畫重新編寫庫,將類、函式、巨集等都統一納入乙個命名空間,這個命名空間的名字就是std。std 是 standard 的縮寫,意思是「標準命名空間」,可以發現,對於不帶.h的標頭檔案,所有的符號都位於命名空間 std 中,使用時需要宣告命名空間 std;對於帶.h的標頭檔案,沒有使用任何命名空間,所有符號都位於全域性作用域。這也是 c++ 標準所規定的。

2)實用性增強:c語言中的變數都必須在作用域開始的位置定義!!

c++中更強調語言的「實用性」,所有的變數都可以在需要使用時再定義。

3)register關鍵字的變化:register關鍵字請求「編譯器」將區域性變數儲存於暫存器中 c語言中無法取得register變數位址

在c++中依然支援register關鍵字:

1、c++編譯器有自己的優化方式,不使用register也可能做優化

2、c++中可以取得register變數的位址

c++編譯器發現程式中需要取register變數的位址時,register對變數的宣告變得無效。

5)struct的加強:  

1、c語言中 struct 定義了一組資料的集合,而不是一種新的資料型別 所以在定義變數的時候需要在前面加上 struct 關鍵字進行修飾

2、 c++中 struct 定義了一種新的資料型別,可以直接用來定義變數

6)c++中所有變數和函式都必須要有型別:

1、在c語言中

int f(    );表示返回值為int,接受任意引數的函式

int f(void);表示返回值為int的無參函式

2、在c++中

int f(  );和int f(void)具有相同的意義,都表示返回值為int的無參函式

c++更加強調型別,任意的程式元素都必須顯示指明型別

7)新增bool型別關鍵字: 

1、  bool型別只有true(非0)和false(0)兩個值

2、 c++編譯器會在賦值時將非0值轉換為true,0值轉換為false

8)三目運算子的增強:

1、c語言返回變數的值 c++語言是返回變數本身

c語言中的三目運算子返回的是變數值,不能作為左值使用

c++中的三目運算子可直接返回變數本身,因此可以出現在程式的任何地方

2、注意:三目運算子可能返回的值中如果有乙個是常量值,則不能作為左值使用

(a < b ? 1 : b )= 30;

C 對C的擴充套件

1.c 會對函式返回值型別和引數個數進行檢測 c語言預設為返回值為int,引數個數不做檢查 2.c 在定義結構體變數時,關鍵字struct可以省略,結構體名不能省 3.在全域性中定義 int val g bss段 全是0 在全域性中 int val g 20 data c正確 2是賦值 c 錯誤 重...

C 對C的擴充套件

c 是c語言的加強,是一種更好的c語言 c 是以c語言為基礎的,並且完全相容c語言的特性 c語言 物件導向方 objective c c c 以c語言為基礎 物件導向支援 型別加強 函式加強 異常處理 標準格式 namespace namec中的命名空間 在c語言中只有乙個全域性作用域 c語言中所有...

c 對c的擴充套件

1 c 對型別檢查比c語言更為嚴格。如 demo1.c char p malloc 100 c語言可以通過,c 報錯 char p char malloc 100 正確 demo2.c const int a 100 int p a c語言警告,c 直接報錯 const int p a 正確 dem...