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

名字空間嵌套
一個名字空間包含另外一個名字空間 不能直接 using namespace 里層名字空間; 對于當前作用域而言是不可見
#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;//有兩個名字空間中都有x 因為它們對當前作用域沒有優(yōu)先級關(guān)系 所以會有歧義
return 0;
}

using namespace 外層名字空間;
using namespace 里層名字空間;
using namespace 外層名字空間::里層名字空間;
注意: 如果用using namespace 名字空間;進行名字空間聲明當前作用域可見 如果不同的兩個作用域中含有相同名字和標識符,不訪問沒問題 但是如果用直接訪問,則會產(chǎn)生歧義 using namespace 名字空間; 進行聲明不會有歧義 using 名字空間名::標識符 可能會有歧義
舉個例子來說明
#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;//會有歧義
cout << s1::x << endl;
cout << s2::x << endl;
using s2::x; //導入到當前作用域
cout << x << endl;
cout << s1::x << endl;
//using s1::x;//當前作用域中有一個x了
return 0;
}
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Qt 數(shù)據(jù)庫QSqlDatabase使用示例
本文主要介紹了Qt數(shù)據(jù)庫QSqlDatabase使用示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-12-12
C語言中access/_access函數(shù)的使用實例詳解
本文通過實例代碼給大家介紹了C語言中access/_access函數(shù)的使用,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09
深入剖析設(shè)計模式中的組合模式應(yīng)用及在C++中的實現(xiàn)
這篇文章主要介紹了設(shè)計模式中的組合模式應(yīng)用及在C++中的實現(xiàn),組合模式可以清晰地反映出遞歸構(gòu)建樹狀的組合結(jié)構(gòu),需要的朋友可以參考下2016-03-03

