C++ Primer 5th笔记(chap 18 大型程序工具) 类、 命名空间与作用域
1. 命名空間內(nèi)部名字的查找規(guī)則
由內(nèi)向外依次查找每個(gè)外層作用域。
-
外層作用域也可能是一個(gè)或多個(gè)嵌套的命名空間, 直到最外層的全局命名空間查找過程終止。
-
只有位于開放的塊中且在使用點(diǎn)之前聲明的名字才被考慮
1.1 命名空間中的類的查找規(guī)則
當(dāng)成員函數(shù)使用某個(gè)名字時(shí), 首先在該成員中進(jìn)行查找, 然后在類中查找( 包括基類), 接著在外層作用域中查找,這時(shí)一個(gè)或幾個(gè)外層作用域可能就是命名空間
namespace A {int i;int k;class C1 {public:C1(): i(0), j(0) { } // ok: initializes C1::i and C1::jint f1(){return k; // returns A::k}int f2(){return h; // error: h is not defined}int f3();private:int i; // hides A::i within C1int j;};int h = i; // initialized from A::i } // member f3 is defined outside class C1 and outside namespace A int A::C1::f3() {return h; // ok: returns A::h }2. 實(shí)參相關(guān)的查找與類類型形參
隱藏規(guī)則:直接訪問輸出運(yùn)算符。
當(dāng)我們給函數(shù)傳遞一個(gè)類類型的對(duì)象時(shí), 除了在常規(guī)的作用域查找外,還會(huì)查找實(shí)參類所屬的命名空間。 這一例外對(duì)于傳遞類的引用或指針的調(diào)用同樣有效
eg.
std::string s; std::cin ? s;operator>> (std::cin, s);或者使用函數(shù)調(diào)用的形式以把命名空間的信息包含進(jìn)來:
std::operator?(std::cin, s) ; / / 正確: 顯式地使用 std::>>2.1 查找與 std::move 和 std::forward
如果在應(yīng)用程序中定義了一個(gè)標(biāo)準(zhǔn)庫中已有的名字, 則將出現(xiàn)以下兩種情況中的一種:
- 根據(jù)一般的重載規(guī)則確定某次調(diào)用應(yīng)該執(zhí)行函數(shù)的哪個(gè)版本
- 應(yīng)用程序根本就不會(huì)執(zhí)行函數(shù)的標(biāo)準(zhǔn)庫版本
2.2 友元聲明與實(shí)參相關(guān)的查找
namespace A {class C {// 兩個(gè)友元, 在友元聲明之外沒有其他的聲明// 這些函數(shù)隱式地成為命名空間 A 的成員// 除非另有聲明, 否則不會(huì)被找到friend void f(const C& ); // 才艮據(jù)實(shí)參相關(guān)的查找規(guī)貝可以被找到friend void f2();} }當(dāng)類聲明了一個(gè)友元時(shí), 該友元聲明并沒有使得友元本身可見
一個(gè)另外的未聲明的類或函數(shù)如果第一次出現(xiàn)在友元聲明中, 則我們認(rèn)為它是最近的外層命名空間的成員
int main ( ) {A::C cobj;f(cobj);f2();//正確: 通過在 A::C 中的友元聲明找到 A::f//錯(cuò)誤: A::f 2 沒有被聲明 }總結(jié)
以上是生活随笔為你收集整理的C++ Primer 5th笔记(chap 18 大型程序工具) 类、 命名空间与作用域的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha