当前位置: 首页 > article >正文

C++中声明友元

C++中声明友元

不能从外部访问类的私有数据成员和方法,但这条规则不适用于友元类和友元函数。要声明友元
类或友元函数,可使用关键字 friend,如以下示例程序所示:

使用关键字 friend 让外部函数 DisplayAge( )能够访问私有数据成员

#include <iostream>
#include <string>
using namespace std;

class Human
{
    private:
    friend void DisplayAge(const Human& person);
    string name;
    int age;

    public:
    Human(string humansName, int humansAge) 
    {
        name = humansName;
        age = humansAge;
    }
};

void DisplayAge(const Human& person)
{
    cout << person.age << endl;
}

int main()
{
    Human firstMan("Adam", 25);
    cout << "Accessing private member age via friend function: ";
    DisplayAge(firstMan);

    return 0;
}

输出:

Accessing private member age via friend function: 25

分析:
第 7 行的声明告诉编译器,函数 DisplayAge( )是全局函数,还是 Human 类的友元,因此能够访问
Human 类的私有数据成员。如果将第 7 行注释掉,第 22 行将导致编译错误。与函数一样,也可将外部类指定为可信任的朋友,如以下程序所示:

#include <iostream>
#include <string>
using namespace std;

class Human
{
private:
   friend class Utility;
   string name;
   int age;

public:
   Human(string humansName, int humansAge) 
   {
      name = humansName;
      age = humansAge;
   }
};

class Utility
{
public:
   static void DisplayAge(const Human& person)
   {
      cout << person.age << endl;
   }
};
   
int main()
{
   Human firstMan("Adam", 25);
   cout << "Accessing private member age via friend class: ";
   Utility::DisplayAge(firstMan);

   return 0;
}

输出:

Accessing private member age via friend class: 25

分析:
第 7 行指出 Utility 类是 Human 类的友元,该声明让 Utility 类的所有方法都能访问 Human 类的私
有数据成员和方法。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程


http://www.kler.cn/a/145350.html

相关文章:

  • 指针的介绍3后
  • 复古壁纸中棕色系和米色系哪个更受欢迎?
  • 渗透测试之WAF规则触发绕过规则之规则库绕过方式
  • 从替代到覆盖:暴雨信创服务器打开市场新局面
  • Windows11 安装poetry
  • neo4j-community-5.26.0 install in window10
  • 90. 打家劫舍II (房子围成一圈)
  • 【理解ARM架构】操作寄存器实现UART | 段的概念 | IDE背后的命令
  • linux shell操作 - 05 进程 与 IO 模型
  • vue--The template root requires exactly one element.的解决办法
  • RT-DETR 更换损失函数之 SIoU / EIoU / WIoU / Focal_xIoU
  • 【LeetCode】挑战100天 Day17(热题+面试经典150题)
  • 第四题-abb 【第六届传智杯程序设计挑战赛解题分析详解复盘】(JavaPythonC++实现)
  • 【数据结构实验】排序(一)冒泡排序改进算法 Bubble及其性能分析
  • 数据结构-归并排序+计数排序
  • leetcode中“辅助栈”类题目和“单调栈”类题目的异同
  • Redis当中的BitMap,实现github打卡功能
  • 嵌入式设备摄像头基础知识
  • Python算法——霍夫曼编码树
  • tensorflow和pytorch的联系与区别
  • 基于PyQT5的图像分类网络训练平台
  • 鸿蒙开发报错:agconnect sdk not initialized. please call initialize()【BUG已解决】
  • Go 异常处理流程
  • 第六题-红和蓝【第六届传智杯程序设计挑战赛解题分析详解复盘】(JavaPythonC++实现)
  • 《数据结构与算法之美》读书笔记2
  • c语言实现10进制转16进制