命名空間

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

相關文章
相關標籤/搜索