命名空間

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)版本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章