C++:友元

友元(friend)是 C++ 中的一个关键字,用于建立类之间的友好关系;通过友元关系,一个类可以授权其他类或函数访问其私有成员或受保护成员,从而突破了 C++ 中的封装性;友元可以是类或函数,可以出现在类的声明中,也可以出现在类的外部,在声明中,友元关键字表明了某个函数或类是另一个类的友元,从而被授权访问该类的私有或受保护成员。

友元访问权限

友元关系为双向授权,即如果类 A 是类 B 的友元,但是类 B 不一定是类 A 的友元。
友元关系不具有传递性,即如果类 A 是类 B 的友元,而类 B 又是类 C 的友元,类 C 并不会自动成为类 A 的友元。

友元函数

友元函数是一个不属于任何类的普通函数,但被授权访问一个或多个类的私有或受保护成员。通过友元函数,可以实现对类的封装性的一定程度的突破,允许外部函数直接访问类的私有成员,以执行特定的操作。

class FriendTest
{
public:
    //声明友元函数
    friend void getPriNum(FriendTest &obj);
    
private:
    int nPriNum = 200;
};
​
//定义友元函数
void getPriNum(FriendTest &obj)
{
    std::cout << "private number:" << obj.nPriNum << std::endl;
}
​
int main() {
    FriendTest fritTestObj;
    //调用友元函数
    getPriNum(fritTestObj);
​
    system("pause");
    return 0;
}

在这个例子中,FriendTest 类中有一个私有成员 nPriNum,而 getPriNum() 函数被声明为 FriendTest 类的友元函数。这意味着 getPriNum 函数可以直接访问 FriendTest 对象的私有成员 nPriNum

main 函数中,我们创建了一个 FriendTest 对象 fritTestObj,然后调用了友元函数 getPriNum(),从而输出了 nPriNum 的值。

友元类

友元类是指一个类可以访问另一个类的私有或受保护成员。通过友元类,一个类可以授权另一个类访问自己的私有或受保护成员,从而实现了类之间的更紧密的合作关系。

class FriendB;
​
class FriendTest
{
private:
    int nPriNum = 200;
    //友元类声明
    friend class FriendB;
};
​
class FriendB {
public:
    void getFriendNumber(FriendTest &obj) {
        std::cout << "FriendPrivateNumber:"<< obj.nPriNum << std::endl;
    };
};
​
int main() {
    FriendTest friendObj;
    //getPriNum(friendObj);
​
    FriendB friendBobj;
    friendBobj.getFriendNumber(friendObj);
    system("pause");
    return 0;
}

在这个例子中,FriendTest 是一个包含私有成员 nPriNum 的类。然后,FriendB 类被声明为 FriendTest 的友元类,这意味着 FriendB 类可以访问 FriendTest 类的私有成员。在 FriendB 类的 getFriendNumber 成员函数中,我们可以直接访问 FriendTest 类的私有成员 nPriNum。在 main 函数中,我们创建了一个 FriendTest 对象 objA 和一个 FriendB 对象 friendBobj,然后通过 friendBobj 访问并打印了 FriendTest 的私有成员变量 nPriNum

相关推荐

  1. C++】函数

    2024-05-12 21:58:03       62 阅读
  2. C++

    2024-05-12 21:58:03       43 阅读
  3. c++ 函数

    2024-05-12 21:58:03       32 阅读
  4. C++friend

    2024-05-12 21:58:03       32 阅读
  5. C++基础——

    2024-05-12 21:58:03       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-12 21:58:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-12 21:58:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-12 21:58:03       82 阅读
  4. Python语言-面向对象

    2024-05-12 21:58:03       91 阅读

热门阅读

  1. Kubernetes 文档 / 概念 / Kubernetes 架构 / 控制器

    2024-05-12 21:58:03       35 阅读
  2. QSharedPointer的使用

    2024-05-12 21:58:03       37 阅读
  3. 2024.5.12 Pandas 基础语法day02

    2024-05-12 21:58:03       30 阅读
  4. Dockerfile中的CMD和ENTRYPOINT

    2024-05-12 21:58:03       30 阅读
  5. 给数据库贴标签

    2024-05-12 21:58:03       29 阅读
  6. docker————容器的管理

    2024-05-12 21:58:03       31 阅读
  7. Spring AOP和IOC

    2024-05-12 21:58:03       23 阅读
  8. 5月8日爬楼梯+使用最小花费爬楼梯

    2024-05-12 21:58:03       32 阅读
  9. 从零学算法6

    2024-05-12 21:58:03       32 阅读