C++编程:详解友元功能与三种实现

需积分: 0 0 下载量 159 浏览量 更新于2024-06-20 收藏 508KB PDF 举报
“C++:友元(看这一篇就够了)-c++友元-孙 悟 空的博客-CSDN博客.pdf” 本文详细介绍了C++中的友元(Friend)机制,这是一种打破封装性,允许外部函数或类访问另一个类的私有或保护成员的特性。友元是C++中实现某些特定功能,如数据共享和复杂操作的重要手段。友元的关键字是`friend`。 友元的三种实现方式包括: 1. 全局函数做友元: 在这个场景下,一个全局函数可以通过`friend`声明成为某个类的友元,从而能够访问该类的私有或保护成员。例如,定义一个`Building`类,它有一个公有成员`m_SittingRoom`(客厅)和一个私有成员`m_BedRoom`(卧室)。然后,定义一个全局函数`laoWang1`,通过指针参数访问`Building`类的私有成员`m_BedRoom`。这样做是为了展示全局友元函数如何能绕过封装限制直接访问私有数据。 ```cpp class Building { public: Building() : m_SittingRoom("客厅"), m_BedRoom("卧室") {} // 其他成员... private: string m_SittingRoom; string m_BedRoom; }; void laoWang1(Building* building) { std::cout << "隔壁老王全局函数正在访问:(地址传递)" << building->m_SittingRoom << endl; std::cout << "隔壁老王全局函数正在访问:(地址传递)" << building->m_BedRoom << endl; } ``` 2. 类做友元: 除了全局函数,一个类也可以是另一个类的友元。这意味着类A可以声明类B为它的友元,使得类B的所有成员函数都能够访问类A的私有和保护成员。这种方式常用于两个紧密协作的类之间,比如需要共享数据或实现复杂的操作。 ```cpp class A { public: // 声明类B为友元 friend class B; private: int privateVar; }; class B { public: void accessPrivateInA(A& a) { // 友元类B可以访问类A的私有成员 std::cout << "Accessing private in A: " << a.privateVar << endl; } }; ``` 3. 成员函数做友元: 这种情况比较少见,但也是可能的。一个类的成员函数可以被声明为另一个类的友元,允许这个成员函数访问那个类的私有或保护成员。这种做法通常出现在需要在类A的成员函数内部,访问类B的私有成员,而类A与类B又有着紧密的关系。 ```cpp class A { public: void someFunction(); private: int mA; }; class B { public: // 声明类A的成员函数someFunction为友元 friend void A::someFunction(); private: int mB; }; void A::someFunction() { B b; // 因为someFunction是B的友元,所以可以访问B的私有成员 b.mB = 10; } ``` 友元机制虽然提供了便利,但也带来了一些潜在的问题,比如破坏了封装性,可能导致安全性和可维护性降低。因此,在使用友元时,应当谨慎考虑,尽量避免过度使用。在设计类的时候,优先考虑使用公有和保护接口来实现合作,只有在必要时才使用友元。