? 博客主页:倔强的石头的CSDN主页
?Gitee主页:倔强的石头的gitee主页
⏩ 文章专栏:《C++指南》
期待您的关注
目录
引言
?友元的介绍
?友元函数
?友元类
?相关规则的用法
结语
引言
在C++编程语言中,友元是一种特殊的访问控制机制,它允许一个类或函数访问另一个类的私有成员。
友元关系可以是函数与类之间,也可以是类与类之间。友元机制虽然增强了类的灵活性,但也破坏了封装性,因此在使用时需要谨慎。
?友元的介绍
友元关系在C++中是一种单向的、非传递的关系。
当一个类或函数被声明为另一个类的友元时,它能够绕过访问权限进行访问,即使这些成员在普通情况下对外是不可见的。
友元的声明通常放在类的定义中,位于public
、protected
和private
之外,使用friend
关键字进行声明。
友元函数和友元类的声明确实可以在类定义的任何地方进行,且不受类访问限定符(如public
、protected
、private
)的限制。
⼀个函数可以是多个类的友元函数,一个类也可以是多个类的友元类。
?友元函数
友元函数是一种特殊的函数,它可以访问类的私有成员,尽管它不是类的成员函数。
友元函数的声明通常位于类的声明中,但其实现则位于类外部。
语法:
class MyClass { private: int privateData; public: MyClass(int data) : privateData(data) {} // 声明友元函数 friend void friendFunction(const MyClass& obj); // Getter函数 int getPrivateData() const { return privateData; } }; // 友元函数实现 void friendFunction(const MyClass& obj) { cout << "Friend function accessing private data: " << obj.privateData << endl; }
使用场景:当需要重载类的操作符(如
<<
、>>
、+
、-
等)时,友元函数可以访问私有成员,实现合适的操作。在某些情况下,使用友元函数可以提高程序的执行效率,因为它可以直接访问类的私有成员,而不需要通过访问器函数(getter和setter)。 注意事项:
友元函数破坏了类的封装性,可能会降低代码的安全性和可维护性。当程序变得复杂时,友元函数的使用可能会导致代码变得难以理解和维护。?友元类
友元类是指一个类被声明为另一个类的友元。这意味着被声明为友元的类可以访问另一个类的私有成员,类似于友元函数的概念,但是是对整个类的授权。
语法:
class MyClass; class FriendClass { public: void accessPrivateData(const MyClass& obj); }; class MyClass { private: int privateData; public: MyClass(int data) : privateData(data) {} // 声明友元类 friend class FriendClass; int getPrivateData() const { return privateData; } }; // 友元类成员函数实现 void FriendClass::accessPrivateData(const MyClass& obj) { cout << "Friend class accessing private data: " << obj.privateData << endl; }
使用场景:友元类通常用于需要多个类之间紧密协作的情况,允许这些类访问彼此的私有成员。
注意事项:
友元类同样破坏了类的封装性,需要谨慎使用。友元关系不具备传递性,即如果A是B的友元,B是C的友元,A不一定是C的友元。
?相关规则的用法
友元函数的声明和实现: 友元函数在类的内部声明,使用friend
关键字。友元函数的实现位于类外部,可以像普通函数一样进行定义。友元类的声明: 友元类在目标类中使用friend
关键字进行声明。友元类的所有成员函数都可以访问目标类的私有成员。友元关系的单向性和非传递性: 友元关系是单向的,即A是B的友元,并不意味着B是A的友元。友元关系是非传递的,即如果A是B的友元,B是C的友元,A不一定是C的友元。友元成员函数的声明: 友元成员函数是在一个类中声明的成员函数,但被声明为另一个类的友元函数。友元成员函数可以访问被授权类的私有成员。 代码示例(友元成员函数):
class FriendClass; class MyClass { private: int privateVar; public: MyClass(int val) : privateVar(val) {} // 友元成员函数,声明FriendClass的成员函数为友元 friend void FriendClass::accessPrivateVar(MyClass& obj); }; class FriendClass { public: void accessPrivateVar(MyClass& obj) { // 友元成员函数可以访问MyClass的私有成员 int x = obj.privateVar; cout << "Friend class member function accessing private data: " << x << endl; } }; int main() { MyClass myObj(42); FriendClass friendObj; friendObj.accessPrivateVar(myObj); // 调用友元类的成员函数 return 0; }
结语
友元机制在C++中提供了一种灵活的访问控制手段,允许类或函数访问另一个类的私有成员。然而,友元也破坏了类的封装性,可能会降低代码的安全性和可维护性。因此,在使用友元时需要谨慎考虑,确保只有在必要的情况下使用它。