C++_友元3-其他友元关系
友元和类的关系还可以更复杂。
举个例子,假设出现了交互式遥控器,交互式遥控器能够让您回答电视节目中的问题,如果回答错误,电视将在控制器上产生嗡嗡声。
这个例子的问题,可以使用新的友元关系来解决。我把它叫做相互的友情。
即一些Remote方法能够像前面那样访问Tv对象,而一些Tv方法也能影响Remote对象。
这可以通过让类彼此成为对方的友元来实现。即相互的友元
即除了Remote是Tv的友元外,Tv还是Remote的友元。
这里对于使用Remote对象的Tv方法,其原型可以再Remote方法类声明之前声明,但必须在Remote声之后定义,以便编译器有足够的信息来编译该方法。
方法如下:(两个类互为友元类)
class Tv
{
friend class Remote;
public:
void buzz(Remote & r);
...
};
class Remote
{
friend class Tv;
public:
void Bool volup(Tv & t) {t.volup();}
}
//buzz方法的声明和定义是分开的,定义要在Remote声明之后,这是因为这个时候编译器编译该方法时,知道Remote指的是什么了;
inline void Tv::buzz(Remote & r)
{
...
}
还有一种友元的情况是共同的友元:
需要使用友元的另一种情况是,函数需要访问两个类的私有数据。
从逻辑上看,这样的函数时每个类的成员函数,但是这是不可能的。
它可以是一个类的成员,同时是另一个类的友元,但有时将函数作为两个类的友元更加合理。
例如,假定有一个Probe类和一个Analyzer类,前者表示某种可编程的测量设备,后者表示某种可编程的分析设备。
这两个类中都有内部时钟,且希望它们能够同步,则应包含下述代码行:
class Analyzer //forward declaration
class Probe
{
friend void sync(Analyzer & a, const Probe & p); // sync a to p
friend void sync(Probe & p, const Analyzer & a); // sync p to a
...
} class Analyzer
{
friend void sync(Analyzer & a, const Probe & p); // sync a to p
friend void sync(Probe & p, const Analyzer & a); // sync p to a
...
} //define the friend functions
inline void sync(Analyzer & a, const Probe & p)
{
...
} inline void sync(Probe & p, const Analyzer & a)
{
...
}
前向声明使得编译器看到Probe类声明中的友元声明时,知道Analyzer是一种类型。
关于友元的总结:
理解友元的产生和意义,首先要从类说起;
类对象的私有和保护数据成员只能通过类的公有方法访问。(这里暂时不讨论类的继承)
这样做的好处是提高了数据的安全性和封装性,接口简洁。
但是这种对数据的访问和修改的强限制手段,有时候会在某些场景下不方便。
有些情况可能需要直接去访问或修改类的私有数据成员。那么为了提高类修改私有数据的灵活性,引入友元的概念。
举个例子:假如你把一个人定义成朋友,那么这个朋友也获得了进出你家的资格,而不仅仅是你的家人。
但是你的朋友不是你的家人,是有别于你的家人。所以友元不是类的成员。
友元可以是函数,类的成员函数,甚至类;
其实还可以这样理解:把友元看成与类方法一样都是表达类接口的一种方式。
C++_友元3-其他友元关系的更多相关文章
- String类型_static成员_动态内存分配_拷贝构造函数_const关键字_友元函数与友元类
1:String类型 #include <iostream> using namespace std; int main() { //初始化方法 string s1 = "hel ...
- C++学习12 友元函数和友元类
友元函数和友元类在实际开发中较少使用,想快速学习C++的读者可以跳过本节. 一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有 ...
- C++:友元(非成员友元函数、成员友元函数、友元类)
3.8 友元:友元函数和友元类 友元函数 :既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数,统称为友元函数.友元函数不是当前类的成员函数,而是独立于类的外部函数,但它可以访问该类所有的 ...
- 友元(友元函数、友元类和友元成员函数) C++
有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员. 友元(frend)机制允许一个类将 ...
- c++友元函数与友元类
友元函数和友元类的需要: 类具有封装和信息隐藏的特性.只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的.非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这 ...
- C++ friend友元函数和友元类(转)
一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来介绍一种例外情 ...
- 2.19 C++友元函数和友元类
参考: http://www.weixueyuan.net/view/6350.html 总结: 借助friend关键字将其声明为友元函数,结果,在display函数体内,我们就能访问private属 ...
- 【C++基础 05】友元函数和友元类
友元是一种定义在类外部的普通函数或类,但它须要在类体内进行说明,为了与该类的成员函数加以差别,在说明时前面加以keywordfriend. 友元不是成员函数,可是它能够訪问类中的私有成员. 友元的作用 ...
- C++友元函数、友元类
1.什么是友元函数? 友元函数就是可以直接访问类的成员(包括私有数据)的非成员函数,也就是说他并不属于这个类,他是一种外部的函数. 一个外部函数只能通过类的授权成为这个类友元函数,这就涉及到一个关键字 ...
随机推荐
- codeforces:Roads in the Kingdom分析和实现
题目大意:国家有n个城市,还有n条道路,每条道路连通两个不同的城市,n条道路使得所有n个城市相互连通.现在国家经费不足,要关闭一条道路.国家的不便度定义为国家中任意两个不同的城市之间的距离的最大值,那 ...
- C# 堆和栈的区别?
解释1.栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义:堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小 解释2. 存放在栈中时要管存储顺 ...
- 数据结构》关于差分约束的两三事(BZOJ2330)
差分约束,主要用来解决数学中的线性规划问题,通过差值与两个未知数可以转化为单源最长路问题(或负值最短路). 当有一个式子为x1-x2>=a时,我们可以建边,这条边设定为x1比x2大等a(或x2比 ...
- Docker学习笔记_网上资源参考
Docker学习,网上资源参考 1.菜鸟教程: http://www.runoob.com ...
- C++ 输出精度和输出小数点位数
有时候需要调节小数点的精度或者位数 #include<iostream> #include<iomanip> using namespace std; //设置数据精度 set ...
- 16.数据类型(data_type)
CREATE TABLE 语句 CREATE TABLE 语句用于创建数据库中的表. SQL CREATE TABLE 语法 CREATE TABLE 表名称 ( 列名称1 数据类型, 列名称2 数据 ...
- 权限管理RBAC
四张表: 1.module:id/name //模块 2.action:id /module_id/name //权限 3.user:id/name //用户表 4.group:id/user_id ...
- c# 常规验证基类
using System;using System.Collections.Generic;using System.Linq;using System.Text.RegularExpressions ...
- 20169219 实验三 敏捷开发与XP实践 报告
实验内容 1.求命令行传入整数参数的和. package exp3; public class TestArgs01 { public static void main(String[] args) ...
- Laravel框架中的数据库CURD操作、连贯操作、链式操作的用法
Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...