C++對C的擴充套件與增強
阿新 • • 發佈:2019-01-01
C++對C的擴充套件
1. 雙冒號::作用域運算子
程式碼中對同一個變數多次宣告,在程式碼塊中使用時,區域性變數會將全域性變數隱藏。若在程式碼塊使用變數前新增::,表示為全域性變數。
::表示作用域運算子,如常見的std::cout,std::endl;等,表示cout和endl是std作用域下的識別符號。
2. 名稱空間namespace
主要用來解決命名衝突的問題,如多個人開發的不同模組中使用了相同的變數名和函式名,fatal error LNK1169:找到一個或多個重定義的符號,這時可以使用名稱空間,將不同的模組分隔開。
1 namespace QGY{ 2 inta; 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 }