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
小力力力 閱讀(2382)
評論(1) 編輯 收藏 所屬分類:
C/C++