17.2.4 命名空間成員的使用
除了在函數或其他作用域內部,頭文件不應該包含using指示或using聲明。在其頂級作用域包含using指示或using聲明的頭文件,具有將該名字注入包含該頭文件的文件中的效果。頭文件應該只定義作為其接口的一部分的名字,不要定義在其實現中使用的名字。
1. using聲明,扼要重述
一個using聲明一次只引入一個命名空間成員,它使得無論程序中使用哪些名字,都能夠非常正確。
using std::vector;
using std::string;
using std::vector;
using std::string;2. using聲明的作用域
using聲明可以出現在全局作用域、局部作用域或者命名空間作用域中。類作用域中的using聲明局限於被定義類的基類中定義的名字。
class Book{
protected:
virtual void Method1() throw(logic_error){}
};
class NoteBook:private Book{
protected:
using Book::Method1;
};
class Book{
protected:
virtual void Method1() throw(logic_error){}
};
class NoteBook:private Book{
protected:
using Book::Method1;
};3. 命名空間別名
命名空間別名聲明以關鍵字namespace開頭,接(較短的)命名空間別名名字,再接=,再接原來的命名空間名字和分號。如果原來的命名空間名字是未定義的,就會出錯。
命名空間別名也可以引用嵌套的命名空間。
namespace vec=Anders::NameSpace1;
vec::Class1 c1();
namespace vec=Anders::NameSpace1;
vec::Class1 c1();一個命名空間可以有許多別名,所有別名以及原來的命名空間名字都可以互換使用。
4. using指示
像using聲明一樣,using指示使我們能夠使用命名空間名字的簡寫形式。與using聲明不同,using指示無法控制使得哪些名字可見——它們都是可見的。
5. using指示的形式
using指示以關鍵字using開頭,後接關鍵字namespace,再接命名空間名字。如果該名字不是已經定義的命名空間名字,就會出錯。
using指示使得特定命名空間的所有名字可見,沒有限制。短格式名字可從using指示點開始使用,直到出現using指示的作用域的末尾。
using namespace std;
using namespace Anders::NameSpace2;
using namespace std;
using namespace Anders::NameSpace2;6. using指示與作用域
using指示不聲明空間成員名字的別名,相反,它具有將命名空間成員提升到包含命名空間本身和using指示的最近作用域的效果。
using指示有用的一種情況是,用在命名空間本身的實現文件中。
摘自 xufei96的專欄