為什麼要引入友元函數?
因為我們不能在類的外部訪問類的私有變量。
傳統的訪問方法:
[cpp]
- #include <iostream>
- #include <string>
- using namespace std;
-
- class aa
- {
- private:
- float a;
- float b;
- public:
- float &aaa()
- {
- return (a);
- }
- float &bbb()
- {
- return (b);
- }
- };
-
- aa sum(aa a, aa b)
- {
- aa c;
- c.aaa() = a.aaa() + b.aaa();
- c.bbb() = a.bbb() + b.bbb();
- return (c);
- }
-
- int main(int argc, char **argv)
- {
- aa a, b;
- a.aaa() = 1;
- a.bbb() = 2;
- b.aaa() = 3;
- b.bbb() = 4;
- aa c = sum(a, b);
- cout << c.aaa() << endl;
- cout << c.bbb() << endl;
-
- return 0;
- }
引入友元函數之後:
[cpp]
- #include <iostream>
- #include <string>
- using namespace std;
-
- class aa
- {
- private:
- float a;
- float b;
- public:
- float &aaa()
- {
- return (a);
- }
- float &bbb()
- {
- return (b);
- }
- friend aa sum(aa, aa);
- friend int main(int argc, char **argv);
- };
-
- aa sum(aa s, aa t)
- {
- aa c;
- c.a = s.a + t.a;
- c.b = s.b + t.b;
- return (c);
- }
-
- int main(int argc, char **argv)
- {
- aa a, b;
- a.a = 1;
- a.b = 2;
- b.a = 3;
- b.b = 4;
- aa c = sum(a, b);
- cout << c.a << endl;
- cout << c.b << endl;
-
- return 0;
- }
兩個函數運行結果完全一樣。
對於使用友元:
(1)聲明的位置既可在public區,也可在protected區。友元函數雖然是在類內進行聲明,但它不是該類的成員函數,不屬於任何類。
(2)在類外定義友元函數,與普通函數的定義一樣,一般與類的成員函數放在一起,以便類重用時,一起提供其友元函數。
(3) 友元函數是能訪問類的所有成員的普通函數,一個函數可以是多個類的友元函數,只需在各個類中分別聲明。
(4)友元能使程序精煉,提高程序的效率。
(5)友元破壞了類的封裝,使用時,要權衡利弊,在數據共享與信息隱藏之間選擇一個平衡點。