C++ 命名空間--namespace總結(jié)
定義
namespace 名字空間的名字{
全局變量
類型定義
函數(shù)
}
意義
對(duì)于一個(gè)較大型的C++程序來說,需要由多個(gè)程序員相互協(xié)作編寫,這樣的情況下容易出現(xiàn)不同程序員在需要負(fù)責(zé)的程序部分使用相同名字的變量或函數(shù),導(dǎo)致程序合并后出現(xiàn)問題。名字空間的作用,就是將不同程序員編譯的程序放入相應(yīng)的名字空間,每個(gè)名字空間相對(duì)獨(dú)立,空間內(nèi)的變量和函數(shù)名只局限于當(dāng)前空間下,從而解決命名沖突的問題。
名字空間的三種使用方法
(1)作用域限定符 名字空間名::標(biāo)識(shí)符 表示明確訪問是特定名字空間中的特定標(biāo)識(shí)符 最麻煩 (2)名字空間指令 using namespace 名字空間名; 該語(yǔ)句可以在任何地方 表示在該指令之后,對(duì)指令所指的名字空間中所有標(biāo)識(shí)符對(duì)當(dāng)前作用域都可見 接下來都可以直接訪問名字空間中的標(biāo)識(shí)符,不需要加"名字空間名::" 當(dāng)然也可以加 *對(duì)當(dāng)前作用域可見 (3)名字空間聲明 using 名字空間::標(biāo)識(shí)符 將指定名字空間中的某個(gè)標(biāo)識(shí)符(成員)引入到當(dāng)前作用域,可以直接訪問 *導(dǎo)入到當(dāng)前作用域
#include <iostream>
using namespace std;
//定義名字空間
namespace wd1{
int g = 1024;
void func(void){
cout << "func" << endl;
}
struct Stu{
int no;
char name[40];
};
}
int main(){
using wd1::g;
cout << g << endl;
cout << wd1::g << endl;
wd1::func();
struct wd1::Stu s = {};
using namespace wd1;
cout << g << endl;
func();
struct Stu s2 = {};
return 0;
}
/*using wd1::g;
cout << g << endl;
和
cout << wd1::g << endl;
就只是其中的兩種定義方法,兩個(gè)是等價(jià)的*/
匿名空間
編譯器為沒有指明名字空間的全局區(qū)的標(biāo)識(shí)符置于匿名名字空間中 如果要指明訪問匿名名字空間中的標(biāo)識(shí)符 直接用 ::標(biāo)識(shí)符 匿名的命名空間是C++的特性,相對(duì)于C的static聲明來說, 可以在匿名的空間里面聲明很多 變量和函數(shù),這樣可以省去了對(duì)每個(gè)變量和函數(shù)添加static聲明. 實(shí)質(zhì)上匿名空間的功能跟static聲明是一樣的
#include <iostream>
using namespace std;
//如果一個(gè)全局的標(biāo)識(shí)符沒有指定名字空間,編譯器將會(huì)為其缺省地置于匿名名字空間中
int gv = 1024;
int main(){
cout << gv << endl;
cout << ::gv << endl; //訪問指定名字(匿名名字)空間中的標(biāo)識(shí)符
int gv = 9527;
cout << gv << endl;//訪問局部的 局部?jī)?yōu)先原則 同名的局部變量會(huì)隱藏同名的全局變量
cout << ::gv << endl;//訪問全局的
return 0;
}
名字空間合并
一個(gè)程序中,如果名字空間名字相同,則認(rèn)為是同一個(gè)名字空間 里面的標(biāo)識(shí)符會(huì)進(jìn)行合并
#include <iostream>
using namespace std;
namespace myspace{
int x = 1024;
void func(){
cout << "func" << endl;
}
}
namespace myspace{
int y = 9527;
void bar(){
cout << "bar" << endl;
}
}
int main(){
using namespace myspace;
cout << x << endl;
cout << y << endl;
func();
bar();
return 0;
}

名字空間嵌套
一個(gè)名字空間包含另外一個(gè)名字空間 不能直接 using namespace 里層名字空間; 對(duì)于當(dāng)前作用域而言是不可見
#include <iostream>
using namespace std;
//int x = 1;
namespace s1{
int x = 1024;
namespace s2{
int y = 9527;
namespace s3{
int z = 1314;
}
}
namespace s4{
int x = 520;
}
}
int main(){
using s1::x;
cout << x << endl;
cout << s1::x << endl;
//cout << y << endl;
cout << s1::s2::y << endl;
using s1::s2::y;
cout << y << endl;
using namespace s1;
using s2::y;
//using namespace s3;
using namespace s1::s2::s3;
cout << z << endl;
using namespace s4;
cout << x << endl;//有兩個(gè)名字空間中都有x 因?yàn)樗鼈儗?duì)當(dāng)前作用域沒有優(yōu)先級(jí)關(guān)系 所以會(huì)有歧義
return 0;
}

using namespace 外層名字空間;
using namespace 里層名字空間;
using namespace 外層名字空間::里層名字空間;
注意: 如果用using namespace 名字空間;進(jìn)行名字空間聲明當(dāng)前作用域可見 如果不同的兩個(gè)作用域中含有相同名字和標(biāo)識(shí)符,不訪問沒問題 但是如果用直接訪問,則會(huì)產(chǎn)生歧義 using namespace 名字空間; 進(jìn)行聲明不會(huì)有歧義 using 名字空間名::標(biāo)識(shí)符 可能會(huì)有歧義
舉個(gè)例子來說明
#include <iostream>
using namespace std;
namespace s1{
int x = 1111;
}
namespace s2{
int x = 9527;
}
int main(){
cout << s1::x << endl;
cout << s2::x << endl;
using namespace s1;
cout << x << endl;
using namespace s2;
// cout << x << endl;//會(huì)有歧義
cout << s1::x << endl;
cout << s2::x << endl;
using s2::x; //導(dǎo)入到當(dāng)前作用域
cout << x << endl;
cout << s1::x << endl;
//using s1::x;//當(dāng)前作用域中有一個(gè)x了
return 0;
}
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu) 串的基本操作實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04
C 語(yǔ)言基礎(chǔ)之C 語(yǔ)言三大語(yǔ)句注意事項(xiàng)
今天講解的內(nèi)容,則是自己對(duì)于這三種語(yǔ)句一些細(xì)節(jié)的簡(jiǎn)單介紹,分支語(yǔ)句:if,switch、循環(huán)語(yǔ)句:while,for,do while、goto語(yǔ)句,感興趣的小伙伴可以參考下面具體的文章內(nèi)容2021-09-09

