C 對C的擴充套件 增強

2022-04-27 14:56:30 字數 4212 閱讀 5298

c++對c的擴充套件

1. 雙冒號::作用域運算子

**中對同乙個變數多次宣告,在**塊中使用時,區域性變數會將全域性變數隱藏。若在**塊使用變數前新增::,表示為全域性變數。

::表示作用域運算子,如常見的std::cout,std::endl;等,表示cout和endl是std作用域下的識別符號。

2. 命名空間namespace

主要用來解決命名衝突的問題,如多個人開發的不同模組中使用了相同的變數名和函式名,fatal error lnk1169:找到乙個或多個重定義的符號,這時可以使用命名空間,將不同的模組分隔開。

1

namespace

qgy;

7class

qgynum{};

8 }

使用命名空間的注意事項:(1)必須在全域性作用域下宣告;(2)命名空間下可以放函式,變數、結構體和類;(3)命名空間可以巢狀命名空間;(4)命名空間是開放的,可以隨時加入新成員(新增時只需要再次宣告namespace,然後新增新成員即可,示例如下);(5)無名或匿名命名空間,相當於static變數;(6)可以對命名空間起別名(一般不用)

namespace qgy
3. using宣告和using編譯指令

using qgy::a; //宣告

using namespace qgy; //編譯指令

對於宣告來說,如果區域性範圍內還有a,會出現二義性,程式不知道使用哪乙個,因此應避免這種情況.

1

void

test01()

這裡程式會出現錯誤, error c2874: using 宣告導致「qgy::a」的多次宣告。

對於編譯指令,如果區域性範圍還有a,會使用區域性變數。如果還有另外的命名空間也宣告了a,且同時開啟了其他空間,則也會出現二義性。

1

void

test02()

1

void

test03()

c++對c的增強1.全域性變數檢測增強c語言會忽略對全域性變數重定義的檢測,但不會忽略對區域性變數的檢測,c++中都會報錯:error c2086: 「int a」: 重定義

//全域性變數不會報錯

int a;

int a = 10;

//區域性變數會報錯

void test()

2.函式檢測增強:包括函式形參型別檢測,形引數目檢測,函式返回值檢測,c都會忽略,c++不會

1

//c中函式形參沒有引數型別,沒有返回值,呼叫引數過多都會忽略

2int

test(m, n)56

void

test01()

3.型別轉換檢測增強c語言中malloc開闢記憶體空間時預設生成void*指標,可以轉換成任意指標,c++中則不行,必須顯式的進行強制轉換。

4.struct增強

(1)c中strcut中不能有函式,c++中可以有,並且與class的區別在於是否有私有成員,和是否有建構函式;

(2)通過如下方式宣告struct時,c語言定義使用結構體時必須使用struct,c++可以不用。

1

struct

person;45

struct person myperson; //

c6 person myperson; //

c++

5.bool型別增強c語言中沒有bool型別,c++中有bool型別,其中sizeof(bool)=1

6.三目運算子增強

1 a > b?a : b;

c語言中返回的是值,c++中返回的是變數,c語言中下面**會報錯:error c2106: 「=」: 左運算元必須為左值,表明**中為20=100,所以會報錯。

1

void

test01()

如果想改變三目運算子後的結果,可以按照如下**進行修改

1 *(a > b? &a:&b) = 100;

c++則不會,因為c++三目運算後為變數,因此可以進行賦值操作,其中a  = 10, b = 100;

1

void

test01()

另外下面三種情況下的a和b的值是不同的

1

//a=100, b=20

2 (a < b ? a : b) = 100;3

4//a=10, b=100

5 (a > b ? a : b) = 100;6

7//a=10, b=20

8 a < b ? a : b = 100;

最後一種情況,不會執行b=100,其中帶括號的是按照我們的想法去執行**,不帶括號的話,優先順序不同導致結果和預想的不同。

7.const增強

(1)是否可以修改

c語言中的全域性const不可修改,是真常量,如果對其修改會出現訪問衝突,另外不可以宣告陣列的大小(這是c的缺陷,也是為什麼替代不了define);區域性const為偽常量,可以進行修改,同時不可以用於宣告陣列的大小(真假都不可以宣告陣列的大小)。

1

const

int m = 0; //

全域性靜態變數受到保護,不可修改

(2)鏈結屬性

c語言的const預設是外部鏈結,c++預設是內部鏈結

1

2const

int a = 10; 3

4//2.cpp

5extern

const

int a;

c語言中進行訪問時可以的,但c++中需要在1.cpp的宣告前加extern否則無法使用

(3)const分配記憶體

是否分配記憶體,我們可以根據const修飾的變數是否能夠修改來確定。

編譯器通常不為普通const常量分配儲存空間,而是將它們儲存在符號表中,這使得它成為乙個編譯期間的常量,沒有了儲存與讀記憶體的操作,使得它的效率也很高

,但是在下列幾種情況下編譯器會為const定義的常量分配記憶體的。

(3.1)取位址時,const會分配臨時記憶體,不可以進行間接修改

1

void

test003()

(3.2)extern編譯器也會為變數分配記憶體

因為使用了extern,我們將可能在外部檔案使用該變數,而const預設的是內部鏈結,所以我們必須要為之分配記憶體的。

(3.3)用普通變數初始化const變數,會分配記憶體

1

void

test003()

(3.4)自定義資料,加const也會分配記憶體

1

struct

person;45

void

test004();//

分配記憶體,且可以跳過編譯器檢測進行間接修改

78 person *b = (person*)&person;

9 (*b).age = 20

;10 cout << (*b).age <

11 }

(4)盡量用const替換define

對於常量,盡量替換因為const有資料型別檢查和作用域。另外define用於巨集定義時,可以用undef進行解除。但是對於有些條件編譯時需要define,則不能替換。

define是應用於預處理的,而const是在編譯的時候處理的。對於單純常量,使用const與enum代替巨集,對於函式形式的巨集,則使用inline與template替代。

c 對c的增強

include using namespace std cout helloworld 命名空間下,可以放函式,變數,結構體,類.命名空間必須定義在全域性作用域下 命名空間可以巢狀命名空間 命名空間是開放的,可以隨時往原先的命名空間新增內容 無名,匿名命名空間 當寫了無名命名空間,相當於寫了stat...

c 對c的增強

本文主要介紹c 對c語言所增強的內容c語言中的變數都必須在作用域開始的位置進行定義 c 中強調語言的 實用性 所有的變數都可以在需要的時候進行定義 c語言的struct定義了一組變數的集合,c編譯器不認為這是一種資料型別 c 中的struct是乙個新型別的定義宣告 在c語言中 int f 表示返回值...

c 對c的拓展 增強

一 新增bool型別關鍵字 c中bool型別需要新增stdbool.h標頭檔案,c 則可直接使用 void test bool a true c 可直接定義而c需新增標頭檔案 true和false可直接用做常量使用 二 三目運算子 c 中返回的可以是個變數,但c語言中返回的表示式的值是乙個常量 vo...