c++ namespace

學(xué)習(xí)c++的同學(xué)大概非常習(xí)慣在程序的開頭部分加上這句:

using namespace std;

可能由于太熟悉了络断,反而忽略了這句到底是做什么的劣像。這句中,一共有3個關(guān)鍵字橄仆,拋開第三個關(guān)鍵字std剩膘,我們只關(guān)注于前面的2個:using和namespace。
先說using盆顾,using一般來說有2個功能:
1 將std命名空間的內(nèi)容引入本命名空間怠褐,這句話很抽象,但是簡單說您宪,就是可以讓你少打幾個字奈懒。原來需要std::string這樣才能訪問的地方,可以簡化為string就可以了宪巨。當(dāng)你的命名空間很長很復(fù)雜時磷杏,using顯的很有用,比如:

namespace abcd
{
    namespace efgh
    {
        namespace ijk
        {
            class A;
        }
    }
}

如果你想訪問A捏卓,那么完整的寫法是:abcd::efgh::ijk::A极祸。
當(dāng)然了,不得不承認(rèn)怠晴,using的存在是和namespace的封裝思想相違背的遥金,所以在通常的編程規(guī)范里,嚴(yán)禁在頭文件中using命名空間蒜田。
2 使用父類被隱藏的函數(shù)稿械。比如:

class A
{
    public:
    int fun(int);
    void fun();
};

class B : public A
{
    public:
    using A::fun;
    int fun(double);
};

B b;
b.fun();//without using, error

這里面涉及c++繼承的隱藏,不展開物邑。

其實(shí)using的作用非常有限溜哮,而且通常情況下屬于那種可有可無的.....
而另一個關(guān)鍵字namespace,就相對來說重要的多色解,namespace的存在茂嗓,使得一些大型的項目開發(fā)變得相對容易,各個模塊可以非常完美的區(qū)分開來科阎,再也不用擔(dān)心和其他人的函數(shù)或者類重名述吸。
namespace的實(shí)現(xiàn)原理非常簡單,在編譯時,同一個命名空間的函數(shù)或者變量將在名字前增加命名空間名蝌矛,比如上文中我們的class A道批,在編譯后可能變成: abcd_efgh_ijk_A。
在自己的命名空間內(nèi)有個函數(shù)入撒,它正好和全局范圍內(nèi)的某個函數(shù)重名隆豹,比如:

int fun();  //global
namespace A
{
    int fun()
    {
        ::fun(); //call golbal fun
    }
} 

前面的這些基本上都是鋪墊......
接下來才是重點(diǎn)....

我們在編寫一個類的時候,經(jīng)常會在這個類中用到其他類的一些信息茅逮,比如:

// a.h
namespace lbs
{
    class A
    {
        int a;
        ...
    };
}
// b.h
namespace lbs
{
    class B
    {
        A a;
        ...
    }
}

在上文中璃赡,如果想在類B中組合類A,那么需要在b.h中#include "a.h"献雅,因為編譯器需要A的定義碉考,而需要A定義的目的是為了確定A的大小以便在編譯時分配空間。
如果在b.h中#include "a.h"挺身,那么程序的耦合度會很高侯谁,因為你將在a.h中將許多不必要的信息都添加進(jìn)來,尤其是當(dāng)B這個類很大時章钾,你需要在b.h中#include非常多的類墙贱,程序?qū)@得異常笨重,而且邏輯很混亂伍玖。
有沒有解決方案呢嫩痰?
順著我們剛才的思路,編譯器需要的是A的大小窍箍,那么只需要將A a串纺,變?yōu)锳* a或者A& a,就可以了椰棘。在b.h中纺棺,不再#include "a.h",而是使用一個類的聲明替代邪狞,如下:

// b.h
namespace lbs
{
    class A; //declare
    class B
    {
        A* a;
        ...
    };
}

這樣之后祷蝌,可以使得b.h輕便許多,程序整體的耦合度很低帆卓,可是當(dāng)你需要使用一個其他命名空間的類巨朦,該如何做呢?比如下面這樣:

// a.h
namespace lbs
{
    namespace common
    {
        class A
        {
            int a;
            ...
        };
    }
}
// b.h
namespace lbs
{
    namespace db_mm
    {
        class common::A;//error, common unknown
        class B
        {
            A* a;
            ...
        };
    }
}

這種涉及不同命名空間的聲明剑令,如果按照上面的方式寫糊啡,將會編譯錯誤,提示common命名空間unknown吁津,因為系統(tǒng)不知道common是一個命名空間棚蓄。所以呢,需要這樣寫:

// b.h
namespace lbs
{
    namespace common
    {
        class A; //declare
    }
    
    namespace db_mm
    {
        class B //definition
        {
            common::A* a;
            ...
        };
    }
}

當(dāng)然了,在cpp文件中梭依,還是需要#include所需要的所有頭文件稍算。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市役拴,隨后出現(xiàn)的幾起案子糊探,更是在濱河造成了極大的恐慌,老刑警劉巖扎狱,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侧到,死亡現(xiàn)場離奇詭異,居然都是意外死亡淤击,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門故源,熙熙樓的掌柜王于貴愁眉苦臉地迎上來污抬,“玉大人,你說我怎么就攤上這事绳军∮』” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵门驾,是天一觀的道長射赛。 經(jīng)常有香客問我,道長奶是,這世上最難降的妖魔是什么楣责? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮聂沙,結(jié)果婚禮上秆麸,老公的妹妹穿的比我還像新娘。我一直安慰自己及汉,他們只是感情好沮趣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坷随,像睡著了一般房铭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上温眉,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天缸匪,我揣著相機(jī)與錄音,去河邊找鬼芍殖。 笑死豪嗽,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播龟梦,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼隐锭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了计贰?” 一聲冷哼從身側(cè)響起钦睡,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎躁倒,沒想到半個月后荞怒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡秧秉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年褐桌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片象迎。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡荧嵌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砾淌,到底是詐尸還是另有隱情啦撮,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布汪厨,位于F島的核電站赃春,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏劫乱。R本人自食惡果不足惜织中,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望要拂。 院中可真熱鬧抠璃,春花似錦、人聲如沸脱惰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拉一。三九已至采盒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔚润,已是汗流浹背磅氨。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫡纠,地道東北人烦租。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓延赌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親叉橱。 傳聞我的和親對象是個殘疾皇子挫以,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,696評論 0 3
  • 一、 為什么需要命名空間(問題提出) 命名空間是ANSIC++引入的可以由用戶命名的作用域窃祝,用來處理程序中 常見的...
    IvanRunning閱讀 2,359評論 0 2
  • //出自51博客:www.Amanda0928.51.com 第一章 一掐松、選擇題 1.B; (typedef ,t...
    Damongggggg閱讀 11,130評論 0 1
  • /*類和對象 1.類和實(shí)例化定義類聲明類定義成員函數(shù)數(shù)據(jù)成員的賦值使用類的對象。 2.構(gòu)造函數(shù)數(shù)據(jù)封裝默認(rèn)構(gòu)造函數(shù)...
    aofeilin閱讀 1,055評論 1 2
  • C++入門基礎(chǔ) namespace專題講座 namespace概念 所謂namespace粪小,是指標(biāo)識符的各種可見范...
    蔡俊宇閱讀 789評論 0 2