歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> C++學習之友元函數

C++學習之友元函數

日期:2017/3/1 10:30:40   编辑:Linux編程

為什麼要引入友元函數?

因為我們不能在類的外部訪問類的私有變量。

傳統的訪問方法:

[cpp]
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class aa
  5. {
  6. private:
  7. float a;
  8. float b;
  9. public:
  10. float &aaa()
  11. {
  12. return (a);
  13. }
  14. float &bbb()
  15. {
  16. return (b);
  17. }
  18. };
  19. aa sum(aa a, aa b)
  20. {
  21. aa c;
  22. c.aaa() = a.aaa() + b.aaa();
  23. c.bbb() = a.bbb() + b.bbb();
  24. return (c);
  25. }
  26. int main(int argc, char **argv)
  27. {
  28. aa a, b;
  29. a.aaa() = 1;
  30. a.bbb() = 2;
  31. b.aaa() = 3;
  32. b.bbb() = 4;
  33. aa c = sum(a, b);
  34. cout << c.aaa() << endl;
  35. cout << c.bbb() << endl;
  36. return 0;
  37. }

引入友元函數之後:

[cpp]
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class aa
  5. {
  6. private:
  7. float a;
  8. float b;
  9. public:
  10. float &aaa()
  11. {
  12. return (a);
  13. }
  14. float &bbb()
  15. {
  16. return (b);
  17. }
  18. friend aa sum(aa, aa);
  19. friend int main(int argc, char **argv);
  20. };
  21. aa sum(aa s, aa t)
  22. {
  23. aa c;
  24. c.a = s.a + t.a;
  25. c.b = s.b + t.b;
  26. return (c);
  27. }
  28. int main(int argc, char **argv)
  29. {
  30. aa a, b;
  31. a.a = 1;
  32. a.b = 2;
  33. b.a = 3;
  34. b.b = 4;
  35. aa c = sum(a, b);
  36. cout << c.a << endl;
  37. cout << c.b << endl;
  38. return 0;
  39. }

兩個函數運行結果完全一樣。

對於使用友元:

(1)聲明的位置既可在public區,也可在protected區。友元函數雖然是在類內進行聲明,但它不是該類的成員函數,不屬於任何類。
(2)在類外定義友元函數,與普通函數的定義一樣,一般與類的成員函數放在一起,以便類重用時,一起提供其友元函數。
(3) 友元函數是能訪問類的所有成員的普通函數,一個函數可以是多個類的友元函數,只需在各個類中分別聲明。
(4)友元能使程序精煉,提高程序的效率。
(5)友元破壞了類的封裝,使用時,要權衡利弊,在數據共享與信息隱藏之間選擇一個平衡點。

Copyright © Linux教程網 All Rights Reserved