類作用域與命名空間續
(名字查詢規則)
在版本4中,有關於類作用域中的名字查詢有這麼一段話:
迄今為止,在我們所編寫的程式中,名字查詢(尋找與給定的名字相匹配的宣告的過程)是相對直接的。
(1)首先,在使用該名字的塊中查詢名字宣告,只需考慮在該項使用之前宣告的名字。
(2) 如果找不到該名字,則在包圍的作用域(外層作用域,也需要在使用之前)中查詢。
(3) c++中所有名字必須在使用之前宣告。
(4) 在名字查詢期間,如果類作用域使用的名字不能確定為成員名,則在包含該類或者成員定義的作用域中查詢,以便找到該名字宣告。
知道理論不見得理解了本質,或者說理解可能會有偏差。下面我們一如既往地做個小測試,測試程式如下:
//findname 標頭檔案
class client
client(client& c){}
~client(){}
void callshow()
private:
int id;};
template
class server
server(server& s){}
~server(){}
void callshow()
};
#include#include"findname"
using namespace std;
void show()
template<class t>
void callshow(t s)
template<class t>
class display};
void show()
template<class t>
void callshow(t s)
template<class t>
class display
};}
編譯不通過,錯誤很明顯使用callshow,display時必須加上作用域限定std::。
如果都加上namespace std那麼執行也會完全通過。
如果**改為如下:
#include#include
namespace std
template<class t>
void callshow()
template<class t>
void callshow(t s)
template<class t>
class display};}
namespace std
template<class t>
void callshow()
template<class t>
void callshow(t s)
template<class t>
class display};}
int main()
namespace std{
void show()
{ std::cout<<"empty show!"<
這段**能成功執行煞是費解,難道此處show不是在例項化之後定義的嗎?這個問題留待以後學完模板吧。
命名空間與作用域
命名空間即存放名字與物件對映 繫結關係的地方。對於x 3,python會申請記憶體空間存放物件3,然後將名字x與3的繫結關係存放於命名空間中,del x表示清除該繫結關係。在程式執行期間最多會存在三種命名空間 伴隨python直譯器的啟動 關閉而產生 因而是第乙個被載入的命名空間,用來存放一些內建的...
命名空間與作用域
定義 它是儲存作用域中變數的字典。乙個命名空間中不能有重名,但是不同的命名空間可以重名而沒有任何影響。分類 按照變數定義的位置,可以劃分為以下3類 local,區域性命名空間,記錄了函式中定義的所有變數,包括函式的入參 內部定義的區域性變數。使用locals 檢視區域性命名空間。返回的是字典 glo...
命名空間與作用域
有了命名空間之後,就可以在棧區中存放相同的名字,詳細的命名空間 存放的名字 內建命名空間存放的是python直譯器自帶的名字 例如 print input 生命週期 py直譯器啟動則產生,直譯器關閉則銷毀 存放的名字 只要不是內建的和函式內定義的名字,都是全域性命名空間 生命週期 python檔案執...