詳情介紹C++之命名空間
C++命名空間
1.概述
在c++中,名稱(name)可以是符號常量、變量、函數、結構、枚舉、類和對象等等。工程越大,名稱互相沖突性的可能性越大。另外使用多個廠商的類庫時,也可能導致名稱沖突。為瞭避免,在大規模程序的設計中,以及在程序員使用各種各樣的C++庫時,這些標識符的命名發生沖突,標準C++引入關鍵字namespace(命名空間/名字空間/名稱空間),可以更好地控制標識符的作用域。
因此:命名空間的出現就是為瞭解決名稱沖突問題
2.格式
namespace 空間名稱 { 變量名稱 ..... 函數聲明 ..... }
3.定義范圍
#include <iostream> using namespace std; namespace test#這是正確的命名形式 { ..... } int main() { namespace test01 #這是錯誤的命名形式 { } .... }
結論:命名空間隻能在全局范圍內定義
4.瀑佈式開發格式
命名空間名稱相同就是同一個命名空間
#include <iostream> using namespace std; namespace test { .... } namespace test #名稱相同就是同一個命名空間 { ....... } int main() { ........ }
5.命名空間的訪問方式
5.1空間名::變量名
#include <iostream> using namespace std; namespace test { int a = 10; } int main() { cout << test::a<<endl; ..... }
5.2using namespace 空間名
#include <iostream> using namespace std; namespace test { int a = 10; } using namespace test;#需要在命名空間定義之後 int main() { cout <<a<<endl; ..... }
需要註意的是:
在使用該語法時,需要在命名空間定義之後,否則會提示找不到。
6.命名空間可以無限嵌套
#include <iostream> using namespace std; namespace test01 { namespace test02 { namespace test { int a = 10; } } } using namespace test01::test02::test;#如果采用第二種方式的話就需要這樣聲明 int main() { cout << a << endl; }
7.權限
命名空間不存在私有的概念,都是共有的。
這個也很好理解,因為命名空間的出現就是為瞭解決名稱沖突的問題。僅僅隻是解決這個問題而已。
8.匿名命名空間
原則上禁止使用匿名命名空間,出現匿名命名空間這總機制就是為瞭解決名稱沖突
在瞭解上面的基礎之上,我們再來講述下面的語法規則
匿名命名空間中定義的變量等同於全局變量,但是再背顯式調用的時候,使用原生全局變量
相信大傢看到這句話會覺得很絕望,但是呢,編程就是這樣,直接看代碼就對瞭。
#include <iostream> using namespace std; int a = 10; namespace #這就是匿名命名空間 { int a = 20; } int main() { cout << a <<endl; ..... }
大傢猜一下,上面的結果是什麼?是10 還是 20
結果是編譯不通過!!!提示是:變量a是不明確的符號
正如上面所說,匿名空間中定義的變量等同於全局變量,那不就相當於定義瞭兩個相同名稱的全局變量。那不就重定義瞭嗎
Attention:C++中不存在變量的定義和聲明
如果要想引用全局變量,那就是如下所示
#include <iostream> using namespace std; int a = 10; namespace #這就是匿名命名空間 { int a = 20; } int main() { cout << ::a <<endl; ..... }
大傢猜一下,上面的結果是什麼?是10還是20
結果是10!!!
正如上面所說,如果變量a被調用,則被調用的是原生全局變量,那就是10。
我們說瞭,匿名命名空間中定義的變量就相當於全局變量,意味著如果沒有定義原生全局變量,那麼就可以像調用原生全局變量一樣調用匿名空間中的全局變量。
#include <iostream> using namespace std; namespace #這就是匿名命名空間 { int a = 20; } int main() { cout << a <<endl; #調用原生全局變量的方式 ..... }
9.別名
#include <iostream> using namespace std; int a = 10; namespace test { int a = 20; } namespace alise_test = test;#這就是給命名空間 int main() { cout << ::a <<endl; ..... }
原則上是不推薦給標準命名空間起別名
#include <iostream> using namespace std; int a = 10; namespace test { int a = 20; } namespace alise_std = std;#這是不建議的一種做法 int main() { cout << ::a <<endl; ..... }
10.編程模型
使用命名空間的時候,最好還是遵循某種格式。不遵循這種方式也是可以的,對於我而言,準許某種框架的目的在於簡便自己編碼。
namespace test { int a = 0;#變量名的定義 int add(int a , int b ); } int test::add(int a , int b ) { return a+b; }
PS:命名空間中存放的是變量初始化、函數的聲明、類的聲明等等,而函數的定義
11.using語法使用
using namespace 空間名;
這個語句可以在程序中的任何一個地方使用
#include <iostream> using namespace std; namespace test { int a = 20; } using namespace test; #test命名空間中的符號的作用域在該語句之後,該源文件之前 void hello(void) { using namespace test;#test命名空間中的符號的作用域在該語句之後,函數體之前 } int main() { cout << a <<endl; ..... }
Attention:如果沒有引用,命名空間裡的代碼塊就不會被編譯
如果命名空間中有大量的符號,采用上面一種方法就不太妥當,因為實際使用到的符號也就那麼幾個。
#include <iostream> using namespace std; namespace test { int a = 20; } using namespace test::a; #隻使用test命名空間中的a變量 int main() { cout << a <<endl; ..... }
到此這篇關於詳情介紹C++之命名空間的文章就介紹到這瞭,更多相關C++命名空間內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!