類作用域與命名空間續 留有後續疑問

2021-06-18 15:19:31 字數 1848 閱讀 1925

類作用域與命名空間續

(名字查詢規則)

在版本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檔案執...