1.內存名字隱藏外層名字
2.嵌套名字空間逐層分解
3.名字空間別名定義方法:namespace ns = 名字空間;
如:
namespace ns1{
typedef int TYPE;
namespace ns2{
typedef int* TYPE;
namespace ns3{
typedef string TYPE;
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)版本