C++学习之友元函数

为什么要引入友元函数?

因为我们不能在类的外部访问类的私有变量。

传统的访问方法:

[cpp]  view plain copy
  1. //============================================================================  
  2. // Name        : main.cpp  
  3. // Author      : ShiGuang  
  4. // Version     :  
  5. // Copyright   : sg131971@qq.com  
  6. // Description : Hello World in C++, Ansi-style  
  7. //============================================================================  
  8.   
  9. #include <iostream>  
  10. #include <string>  
  11. using namespace std;  
  12.   
  13. class aa  
  14. {  
  15. private:  
  16.     float a;  
  17.     float b;  
  18. public:  
  19.     float &aaa()  
  20.     {  
  21.         return (a);  
  22.     }  
  23.     float &bbb()  
  24.     {  
  25.         return (b);  
  26.     }  
  27. };  
  28.   
  29. aa sum(aa a, aa b)  
  30. {  
  31.     aa c;  
  32.     c.aaa() = a.aaa() + b.aaa();  
  33.     c.bbb() = a.bbb() + b.bbb();  
  34.     return (c);  
  35. }  
  36.   
  37. int main(int argc, char **argv)  
  38. {  
  39.     aa a, b;  
  40.     a.aaa() = 1;  
  41.     a.bbb() = 2;  
  42.     b.aaa() = 3;  
  43.     b.bbb() = 4;  
  44.     aa c = sum(a, b);  
  45.     cout << c.aaa() << endl;  
  46.     cout << c.bbb() << endl;  
  47.   
  48.     return 0;  
  49. }  
引入友元函数之后:

[cpp]  view plain copy
  1. //============================================================================  
  2. // Name        : main.cpp  
  3. // Author      : ShiGuang  
  4. // Version     :  
  5. // Copyright   : sg131971@qq.com  
  6. // Description : Hello World in C++, Ansi-style  
  7. //============================================================================  
  8.   
  9. #include <iostream>  
  10. #include <string>  
  11. using namespace std;  
  12.   
  13. class aa  
  14. {  
  15. private:  
  16.     float a;  
  17.     float b;  
  18. public:  
  19.     float &aaa()  
  20.     {  
  21.         return (a);  
  22.     }  
  23.     float &bbb()  
  24.     {  
  25.         return (b);  
  26.     }  
  27.     friend aa sum(aa, aa);  
  28.     friend int main(int argc, char **argv);  
  29. };  
  30.   
  31. aa sum(aa s, aa t)  
  32. {  
  33.     aa c;  
  34.     c.a = s.a + t.a;  
  35.     c.b = s.b + t.b;  
  36.     return (c);  
  37. }  
  38.   
  39. int main(int argc, char **argv)  
  40. {  
  41.     aa a, b;  
  42.     a.a = 1;  
  43.     a.b = 2;  
  44.     b.a = 3;  
  45.     b.b = 4;  
  46.     aa c = sum(a, b);  
  47.     cout << c.a << endl;  
  48.     cout << c.b << endl;  
  49.   
  50.     return 0;  
  51. }  
两个函数运行结果完全一样。

对于使用友元:
(1)声明的位置既可在public区,也可在protected区。友元函数虽然是在类内进行声明,但它不是该类的成员函数,不属于任何类。
(2)在类外定义友元函数,与普通函数的定义一样,一般与类的成员函数放在一起,以便类重用时,一起提供其友元函数。
(3) 友元函数是能访问类的所有成员的普通函数,一个函数可以是多个类的友元函数,只需在各个类中分别声明。
(4)友元能使程序精炼,提高程序的效率。
(5)友元破坏了类的封装,使用时,要权衡利弊,在数据共享与信息隐藏之间选择一个平衡点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值