• 友元 C++进修之路系列


    1.定义

            友元(Friend)是C++中一种特殊的访问控制机制,它允许一个类或函数访问另一个类的私有成员。友元在一些特殊情况下非常有用,但也应谨慎使用,因为它会打破封装性和数据隐藏原则。

            当一个类或函数被声明为另一个类的友元时,它就能够绕过访问权限进行访问,即使这些成员在普通情况下对外是不可见的。友元的作用类似于家庭中的密友,可以借助其特殊身份获得其他成员私有信息的访问权。然而,友元并不是简单的双向关系,即A类是B类的友元,B类也是A类的友元,这种关系并不成立。友元有三种:友元函数、友元类、友元成员函数

    2.友元函数

    1. class ClassA
    2. {
    3. public:
    4. ClassA() { private_data = 5; };
    5. private:
    6. int private_data;
    7. friend void FriendFunction(ClassA& class_a);
    8. };
    9. void FriendFunction(ClassA& class_a)
    10. {
    11. printf("%d\n", class_a.private_data);
    12. }
    13. int main(int argc, char* argv[])
    14. {
    15. ClassA class_a;
    16. FriendFunction(class_a);
    17. }

            FriendFunction是ClassA的友元函数,因此FriendFunction可以直接访问ClassA的私有成员。

    3.友元类

    1. class ClassB;
    2. class ClassA
    3. {
    4. public:
    5. ClassA() { private_data = 5; };
    6. private:
    7. int private_data;
    8. friend class ClassB;
    9. };
    10. class ClassB
    11. {
    12. public:
    13. void GetClassAPrivate(ClassA& class_a)
    14. {
    15. printf("%d\n", class_a.private_data);
    16. };
    17. };
    18. int main(int argc, char* argv[])
    19. {
    20. ClassA class_a;
    21. ClassB class_b;
    22. class_b.GetClassAPrivate(class_a);
    23. }

            主要语法:friend class FriendClass;

            ClassB是ClassA的友元类,因此ClassB可以直接访问ClassA的私有成员

    4.友元成员函数

    1. class ClassA;
    2. class ClassB
    3. {
    4. public:
    5. void GetClassAPrivate(ClassA& class_a);
    6. };
    7. class ClassA
    8. {
    9. public:
    10. ClassA() { private_data = 5; };
    11. friend void ClassB::GetClassAPrivate(ClassA& class_a);
    12. private:
    13. int private_data;
    14. };
    15. void ClassB::GetClassAPrivate(ClassA& class_a)
    16. {
    17. printf("%d\n", class_a.private_data);
    18. };
    19. int main(int argc, char* argv[])
    20. {
    21. ClassA class_a;
    22. ClassB class_b;
    23. class_b.GetClassAPrivate(class_a);
    24. }

    注意:友元成员函数,应该这么理解ClassB的成员函数是ClassA的友元成员函数,意思是成员函数是ClassB不是ClassA的不要弄混了。由于需要把ClassB的某个成员函数定义为ClassA的友元成员函数,因此ClassB的类定义要放在ClassA之前,不然的话ClassA不知道ClassB有哪些成员函数。

    5.使用场景

    1. 访问私有成员:主要作用是允许外部函数或类访问另一个类的私有成员,从而实现对类的细粒度控制。
    2. 操作符重载:当需要重载类的操作符(如<<、>>、+、-等)时,友元函数可以访问私有成员,实现合适的操作。
    3. 提高效率:在某些情况下,使用友元函数可以提高程序的执行效率,因为它可以直接访问类的私有成员,而不需要通过访问器函数(getter和setter)。

    6.缺点

    1. 破坏封装性:友元函数可以突破类的封装性,使得类的私有成员可以被外部函数直接访问,可能会降低代码的安全性和可维护性。(友元也破环了类的隐藏与封装,所以必须慎用 (牺牲安全,提高效率))
    2. 难以维护:当程序变得复杂时,友元函数的使用可能会导致代码变得难以理解和维护。

    注:友元不能 继承,交换,传递!

    7.引用

    C++友元详解_c++中的友元-CSDN博客

    C++——友元(友元函数、友元类和友元成员函数详解)_小羊Linux客栈的博客-CSDN博客

  • 相关阅读:
    手写redux的connect方法, 使用了subscribe获取最新数据
    汉字与英文对照表
    GrayLog分布式日志组件来提高查日志效率!
    git 工具学习笔记
    电容笔可以用什么代替?好用电容笔品牌推荐
    手把手开发Admin 系列五(规划api篇)
    C#控制台贪吃蛇
    HCIA笔记(2)
    Express 中间件的分类
    【《C Primer Plus》读书笔记】第7章:C控制语句:分支和跳转
  • 原文地址:https://blog.csdn.net/Physics_ITBoy/article/details/133347936