隨筆-144  評論-80  文章-1  trackbacks-0

          8.5關于名字空間定義
              全局實體(global entity)
              全局名字空間污染(global namespace pollution)

          8.5.1名字空間定義
              namespace 開頭,后面是名字空間的名字。

              namespace cplusplus_primer {
               class matrix {/*****/};
               void inverse(matrix &);
               matrix operator+(const matrix &m1,matrix &m2)
               {
                /******/
               }
               const double pi = 3.1416;
             
              }


              在名字空間cplusplus_primer中聲明的類的名字是
              cplusplus_primer::matrix
              函數的名字是
              cplusplus_primer::inverse()
              常量的名字是
              cplusplus_primer::pi

              類,函數,常量被聲明它的名字空間的名字限定修飾:
              這些名字被成為限定修飾符(qualified name)


              名字空間的定義不一定是連續的.例如
              namespace cplusplus_primer{
              class  matrix {/*****/}
              const double pi = 3.1416;

              }

              namespace cplusplus_primer{
              void inverse(matrix &);
              matrix operator+ (const matrix &m1,const matrix &m2)
                  {/********/}
              }

              名字空間的定義可是非連續的,這對生成一個庫很有幫助,它使我們更容易將庫的源代碼組織成
              接口和實現部分。

           8.5.2域操作符
               ::
               用戶聲明的名字空間成員名自動被加上前綴,名字空間名后面加上域操作符(::),名字空間成員名
               由該名字空間名進行限定修飾。

               名字空間成員的聲明被隱藏在其名字空間中,除非我們為編譯器指定查找的聲明的名字空間,否則
               編譯器將在當前域及嵌套包含當前域的域中查找該名字的聲明。

               注意!!!
               域操作符也可以被用來引用全局名字空間的成員。因為全局名字空間沒有名字。
               ::member_name
               指的是全局名字空間的成員。

               #include <iostream>
               const int max = 65000;
               const int lineLength = 12;

               void fibonacci(int max)
               {
                  if (max <2) return;
           cout << "0 1";
           int v1 = 0,v2=1,cur;
           for (int ix=3;ix <= max;++ix)
           {
               cur = v1+v2;
               if(cur>::max) break;   //引用全局名字空間的變量;
               cout << cur <<"";
               v1=v2;
               v2=cur;
               if(ix % lineLength ==0) cout << endl;
           }
               }

          8.5.3 嵌套名字空間
               
                。。。。。


          8.6 使用名字空間成員

               使用限定修飾的名字形式namespace_name::member_name來引用名字空間,毫無疑問是非常麻煩的。

               using 聲明,using指示符

          8.6.1 名字空間別名
              
               namespace International_Business_Machines
               {/*********/}

               namespace IBM = International_Business_Machines;

          8.6.2 using聲明
             
              
                namespace cplusplus_primer
                {
                  namespace MatrixLib
                  {
                   class matrix {/******/};
                  }
                }

                
                using cplusplus::MatrixLib::matrix;
               

           

                using 聲明引入的名字有以下特性:
                 1> 它在該域中必須唯一。
                 2> 由外圍域中聲明引入的相同名字被其隱藏。
                 3> 它被嵌套域中的相同名字的聲明隱藏。


                 namespace blip {
                  int bi = 16,bj = 15, bk = 23;

                 }

                 int bj = 0;

                 void mainip()
                 {
                   using blip::bi;    //函數mainip()中的bi指向blip::bi
            ++bi;              //設置blip::bi為17
            using blip::bj     //隱藏全局域中的bj
            ++bj;
            int bk;            //bk在局部域中聲明
            using blip:bk;     //錯誤:在mainip()中重復定義bk


                 }

                 int wrongInit = bk; //錯誤:bk在這里不可見


          8.6.3 using 指示符


                 namespace blip{
                 int bi = 16,bj = 15, bk = 23;
                 }

                 int bj = 0;

                 void mainip()
                 {
                   using namespace blip;

            ++bi;       //設置blip::bi為17;
            ++bj;        //錯誤:二義性
                           全局bj還是blip:bj?

                   ++::bj;     // 設置全局bj為1  
            ++blip::bj; // 設置blip::bj為16
            int bk = 97; //局部bk隱藏blip:bk
            ++bk;        //設置局部bk為98

                
                 }

           

          當我們把一個應用程序移植到一個包裝在名字空間中的新版本時,using指示符非常
          有用,但是使用多個using指示符會引起全局名字空間污染問題。
          用多個選擇性的using聲明來代替using指示符會使這個問題最小化,由多個using
          聲明引起的二義性的錯誤在聲明點就能被檢測到,因此建議使用using聲明而不是
          using指示符,以便更好地控制程序中地全局名字空間污染問題。
                

           


           

          posted on 2005-07-11 13:24 小力力力 閱讀(2384) 評論(1)  編輯  收藏 所屬分類: C/C++

          評論:
          # re: c++ primer 筆記(名字空間) 2008-07-19 03:32 | asdwq
          awdqwdq  回復  更多評論
            
          主站蜘蛛池模板: 沿河| 布尔津县| 顺昌县| 延川县| 陆良县| 城口县| 赤峰市| 临安市| 闸北区| 屯留县| 罗源县| 日喀则市| 调兵山市| 德保县| 营口市| 永德县| 北京市| 遵化市| 将乐县| 兴化市| 金秀| 温泉县| 额敏县| 孝感市| 盐城市| 青冈县| 江达县| 衡山县| 青浦区| 江口县| 灵川县| 普兰店市| 邵阳市| 灵台县| 通辽市| 郴州市| 思茅市| 绵阳市| 东方市| 岫岩| 和硕县|