1.  友元函数

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字

举例:

class Date
{friend ostream& operator<<(ostream& _cout, const Date& d);friend istream& operator>>(istream& _cin, Date& d);
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}
private:int _year;int _month;int _day;
};
ostream& operator<<(ostream& _cout, const Date& d)
{_cout << d._year << "-" << d._month << "-" << d._day;return _cout;
}
istream& operator>>(istream& _cin, Date& d)
{_cin >> d._year;_cin >> d._month;_cin >> d._day;return _cin;
}
int main()
{Date d;cin >> d;cout << d << endl;return 0;
}

说明:

  • 友元函数可访问类的所有成员,但不是类的成员函数
  • 友元函数不能用const修饰
  • 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
  • 一个函数可以是多个类的友元函数
  • 友元函数的调用与普通函数的调用和原理相同

2.  友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员

class Time
{friend class Date;
public:Time(int hour, int minute, int second): _hour(hour), _minute(minute), _second(second){}
private:int _hour;int _minute;int _second;
};
class Date
{
public:Date(int year = 1900, int month = 1, int day = 1): _year(year), _month(month), _day(day){}void SetTimeOfDate(int hour, int minute, int second){_t._hour = hour;_t._minute = minute;_t._second = second;}
private:int _year;int _month;int _day;Time _t;
};

友元关系是单向的,不具有交换性,比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但不能在Time类中访问Date类中的私有成员变量

友元关系不能传递,如果B是A的友元,C是B的友元,不能说明C时A的友元

3、内部类

如果一个类定义在另一个类的内部,这个内部的类就叫做内部类

内部类是一个独立的类,它不属于外部类不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限

内部类是外部类的友元类,但是外部类不是内部类的友元,内部类可以通过外部类的对象参数来访问外部类中的所有成员

内部类可以定义在外部类的public、protected、private都是可以的

注意内部类可以直接访问外部类中的static、枚举成员

sizeof(外部类)=外部类,和内部类没有任何关系

class A
{
private:static int k;int h;
public:class B{public:void foo(const A& a){cout << k << endl;cout << a.h << endl;}};
};
int A::k = 1;
int main()
{A::B b;b.foo(A());return 0;
}

C++——友元 内部类相关推荐

  1. 【C++学习】类和对象 | 友元 | 内部类 | 匿名对象 | 内存管理 | new

    目录 1. 友元 1.1 友元函数 1.2 友元类 2. 内部类 3. 匿名对象 4. 内存管理 5. C++的动态内存 写在最后: 1. 友元 1.1 友元函数 来看这段代码: #include & ...

  2. C++类和对象:友元内部类

    标题 友元 1 友元类: 2 友元成员函数: 3 友元函数: <<重载为成员函数 <<重载为友元函数 内部类 友元 类之间只允许通过公有的外部接口访问,不允许其它类程序代码访问 ...

  3. C++ 类和对象(三):构造函数补充、匿名对象、友元、内部类、类的static与const

    构造函数补充 匿名对象 友元 内部类 类的static成员 类的const成员 构造函数补充 列表初始化 讲列表初始化之前,要先讨论一下构造函数里面的语句到底是不是初始化 例子还是上次的日期类 cla ...

  4. C++入门>>初识类

    文章目录 前言: 认识面向过程与面向对象 封装 浅谈C的结构体与C++类 类与对象–上篇 class的引入 类的定义 类中的限定符 类的实例化 如何计算类的大小 隐形的this指针!!!!非常重要 t ...

  5. C++ 类的知识 | 构造函数再探、匿名对象、友元函数、内部类、类的const成员、类的static成员

    文章目录 构造函数再探 以下代码共调用多少次拷贝构造函数 委托构造函数 概念 形式 匿名对象 友元 友元的声明 友元类 令成员函数作为友元 函数重载和友元 注意 内部类 特性 类的const成员 可变 ...

  6. 3-8:类与对象下篇——友元函数、友元类和内部类

    文章目录 一:友元函数 (1)友元函数 (2)友元类 二:内部类 一:友元函数 C++运算符重载为我们带来了极大的便利.因此,对于日期类这样的自定义类型,就可以重载运算符<<,然后使用co ...

  7. 友元程序集(C# 和 Visual Basic)

    友元程序集(C# 和 Visual Basic) Visual Studio 2013 "友元程序集"是一种能够访问其他程序集的 Friend (Visual Basic) 或 i ...

  8. C++友元函数简单示例

    友元函数专业解释:友元函数是可以直接访问类的私有成员的非成员函数. 它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend. 在我看来,友 ...

  9. 【C++】-- 友元

    目录 一.为什么要使用友元 二.友元函数 1.友元函数定义 2.友元函数特性 三.友元类 1.友元类定义 2.友元类特性 四.内部类 1.内部类定义 2.内部类特性 五.总结​​​​​​​ 一.为什么 ...

最新文章

  1. 杨剑勇:物联网是一个未来概念?其实就在身边
  2. 在浏览器中进行深度学习:TensorFlow.js (一)基本概念
  3. pb 哪里找到系统图标_win10电脑桌面上“回收站”和“此电脑”图标不见了怎么办...
  4. Application log debug - storage
  5. 如何用Python进行数据探索,探索竞赛优胜方案?
  6. MySQL优化(二):索引的类型、匹配原则、创建原则
  7. [11] ADB 实用功能
  8. [转载] python的系统模块_Python操作系统模块
  9. 【洛谷习题】又是毕业季II
  10. STM32——PWM知识详解
  11. 亚楠魔域单机V6一键端分享
  12. java todo注释_Java自定义注解
  13. 准备一个月,考过软件系统架构师
  14. c语言贪吃蛇游戏问题描述,贪吃蛇小游戏的几个问题
  15. 对于多组数据输入输出的基础题目
  16. 【整理学习Hadoop】Hadoop学习基础之一:服务器集群技术
  17. SecureCRT 多个会话显示在同一窗口
  18. MySQL数据库 学习(二)架构系统表
  19. model_zoo里面有各种预训练模型
  20. 计算机图像处理领域重要期刊汇总

热门文章

  1. python 自带time模块 获取上个月的时间数据(其他时间以此类推)
  2. 混沌数学之Baker模型
  3. 2019年山东计算机单招学校,2019年山东高职单招学校名单有哪些
  4. 机器学习算法线上部署方法
  5. 对于左值和右值的理解
  6. 【云场景实践研究合集】联合不是简单的加法,而是无限的生态,谁会是下一个独角兽...
  7. 03 【PMP】组织结构类型的优缺点和适用范围包括哪些
  8. STM32F765IGK6【ARM微控制器】STM32F765ZIT6/STM32F765ZGT6引脚配置
  9. DOS命令使用大全——浪子回头再来看
  10. 中国新能源汽车产业链深度分析及投资前景规划报告2022-2027年