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

          8.5關(guān)于名字空間定義
              全局實體(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
              函數(shù)的名字是
              cplusplus_primer::inverse()
              常量的名字是
              cplusplus_primer::pi

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


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

              }

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

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

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

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

               注意!??!
               域操作符也可以被用來引用全局名字空間的成員。因為全局名字空間沒有名字。
               ::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;    //函數(shù)mainip()中的bi指向blip::bi
            ++bi;              //設(shè)置blip::bi為17
            using blip::bj     //隱藏全局域中的bj
            ++bj;
            int bk;            //bk在局部域中聲明
            using blip:bk;     //錯誤:在mainip()中重復(fù)定義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;       //設(shè)置blip::bi為17;
            ++bj;        //錯誤:二義性
                           全局bj還是blip:bj?

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

                
                 }

           

          當我們把一個應(yīng)用程序移植到一個包裝在名字空間中的新版本時,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  回復(fù)  更多評論
            
          主站蜘蛛池模板: 苏尼特左旗| 什邡市| 周宁县| 陆川县| 林周县| 宜君县| 富源县| 古蔺县| 军事| 龙南县| 正阳县| 南江县| 太仓市| 伊通| 大新县| 阳曲县| 潜江市| 巴中市| 天镇县| 秭归县| 吉首市| 安宁市| 上饶县| 吉水县| 青神县| 大足县| 嘉禾县| 炎陵县| 资兴市| 石首市| 将乐县| 哈尔滨市| 翁牛特旗| 滦平县| 方山县| 巩留县| 金沙县| 桐乡市| 博客| 陆河县| 顺义区|