c++ friend 关键字详解

在C++中,friend关键字用于声明类的友元(friend),使得其他类或函数可以访问该类的私有成员和保护成员。友元关系是单向的,不是继承的,也不是可传递的。即一个类的友元函数或友元类可以访问该类的私有和保护成员,但是这个友元函数或友元类并不会拥有相应类的特权。

使用friend关键字的场景

  1. 友元函数:
    • 友元函数可以是普通函数,也可以是某个类的成员函数。
    • 友元函数能够访问类的私有和保护成员。
  2. 友元类:
    • 友元类的所有成员函数都可以访问另一个类的私有和保护成员。

友元函数的示例

#include <iostream>
using namespace std;

class Box {
private:
    double width;
public:
    Box(double w) : width(w) {}

    // 声明友元函数
    friend void printWidth(Box box);
};

// 定义友元函数
void printWidth(Box box) {
    cout << "Width of box: " << box.width << endl;
}

int main() {
    Box box(10.0);
    printWidth(box); // 可以访问Box类的私有成员width
    return 0;
}

在这个例子中,printWidth函数被声明为Box类的友元函数,因此它能够访问Box类的私有成员width。

友元类的示例

#include <iostream>
using namespace std;

class Box {
private:
    double width;
public:
    Box(double w) : width(w) {}

    // 声明友元类
    friend class BoxPrinter;
};

class BoxPrinter {
public:
    void printWidth(Box box) {
        cout << "Width of box: " << box.width << endl; // 可以访问Box类的私有成员width
    }
};

int main() {
    Box box(10.0);
    BoxPrinter printer;
    printer.printWidth(box); // 通过友元类访问Box类的私有成员
    return 0;
}

在这个例子中,BoxPrinter类被声明为Box类的友元类,因此BoxPrinter类的所有成员函数都能够访问Box类的私有成员width。

友元关系的特点

  1. 单向性:友元关系是单向的。如果ClassA是ClassB的友元,不代表ClassB也是ClassA的友元。
  2. 非继承性:友元关系不能继承。如果类D继承自类B,且类A是类B的友元,这不意味着类A是类D的友元。
  3. 有限的访问控制:友元使得特定函数或类可以访问类的私有和保护成员,但这应该被谨慎使用,以防破坏封装性。

使用友元的注意事项
使用友元虽然可以方便地访问类的私有成员,但应该谨慎使用,以避免破坏类的封装性和增加类之间的耦合度。友元通常用于:

  • 实现某些操作符重载,如流插入和提取操作符。
  • 需要高度紧密协作的类和函数。
  • 内部实现的细节需要暴露给特定的函数或类时。

总的来说,friend关键字提供了一种灵活的方式来控制访问权限,但在设计类时应尽量保持封装性,只有在确实需要时才使用友元。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值