【C++】解析friend关键字:概念、友元函数与类的使用

前言

在 C++ 中,friend 关键字用于允许非成员函数或其他类访问类的私有成员和保护成员。需要谨慎使用,确保代码的封装性和维护性。


1. 基本概念

friend 关键字可以用来声明以下几种情况:

  • 友元函数(Friend Functions):非成员函数可以成为某个类的友元,从而访问该类的私有和保护成员。
  • 友元类(Friend Classes):一个类可以成为另一个类的友元,从而允许访问其私有和保护成员。
  • 友元成员函数(Friend Member Functions):其他类的成员函数也可以被声明为友元,从而访问类的私有和保护成员。

2. 友元函数

友元函数是一个非成员函数,但它可以访问类的私有成员和保护成员。声明友元函数的语法如下:

class MyClass {
private:
    int privateData;
public:
    MyClass() : privateData(0) {}

    // 声明友元函数
    friend void showData(const MyClass& obj);
};

// 定义友元函数
void showData(const MyClass& obj) {
    std::cout << "Private data: " << obj.privateData << std::endl;
}

在上面的例子中,showData 函数被声明为 MyClass 的友元函数,因此它可以访问 privateData 成员。


3. 友元类

友元类是一个类,它可以访问另一个类的私有和保护成员。声明友元类的语法如下:

class MyClassB; // 前向声明

class MyClassA {
private:
    int privateData;
public:
    MyClassA() : privateData(42) {}

    // 声明 MyClassB 为友元类
    friend class MyClassB;
};

class MyClassB {
public:
    void display(const MyClassA& obj) {
        std::cout << "Private data from MyClassA: " << obj.privateData << std::endl;
    }
};

在上面的例子中,MyClassB 被声明为 MyClassA 的友元类,因此 MyClassB 可以访问 MyClassAprivateData 成员。


4. 友元成员函数

如果希望其他类的某个特定成员函数可以访问类的私有和保护成员,可以声明这个成员函数为友元:

class MyClassC;

class MyClassA {
private:
    int privateData;
public:
    MyClassA() : privateData(99) {}

    // 声明 MyClassC 的成员函数 foo 为友元
    friend void MyClassC::foo(const MyClassA& obj);
};

class MyClassC {
public:
    void foo(const MyClassA& obj) {
        std::cout << "Private data from MyClassA: " << obj.privateData << std::endl;
    }
};

在这个例子中,MyClassC 的成员函数 foo 被声明为 MyClassA 的友元,因此 foo 可以访问 MyClassAprivateData 成员。


5. 使用 friend 的注意事项

  • 封装性:过度使用友元可能会破坏类的封装性,因此应该谨慎使用。
  • 友元函数的访问权限:友元函数本身不具有类的成员权限,它仅仅是一个非成员函数,但拥有类的访问权限。
  • 友元声明位置:友元声明通常放在类的声明内部,以确保它们的访问权限是明确的。
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值