1.內存名字隱藏外層名字ide
2.嵌套名字空間逐層分解函數
3.名字空間別名定義方法:namespace ns = 名字空間;spa
如:內存
namespace ns1{作用域
typedef int TYPE;編譯器
namespace ns2{string
typedef int* TYPE;it
namespace ns3{編譯
typedef string TYPE;class
namespace ns4{
typedef string* TYPE;
}
}
}
}
using namespace ns1;
TYPE n = 10;
cout << n << endl;
ns1::ns2::TYPE pn = &n;
cout << *pn << endl;
ns1::ns2::ns3::TYPE str ("hello");
cout << str << endl;
ns1::ns2::ns3::ns4::TYPE pstr1 = &str;
cout << *pstr1 << endl;
namespace ns_four = ns1::ns2::ns3::ns4;
ns_four::TYPE pstr2 = pstr1;
cout << *pstr2 << endl;
結果上面:都能輸出相應的值
4.不一樣名字空間中的成員使用:
namespace ns1
{
class A
{
};
void foo (A a)
{
cout << "ns1::foo() invoked" << endl;
}
}
namespace ns2
{
void foo (ns1::A a)
{
cout << "ns2::foo() invoked" << endl;
}
}
ns1::A a;
ns1::foo(a);
ns2::foo(a);
結果:
ns1::foo() invoked
ns2::foo() invoked
另外: 在當前做用域內聲明的名字(不管是直接聲明仍是經過using聲明)必定會隱藏其可見名字空間中聲明的名字,即便using指令在using聲明以後。
using ns1::foo; /*將ns1名字空間中的foo()引入當前做用域,覆蓋全部可見名字空間中的foo(),經過using聲明在當前做用域中聲明瞭一個特定的名字以後,
若是程序試圖聲明另外一個相同的名字,將致使編譯時錯誤,如:using ns2::foo; // 編譯時錯誤,名字衝突*/
foo (a);
using namespace ns2;//using指令說明這些名字空間中的名字在當前做用域中可見,但並無將這些名字空間中的名字引入當前做用域。
若是引入了,就會隱藏其餘的,也就無歧義;可是若是隻是可見,那麼就可能產生歧義
using指令只是說明在當前做用域中這些定義的名字能夠直接使用(要求沒有歧義)
foo (a); // 調用ns1名字空間中的foo(),ns2名字空間中的foo()被ns1名字空間中的foo()隱藏
5.只有同一做用域中的同名函數纔會涉及重載的問題,不一樣做用域中的同名函數遵循標示符隱藏原則。
6.無名做用域中聲明的名字能夠直接使用,或者須要做用域時使用全局做用域::
namespace{//無名做用域
void foo (void){
cout << "::foo() invoked" << endl;
}
}
7.名字空間具備傳遞性:
namespace ns1{
void foo (void){
cout << "ns1::foo() invoked" << endl;
}
}
namespace ns2{
void foo (void){
cout << "ns2::foo() invoked" << endl;
}
}
namespace ns3{
using namespace ns1; // ns3可見ns1中的foo()
using namespace ns2; // ns3可見ns2中的foo()
void foo (void){
cout << "ns3::foo() invoked" << endl;
}
}
using namespace ns3; // 當前做用域可見ns3中的foo(),同時亦可見ns1和ns2中的foo()
//foo (); // 編譯時錯誤,歧義
//可是在當前做用域又能夠隱藏其餘的名字:
ns3::foo (); // 在ns3的做用域中,ns1和ns2中的foo()已被其本身的foo()所隱藏,故無歧義
//若是ns3中沒有定義foo那麼就會調用其餘的名字空間中的foo(固然要求其餘的包含名字空間之間沒有歧義)
8.不能用::來引入新的成員名字
可是能夠再定義一樣的名字空間添加這些成員名字,編譯器會組合這些名字空間,可是不能重複
9.函數聲明和標示符隱藏原則:
void func (int n){
cout << "func(int) invoked" << endl;
}
void func (char c){
cout << "func(char) invoked" << endl;
}
func (10); // 匹配到void func (int n)版本
//聲明
void func (char c); // 後聲明的標識符隱藏先聲明的同名標識符
func (10); // 匹配到void func (char c)版本