C++中的命名空間namespace

技術交流QQ群:1027579432魔种,歡迎你的加入掸屡!

1.Cpp中的命名空間

  • 假設這樣一種情況封寞,當一個班上有兩個名叫Zara的學生時,為了明確區(qū)分它們仅财,我們在使用名字之外狈究,不得不使用一些額外的信息,比如他們的家庭住址盏求,或者他們父母的名字等等抖锥。同樣的情況,在C++程序中碎罚,可能會寫一個xyz()的函數(shù)磅废,而在另一個可用的庫中也存在一個同名的函數(shù)xyz()。這樣魂莫,編譯器就無法判斷我們到底使用的是哪一個xyz()函數(shù)还蹲。因此,引入命名空間這個概念用于解決上面的問題耙考,它可以作為附加信息來區(qū)分不同庫中相同名稱的函數(shù)谜喊、類、變量等倦始。使用了命名空間即定義了上下文斗遏,本質上就是定義了一個范圍

2.定義命名空間

  • 命名空間的定義使用關鍵字namespace,后面接著命名空間的名字鞋邑,如下所示:
        namespace 命名空間的名字{
            // 代碼聲明
        }
    
  • 為了調用帶有命名空間的函數(shù)或變量诵次,需要在前面加上命名空間的名字,如下所示:
        命名空間的名字::code;   // code可以是變量或函數(shù)
    
  • 使用命名空間為變量或函數(shù)等實體定義范圍:
        #include "iostream"
    
        using namespace std;
    
        // 第一個命名空間
        namespace first_space{
            void func(){
                cout << "I come from frist space.\n";
            }
        }
    
        // 第二個命名空間
        namespace second_space{
            void func(){
                cout << "I come from second space.\n";
            }
        }
    
        int main(){
            // 調用第一個命名空間中的函數(shù)
            first_space::func();
            // 調用第二個命名空間中的函數(shù)
            second_space::func();
            return 0;
        }
    

3.using指令

  • 可以使用using namespace指令枚碗,這樣在使用命名空間時就可以不用在前面加上命名空間的名稱逾一。這個指令會告訴編譯器,后續(xù)的代碼將使用指定的命名空間中的名稱肮雨,實例見下面:
        #include "iostream"
    
        using namespace std;   // 使用標準命名空間
    
        // 第一個命名空間
        namespace first_space{
            void func(){
                cout << "I come from frist space.\n";
            }
        }
    
        // 第二個命名空間
        namespace second_space{
            void func(){
                cout << "I come from second space.\n";
            }
        }
    
        // 第三個命名空間
        namespace third_space{
            void func(){
                cout << "I come from third space.\n";
            }
        }
    
        using namespace third_space;  // 注意這一句W穸隆!!
    
        int main(){
            // 調用第一個命名空間中的函數(shù)
            first_space::func();
            // 調用第二個命名空間中的函數(shù)
            second_space::func();
            // 調用第三個命名空間中的函數(shù)
            func(); // 注意調用格式D八蕖N恪!
            return 0;
        }
    
  • using指令也可以用來指定命名空間中的特定項目壳坪。如果舶得,這只打算使用標準命名空間std中的cout部分,可以使用如下的語句:
        using std::cout;
    
  • 隨后的代碼中爽蝴,在使用cout時就可以不用加上命名空間的名字作為前綴沐批,但是std命名空間中的其他項目仍然需要加上命名空間的名字作為前綴,如:
        #include "iostream"
    
        using std::cout;
    
        int main(){
            cout << "hello world." << std::endl;   // 注意霜瘪,此處的std::endl與cout的格式區(qū)別V椴濉>寤恰颖对!
            return 0;
        }
    
  • using指令引入的命名空間的名字遵循正常的范圍規(guī)則,名字從使用using指令開始是可見的磨隘,直到該范圍結束缤底。此時,在范圍以外定義的同名實例是隱藏的番捂。

4.不連續(xù)的命名空間

  • 命名空間可以定義在幾個不同的部分中个唧。因此,命名空間是由幾個單獨定義的部分組成的设预。一個命名空間的各個組成部分可以分散在多個文件中徙歼。所以,如果命名空間中的某個組成部分需要請求定義在另一個文件中的名稱鳖枕,則仍然需要聲明該名稱魄梯。下面的命名空間定義可以是定義一個新的命名空間,也可以是為已有的命名空間增加新的元素:
        namespace 命名空間的名字{
            // 代碼聲明
        }
    

5.命名空間的嵌套

  • 命名空間可以嵌套宾符,可以在一個命名空間中定義另一個命名空間酿秸,如下所示:
        namespace 命名空間1的名字{
            // 代碼聲明
            namespace 命名空間2的名字{
                // 代碼聲明
            }
        }
    
  • 可以通過使用::運算符訪問嵌套的命名空間中的成員,如下所示:
        // 訪問命名空間2中的成員
        using namespace 命名空間1的名字::命名空間2的名字
        // 訪問命名空間1中的成員
        using namespace 命名空間1的名字
    
  • 上面的語句中魏烫,如果使用的是命名空間1,那么在該范圍內命名空間2中的元素也是可以使用的辣苏,如下所示:
        // 命名空間的嵌套
        namespace four_space{
            void fun(){
                cout << "I come from four space.\n";
            }
            namespace five_space{
                void fun(){
                    cout << "I come from five space.\n";
                }
            }
        }
    
        using namespace four_space::five_space;
        using namespace four_space;
    
        int main(){
            // 調用第二個命名空間中的函數(shù)
            fun();
            // 調用第二個命名空間中的函數(shù)
            five_space::fun();
            return 0;
        }
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哄褒,隨后出現(xiàn)的幾起案子稀蟋,更是在濱河造成了極大的恐慌,老刑警劉巖呐赡,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件退客,死亡現(xiàn)場離奇詭異,居然都是意外死亡罚舱,警方通過查閱死者的電腦和手機井辜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門绎谦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粥脚,你說我怎么就攤上這事窃肠。” “怎么了刷允?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵冤留,是天一觀的道長。 經(jīng)常有香客問我树灶,道長纤怒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任天通,我火速辦了婚禮泊窘,結果婚禮上,老公的妹妹穿的比我還像新娘像寒。我一直安慰自己烘豹,他們只是感情好,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布诺祸。 她就那樣靜靜地躺著携悯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筷笨。 梳的紋絲不亂的頭發(fā)上憔鬼,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機與錄音胃夏,去河邊找鬼轴或。 笑死,一個胖子當著我的面吹牛构订,可吹牛的內容都是我干的侮叮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悼瘾,長吁一口氣:“原來是場噩夢啊……” “哼囊榜!你這毒婦竟也來了?” 一聲冷哼從身側響起亥宿,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卸勺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后烫扼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曙求,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了悟狱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片静浴。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖挤渐,靈堂內的尸體忽然破棺而出苹享,到底是詐尸還是另有隱情,我是刑警寧澤浴麻,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布得问,位于F島的核電站,受9級特大地震影響软免,放射性物質發(fā)生泄漏宫纬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一膏萧、第九天 我趴在偏房一處隱蔽的房頂上張望漓骚。 院中可真熱鬧,春花似錦向抢、人聲如沸认境。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亩冬,卻和暖如春艘希,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背硅急。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工覆享, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人营袜。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓撒顿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荚板。 傳聞我的和親對象是個殘疾皇子凤壁,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內容