1. 程式人生 > >C++對C的擴充套件與增強

C++對C的擴充套件與增強

C++對C的擴充套件

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

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

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

2. 名稱空間namespace

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

1 namespace QGY{
2     int
a; 3 void test(); 4 struct QGYTEST{ 5 int b; 6 }; 7 class QGYNUM{}; 8 }

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

namespace QGY{
	int m ;
}

3. using宣告和using編譯指令

using QGY::a; //宣告
using namespace QGY; //編譯指令

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

1 void test01(){
2     int a = 10;
3     using QGY::a; //這裡在宣告的時候不能進行賦值,可以在下一行,a = 20;
4     std::cout << a << std::endl;
5 }

這裡程式會出現錯誤, error C2874: using 宣告導致“QGY::a”的多次宣告。

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

1 void test02(){
2     int a = 10;
3     using namespace QGY; //這裡只是開啟空間,並沒有指定使用
4     std::cout << a << std::endl;
5 }
1 void test03(){
2     using namespace QGY; //只是開啟房間就可以訪問到a,開啟多個房間就會產生二義性
3     std::cout << a << std::endl;
4 }

C++對C的增強

 1.全域性變數檢測

C語言會忽略對全域性變數重定義的檢測,但不會忽略對區域性變數的檢測,C++中都會報錯:error C2086: “int a”: 重定義

//全域性變數不會報錯
int a;
int a = 10;

//區域性變數會報錯
void test(){
	int a;
	int a = 10;
}

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

1 //C中函式形參沒有引數型別,沒有返回值,呼叫引數過多都會忽略
2 int test(m, n){
3 
4 }
5 
6 void test01(){
7     test(1,2,3);
8 }