C++ 中的類型查找過程相對簡單,基本上就是名字查找,這里不再介紹。
對于 .cpp 文件中調用的一個函數 ( 成員函數 ), 編譯器主要做了下面三件事情 :
1 名字查找 . 先在所在編譯單元中可見名字實體 中進行名字查找 . (1) 類成員函數優先 ( 對象所在的類 -> 基類 ). 一經找到就停止查找 . 如果沒有 ,(2) 在相應的名字空間中做進一步的搜索 ; 如果還沒有 , 會根據 (3) 函數參數所在的名字空間中查找 (keoning 查找 ).
2 重載決議 . 根據所找到的名字進行重載決議 , 根據參數最匹配原則選擇相應的函數 .
3 可訪問性檢查 . 用以確定被選中的函數是否可以被調用 .
說明 :
1) 根據第一條 , 顯然 , 如果類型想和非成員函數一起工作 , 那么它們應該放在同一個名字空間中 . 比如 , 一般類型的重載運算符和參數類型放在同一個頭文件中 / 或者同一個名字空間下 .
2) 函數特化模板不參與重載決議 , 因此 , 如果想運用某個函數的特化 , 最好的方法是重載該函數 , 在實現中采用該特化來工作 .
3) 重載決議發生的可訪問性檢查之前 . 正因如此 , 如果私有函數不幸參與了重載 , 并且被選中的話 , 最終也會出現無法訪問的編譯提示 . 這常常隱含二義性 , 這樣設計也不合理 . 換句話說 , 私有參數 , 在名字查找和重載時并非是 ” 私有的 ”.
以 c.Twice ( 21 )的函數調用為例:
a) 名字查找:編譯器會首先尋找一個至少包含一個名字為 Twice 的實體作用域(類,文件,或者名字空間),并將其中的候選實體列表。例子中,編譯器首先從對象 c 所在的類實體中進行查找,找到就停止;如果沒找到就會依次在其基類和外圍的名字空間 中查找 ,直到找到一個至少含有一個候選函數的作用域。兩點需要注意: 1) 只要找到一個實體就停止查找 ,所以并非所有的同名函數都會被考慮; 2) 參數所在名字空間也屬于查找范圍 (keoning 準則 ) 。
b) 重載決議:從所找到的候選重載函數列表中選出唯一最佳匹配 。如不唯一,就存在二義性。注意: 1) 這是基于名字查找結果的; 2) 特化的模板函數不參與重載。
c) 可訪問性檢查:確定所選出的函數是否可訪問。這是最后一步,晚于重載決議。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zhenjing/archive/2009/06/25/4299002.aspx
posted on 2009-12-13 11:15
何克勤 閱讀(231)
評論(0) 編輯 收藏 所屬分類:
C/C++