码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++之友元函数和友元类讲解


    目录

    0.C++类中成员变量和成员函数的访问权限

    <0>.C++ 类中可以有 public、protected、private 三种属性的成员。

    <1>.外部类可以通过实例化对象,可以访问public成员。

    <2>.只有本类中的函数可以访问本类的 private 成员。

    <3>.例外情况:通过友元(friend)

    1.友元函数

    <1>.友元函数定义

    <2>.程序例子

    2.友元类

    <1>.友元类定义

    <2>.程序例子


    0.C++类中成员变量和成员函数的访问权限

    <0>.C++ 类中可以有 public、protected、private 三种属性的成员。

    <1>.外部类可以通过实例化对象,可以访问public成员。

    <2>.只有本类中的函数可以访问本类的 private 成员。

    <3>.例外情况:通过友元(friend)

         可以使外部类访问当前类的public、protected、private全部属性的成员函数和成员变量.

    1.友元函数

    <1>.友元函数定义

     在当前类以外定义的、不属于当前类的函数也可以在类中声明,但要在前面加 friend 关键字,这样就构成了友元函数。

     友元函数可以是不属于任何类的成员函数,也可以是其他类的成员函数。

    友元函数可以访问当前类中的所有成员,包括 public、protected、private 属性的。

    <2>.程序例子

    1. #include
    2. using namespace std;
    3. class Box{
    4. public:
    5. Box(int wid): m_width(wid){
    6. cout << "wid = " << wid <
    7. }
    8. //定义test_friend函数是Box类的友元函数,Box类的所有成员都可以通过它来访问,包括private和
    9. protected属性的。
    10. friend void test_friend(Box box);
    11. protected:
    12. void setWidth(int width){
    13. m_width = width;
    14. cout << "width = " << width <
    15. }
    16. private:
    17. int m_width;
    18. };
    19. void test_friend(Box box){
    20. //printWidth是Box类的友元,可以直接访问Box类的任何成员,包括private成员变量和成员函数
    21. box.setWidth(66);
    22. printf("xxx------>%s(), m_width = %d\n",__FUNCTION__,box.m_width);
    23. }
    24. int main( ){
    25. Box box(55);
    26. test_friend(box);
    27. return 0;
    28. }

    2.友元类

    <1>.友元类定义

    C++的friend关键字,不仅可以将一个函数声明为一个类的“朋友”,还可以将整个类声明为另一个类的“朋友”,这就是友元类。友元类中的所有成员函数都是另外一个类的友元函数。

     如果将类B声明为类A的友元类,那么类 B 中的所有成员函数都是类 A 的友元函数,可以访问类 A 的所有成员,包括 public、protected、private 属性的。

    <2>.程序例子

    1. #include
    2. using namespace std;
    3. //提前声明Address类
    4. class Address;
    5. class Student{
    6. public:
    7. Student(char *name): m_name(name){
    8. printf("Student::m_name = %s\n", m_name);
    9. }
    10. void show(Address *addr);
    11. private:
    12. char *m_name;
    13. };
    14. class Address{
    15. public:
    16. Address(char *addr): m_addr(addr){
    17. //printf("Address::m_addr = %s\n", m_addr);
    18. }
    19. //将Student类声明为Address类的友元类,可以访问类Address的所有成员,包括public、protected、private属性的.
    20. friend class Student;
    21. private:
    22. void test_private(){
    23. printf("xxx----->Address::%s(), line = %d\n",__FUNCTION__,__LINE__);
    24. }
    25. char *m_addr;
    26. protected:
    27. void test_protected(){
    28. printf("xxx----->Address::%s(), line = %d\n",__FUNCTION__,__LINE__);
    29. }
    30. };
    31. void Student::show(Address *addr){
    32. cout<< "private::m_addr = " << addr->m_addr <
    33. addr->test_private();
    34. addr->test_protected();
    35. }
    36. int main(){
    37. Student *stu = new Student("ZhangSan");
    38. Address *addr = new Address("china");
    39. stu->show(addr);
    40. return 0;
    41. }

  • 相关阅读:
    linux文件类型
    qml实现路径绘制且可编辑
    PyQt5中的layout布局
    深入浅出Spring Boot接口
    北京化工大学历年真题整理:没考上,换了个学校,但还是在北京~哈哈
    【es8-es11】新特性
    Spring Security 集成 Authing CAS 认证(一)
    汽车数字化转型:存储驱动创新未来
    git的使用场景
    C语言程序——Switch分支选择程序
  • 原文地址:https://blog.csdn.net/u010164190/article/details/128174687
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号