掘金 人工智能 2024年07月06日
C++友元函数和友元类的使用
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

C++ 中的友元机制允许类或函数访问其他类的私有成员,打破了封装性,用于在特定场景下共享数据或实现特定功能。友元分为类友元和函数友元,通过 `friend` 关键字声明,可以实现类之间或函数与类之间的相互访问。

👨‍🏫 **类友元**:将一个类声明为另一个类的友元,友元类可以直接访问另一个类的私有成员。类友元关系在类之间共享数据或实现特定功能时很有用,例如,一个类需要访问另一个类的私有数据以完成特定的任务。 例如,假设有一个 `FriendClass` 类包含一个私有成员 `privateData`,我们可以将另一个类 `OtherClass` 声明为 `FriendClass` 的友元类。这样,`OtherClass` 就可以直接访问 `FriendClass` 的 `privateData`。 c++ class FriendClass { private:     int privateData; public:     FriendClass() : privateData(0) {}     friend class OtherClass;  // 声明 OtherClass 是 FriendClass 的友元类 }; class OtherClass { public:     void accessPrivateData(FriendClass& obj) {         obj.privateData = 42;  // 可以直接访问 FriendClass 的私有成员     } };

🤝 **函数友元**:将一个函数声明为一个类的友元函数,友元函数可以直接访问该类的私有成员。友元函数可以是非成员函数,也可以是其他类的成员函数。 例如,假设有一个 `MyClass` 类包含一个私有成员 `privateData`,我们可以将一个函数 `friendFunction` 声明为 `MyClass` 的友元函数。这样,`friendFunction` 就可以直接访问 `MyClass` 的 `privateData`。 c++ class MyClass { private:     int privateData; public:     MyClass() : privateData(0) {}     friend void friendFunction(MyClass& obj);  // 声明 friendFunction 是 MyClass 的友元函数 }; void friendFunction(MyClass& obj) {     obj.privateData = 42;  // 可以直接访问 MyClass 的私有成员 }

🤔 **使用场景**:友元机制通常用于以下场景: * 当两个或多个类需要共享私有数据时,可以使用类友元来实现数据的直接访问,而无需通过公有接口。 * 当某个类需要提供特定函数或操作给其他类使用,但这些函数需要访问类的私有成员时,可以使用函数友元。 * 在重载运算符或实现某些特定功能时,友元可以提供对类私有成员的直接访问。 需要注意的是,友元机制破坏了封装性,因为其他类或函数可以直接访问被授予友元权限的类的私有成员。因此,应谨慎使用友元,只在必要的情况下使用,并且仅将其授予最少的访问权限。

⚠️ **风险**:友元机制虽然提供了便利,但也存在风险,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。因此,在使用友元机制时需要谨慎,尽量避免过度使用,只在必要的情况下使用,并且仅将其授予最少的访问权限。

💡 **总结**:友元机制是C++中的一种特殊机制,它允许打破封装性,在特定场景下提供访问私有成员的权限。在使用时需要权衡利弊,谨慎使用,避免过度使用,以维护代码的封装性和可维护性。

1.友元介绍

在C++中,友元(friend)是一种机制,允许某个类或函数访问其他类的私有成员。通过友元,可以授予其他类或函数对该类的私有成员的访问权限。友元关系在一些特定的情况下很有用,例如在类之间共享数据或实现特定的功能。

友元可以分为两种类型:类友元和函数友元。

2.类友元

类友元(Friend Class):

2.1示例代码

class FriendClass {private:    int privateData;public:    FriendClass() : privateData(0) {}    friend class OtherClass;  // 声明 OtherClass 是 FriendClass 的友元类};class OtherClass {public:    void accessPrivateData(FriendClass& obj) {        obj.privateData = 42;  // 可以直接访问 FriendClass 的私有成员    }};

3.函数友元

函数友元(Friend Function)

可以将一个函数声明为一个类的友元函数。这样,在友元函数中可以直接访问该类的私有成员。友元函数可以是非成员函数,也可以是其他类的成员函数。友元函数通常在类的声明部分或声明外部使用 friend 关键字来声明。

3.1示例代码

class MyClass {private:    int privateData;public:    MyClass() : privateData(0) {}    friend void friendFunction(MyClass& obj);  // 声明 friendFunction 是 MyClass 的友元函数};void friendFunction(MyClass& obj) {    obj.privateData = 42;  // 可以直接访问 MyClass 的私有成员}

4.总结

友元的使用场景包括但不限于以下情况:

在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。

下面我们来看一段代码,看看我们是如何利用友元来访问类的一切成员的:#include <iostream> using namespace std; class Internet { public: Internet(char *name,char *address) // 改为:internet(const char *name , const char *address){ strcpy(Internet::name,name); strcpy(Internet::address,address); } friend void ShowN(Internet &obj);   //友元函数的声明 public:              // 改为:privatechar name[20]; char address[20]; }; void ShowN(Internet &obj)        //类外普通函数定义,访问a对象的保护成员name,不能写成,void Internet::ShowN(Internet &obj) { cout<<obj.name<<endl;          //可访问internet类中的成员} void main() { Internet a("谷歌","http://www.google.cn/";); ShowN(a); cin.get(); }       示例2:      分别定义一个类A和类B ,各有一个私有整数成员变量通过构造函数初始化;类A有一个成员函数Show(B &b)用来打印A和B的私有成员变量,请分别通过友元函数和友元类来实现此功能。使用友元类 和 友元函数实现:#include <iostream> using namespace std;class B;class A;void Show( A& , B& ); class B{private:int tt;friend class A;friend void Show( A& , B& ); public:B( int temp = 100):tt ( temp ){} }; class A{private:int value;friend void Show( A& , B& ); public:A(int temp = 200 ):value ( temp ){} void Show( B &b ){  cout << value << endl;  cout << b.tt << endl; }}; void Show( A& a, B& b ){cout << a.value << endl;cout << b .tt << endl;} int main(){A a;B b;a.Show( b );Show( a, b );      return 0;}

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

C++ 友元 封装 访问权限 类友元 函数友元
相关文章