C++——友元 内部类
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++——友元 内部类相关推荐
- 【C++学习】类和对象 | 友元 | 内部类 | 匿名对象 | 内存管理 | new
目录 1. 友元 1.1 友元函数 1.2 友元类 2. 内部类 3. 匿名对象 4. 内存管理 5. C++的动态内存 写在最后: 1. 友元 1.1 友元函数 来看这段代码: #include & ...
- C++类和对象:友元内部类
标题 友元 1 友元类: 2 友元成员函数: 3 友元函数: <<重载为成员函数 <<重载为友元函数 内部类 友元 类之间只允许通过公有的外部接口访问,不允许其它类程序代码访问 ...
- C++ 类和对象(三):构造函数补充、匿名对象、友元、内部类、类的static与const
构造函数补充 匿名对象 友元 内部类 类的static成员 类的const成员 构造函数补充 列表初始化 讲列表初始化之前,要先讨论一下构造函数里面的语句到底是不是初始化 例子还是上次的日期类 cla ...
- C++入门>>初识类
文章目录 前言: 认识面向过程与面向对象 封装 浅谈C的结构体与C++类 类与对象–上篇 class的引入 类的定义 类中的限定符 类的实例化 如何计算类的大小 隐形的this指针!!!!非常重要 t ...
- C++ 类的知识 | 构造函数再探、匿名对象、友元函数、内部类、类的const成员、类的static成员
文章目录 构造函数再探 以下代码共调用多少次拷贝构造函数 委托构造函数 概念 形式 匿名对象 友元 友元的声明 友元类 令成员函数作为友元 函数重载和友元 注意 内部类 特性 类的const成员 可变 ...
- 3-8:类与对象下篇——友元函数、友元类和内部类
文章目录 一:友元函数 (1)友元函数 (2)友元类 二:内部类 一:友元函数 C++运算符重载为我们带来了极大的便利.因此,对于日期类这样的自定义类型,就可以重载运算符<<,然后使用co ...
- 友元程序集(C# 和 Visual Basic)
友元程序集(C# 和 Visual Basic) Visual Studio 2013 "友元程序集"是一种能够访问其他程序集的 Friend (Visual Basic) 或 i ...
- C++友元函数简单示例
友元函数专业解释:友元函数是可以直接访问类的私有成员的非成员函数. 它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend. 在我看来,友 ...
- 【C++】-- 友元
目录 一.为什么要使用友元 二.友元函数 1.友元函数定义 2.友元函数特性 三.友元类 1.友元类定义 2.友元类特性 四.内部类 1.内部类定义 2.内部类特性 五.总结 一.为什么 ...
最新文章
- 杨剑勇:物联网是一个未来概念?其实就在身边
- 在浏览器中进行深度学习:TensorFlow.js (一)基本概念
- pb 哪里找到系统图标_win10电脑桌面上“回收站”和“此电脑”图标不见了怎么办...
- Application log debug - storage
- 如何用Python进行数据探索,探索竞赛优胜方案?
- MySQL优化(二):索引的类型、匹配原则、创建原则
- [11] ADB 实用功能
- [转载] python的系统模块_Python操作系统模块
- 【洛谷习题】又是毕业季II
- STM32——PWM知识详解
- 亚楠魔域单机V6一键端分享
- java todo注释_Java自定义注解
- 准备一个月,考过软件系统架构师
- c语言贪吃蛇游戏问题描述,贪吃蛇小游戏的几个问题
- 对于多组数据输入输出的基础题目
- 【整理学习Hadoop】Hadoop学习基础之一:服务器集群技术
- SecureCRT 多个会话显示在同一窗口
- MySQL数据库 学习(二)架构系统表
- model_zoo里面有各种预训练模型
- 计算机图像处理领域重要期刊汇总
热门文章
- python 自带time模块 获取上个月的时间数据(其他时间以此类推)
- 混沌数学之Baker模型
- 2019年山东计算机单招学校,2019年山东高职单招学校名单有哪些
- 机器学习算法线上部署方法
- 对于左值和右值的理解
- 【云场景实践研究合集】联合不是简单的加法,而是无限的生态,谁会是下一个独角兽...
- 03 【PMP】组织结构类型的优缺点和适用范围包括哪些
- STM32F765IGK6【ARM微控制器】STM32F765ZIT6/STM32F765ZGT6引脚配置
- DOS命令使用大全——浪子回头再来看
- 中国新能源汽车产业链深度分析及投资前景规划报告2022-2027年