C++ 速查手冊 V1.00 - 單元 9.8 - friend 成員




private 成員只限同個類別的其他成員存取, C++ 提供另一種方式讓函數或其他類別也可存取 private 成員,就是在類別宣告為 friend 的成員函數,或是宣告為 friend 的類別,舉例如下


001 #include <iostream>
002
003 class Demo {
004 public:
005    Demo(int pa, int pb) {
006       a = pa;
007       b = pb;
008    }
009
010    friend int do_something(Demo& d) {
011       return d.a + d.b;
012    }
013
014    friend class Demo2;
015     
016 private:
017    int a;
018    int b;
019 };
020
021 class Demo2 {
022 public:
023    int do_something2(Demo& d) {
024       return d.a + d.b;
025    }
026 };
027
028 int main() {
029    Demo d(32, 22);
030    std::cout << do_something(d)
031              << std::endl;
032    Demo2 d2;
033    std::cout << d2.do_something2(d)
034              << std::endl;
035
036    return 0;
037 }
038  
039 /* Kaiching Chang 
040    u0908.cpp
041    2014-02 */

do_something() 為宣告為 friend 的成員函數,注意,這裡以 Demo 的參考當參數,至於 Demo2 為可存取 Demoprivate 成員的類別


010 friend int do_something(Demo& d) {
011    return d.a + d.b;
012 }
013
014 friend class Demo2;

Demo2do_something2()Demo 的參考當參數,就可以存取 Demoprivate 成員了


023 int do_something2(Demo& d) {
024    return d.a + d.b;
025 }

friend 成員函數 do_something() 不需要以物件呼叫, Demo2do_something2() 則需要用 Demo2 的物件呼叫


029 Demo d(32, 22);
030 std::cout << do_something(d)
031           << std::endl;
032 Demo2 d2;
033 std::cout << d2.do_something2(d)
034           << std::endl;

編譯執行,結果如下


$ g++ u0908.cpp
$ ./a.out
54
54
$

continue ...

沒有留言: