詳情介紹C++之命名空間
C++命名空間
1.概述
在c++中,名稱(name)可以是符號常量、變量、函數(shù)、結(jié)構(gòu)、枚舉、類和對象等等。工程越大,名稱互相沖突性的可能性越大。另外使用多個廠商的類庫時,也可能導(dǎo)致名稱沖突。為了避免,在大規(guī)模程序的設(shè)計中,以及在程序員使用各種各樣的C++庫時,這些標(biāo)識符的命名發(fā)生沖突,標(biāo)準(zhǔn)C++引入關(guān)鍵字namespace(命名空間/名字空間/名稱空間),可以更好地控制標(biāo)識符的作用域。
因此:命名空間的出現(xiàn)就是為了解決名稱沖突問題
2.格式
namespace 空間名稱
{
變量名稱
.....
函數(shù)聲明
.....
}
3.定義范圍
#include <iostream>
using namespace std;
namespace test#這是正確的命名形式
{
.....
}
int main()
{
namespace test01 #這是錯誤的命名形式
{
}
....
}
結(jié)論:命名空間只能在全局范圍內(nèi)定義
4.瀑布式開發(fā)格式
命名空間名稱相同就是同一個命名空間
#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.權(quán)限
命名空間不存在私有的概念,都是共有的。
這個也很好理解,因為命名空間的出現(xiàn)就是為了解決名稱沖突的問題。僅僅只是解決這個問題而已。
8.匿名命名空間
原則上禁止使用匿名命名空間,出現(xiàn)匿名命名空間這總機(jī)制就是為了解決名稱沖突
在了解上面的基礎(chǔ)之上,我們再來講述下面的語法規(guī)則
匿名命名空間中定義的變量等同于全局變量,但是再背顯式調(diào)用的時候,使用原生全局變量
相信大家看到這句話會覺得很絕望,但是呢,編程就是這樣,直接看代碼就對了。
#include <iostream>
using namespace std;
int a = 10;
namespace #這就是匿名命名空間
{
int a = 20;
}
int main()
{
cout << a <<endl;
.....
}
大家猜一下,上面的結(jié)果是什么?是10 還是 20
結(jié)果是編譯不通過?。?!提示是:變量a是不明確的符號
正如上面所說,匿名空間中定義的變量等同于全局變量,那不就相當(dāng)于定義了兩個相同名稱的全局變量。那不就重定義了嗎
Attention:C++中不存在變量的定義和聲明
如果要想引用全局變量,那就是如下所示
#include <iostream>
using namespace std;
int a = 10;
namespace #這就是匿名命名空間
{
int a = 20;
}
int main()
{
cout << ::a <<endl;
.....
}
大家猜一下,上面的結(jié)果是什么?是10還是20
結(jié)果是10?。?!
正如上面所說,如果變量a被調(diào)用,則被調(diào)用的是原生全局變量,那就是10。
我們說了,匿名命名空間中定義的變量就相當(dāng)于全局變量,意味著如果沒有定義原生全局變量,那么就可以像調(diào)用原生全局變量一樣調(diào)用匿名空間中的全局變量。
#include <iostream>
using namespace std;
namespace #這就是匿名命名空間
{
int a = 20;
}
int main()
{
cout << a <<endl; #調(diào)用原生全局變量的方式
.....
}
9.別名
#include <iostream>
using namespace std;
int a = 10;
namespace test
{
int a = 20;
}
namespace alise_test = test;#這就是給命名空間
int main()
{
cout << ::a <<endl;
.....
}
原則上是不推薦給標(biāo)準(zhǔn)命名空間起別名
#include <iostream>
using namespace std;
int a = 10;
namespace test
{
int a = 20;
}
namespace alise_std = std;#這是不建議的一種做法
int main()
{
cout << ::a <<endl;
.....
}
10.編程模型
使用命名空間的時候,最好還是遵循某種格式。不遵循這種方式也是可以的,對于我而言,準(zhǔn)許某種框架的目的在于簡便自己編碼。
namespace test
{
int a = 0;#變量名的定義
int add(int a , int b );
}
int test::add(int a , int b )
{
return a+b;
}
PS:命名空間中存放的是變量初始化、函數(shù)的聲明、類的聲明等等,而函數(shù)的定義
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命名空間中的符號的作用域在該語句之后,函數(shù)體之前
}
int main()
{
cout << a <<endl;
.....
}
Attention:如果沒有引用,命名空間里的代碼塊就不會被編譯
如果命名空間中有大量的符號,采用上面一種方法就不太妥當(dāng),因為實際使用到的符號也就那么幾個。
#include <iostream>
using namespace std;
namespace test
{
int a = 20;
}
using namespace test::a; #只使用test命名空間中的a變量
int main()
{
cout << a <<endl;
.....
}
到此這篇關(guān)于詳情介紹C++之命名空間的文章就介紹到這了,更多相關(guān)C++命名空間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談CMake配置OpenCV 時靜態(tài)鏈接與動態(tài)鏈接的選擇
下面小編就為大家?guī)硪黄獪\談CMake配置OpenCV 時靜態(tài)鏈接與動態(tài)鏈接的選擇。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
C語言實現(xiàn)通訊錄系統(tǒng)課程設(shè)計
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)通訊錄系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07
C/C++最短路徑算法之迪杰斯特拉Dijkstra的實現(xiàn)詳解
Dijkstra(迪杰斯特拉)算法是典型的單源最短路徑算法,用于計算一個節(jié)點到其他所有節(jié)點的最短路徑。本文將詳解該算法的圖解與實現(xiàn),需要的可以參考一下2022-07-07

