C++友元函数和友元类

在C++中,友元(Friend)是一种特殊的访问权限,它允许一个函数或另一个类的成员函数访问某个类的私有(private)成员或受保护(protected)成员。这种机制打破了类的封装性,但在某些情况下,它提供了一种有效的解决方案,比如需要在一个类外部访问其私有成员,但又不想将这些成员设为公有(public)时。

友元函数

友元函数不是类的成员函数,但它可以访问类的所有私有(private)成员和保护(protected)成员。友元函数是通过在类定义中声明,并在类定义外部定义来实现的。声明时,使用friend关键字。

class MyClass {  
private:  
    int x;  
public:  
    MyClass(int val) : x(val) {}  
    friend void friendFunction(MyClass& obj); // 声明友元函数  
};  
  
// 定义友元函数  
void friendFunction(MyClass& obj) {  
    cout << "Value of x: " << obj.x << endl; // 访问私有成员  
}

友元类

友元类是一种特殊的类,它的所有成员函数都可以访问另一个类的私有成员和保护成员。这种关系也是通过friend关键字在另一个类的定义中声明的。

class MyClass {  
private:  
    int x;  
public:  
    MyClass(int val) : x(val) {}  
    friend class FriendClass; // 声明友元类  
};  
  
class FriendClass {  
public:  
    void access(MyClass& obj) {  
        cout << "Value of x: " << obj.x << endl; // 访问MyClass的私有成员  
    }  
};

注意事项

  • 封装性破坏:使用友元会破坏类的封装性,因为它允许外部代码访问类的私有成员。因此,应该谨慎使用。
  • 非对称性:如果类A是类B的友元,并不意味着类B也是类A的友元。友元关系不是相互的。
  • 非传递性:如果类A是类B的友元,类B是类C的友元,并不意味着类A是类C的友元。友元关系不具有传递性。
  • 构造函数和析构函数:友元函数不能是类的构造函数或析构函数,因为构造函数和析构函数有特殊的用途和调用方式。
  • 友元声明:友元声明只是指定了访问权限,而不是函数或类的定义。因此,友元函数或友元类必须在其他地方定义。

通过合理使用友元函数和友元类,可以在保持类封装性的同时,实现一些特定的功能需求。然而,由于它们破坏了封装性,因此应该谨慎使用,并尽可能寻找其他替代方案。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值