友元函数 友元类 友元成员函数

友元

一般来说,类内的私有数据是对外不可见的,但在有些情况下,我们需要在类外对该类的私有数据进行访问,这就需要用到一种新技术——友元(friend),即在声明前添加关键字friend

友元关系是单向的,即如果A是B的友元,但B不一定是A的友元;
友元关系无传递性,即如果A是B的友元,B是C的友元,但A不一定是C的友元。


1. 友元函数

友元函数是指某些非类成员函数,但可以访问类内的私有数据。

#include <iostream>
using namespace std;class A {
private:int data;
public:A() : data(1) {}friend void show( const A& t );  //添加friend定义友元函数
};  /* 友元函数在类外声明时不加friend */
void show( const A& t ) {cout << "data = " << t.data << endl;  
}int main(void) {  A a;show(a);  return 0;  
}/*运行结果:
data = 1*/

2. 友元类

友元类是指若需要在类B中直接访问类A的私有数据,因此将B作为A的友元(在A中声明friend class B;)。
友元类中的成员函数、私有数据都可以在另一个类中被使用(即类B中可以直接使用类A的私有数据等)

class Tv {
private: int state;
public: friend class Remote;  //声明Remote为Tv的友元类enum{ Off, On };Tv( int s = Off ) : state(s) {}void onoff() { state = (state == On) ? Off : On; }
};class Remote {
public: void onoff( Tv & t ) { t.onoff(); }
};

3. 友元成员函数

友元成员函数是指类中的一个成员函数被定义为友元函数。
与友元类不同的是,只有友元成员函数可以在另一个中被使用,其余函数都不可以。

#include <iostream>
using namespace std;class B;  //前向声明class A{
private: int a;
public: A() { a = 1; }void print( B & b );
};/* 示例位置1 */class B{
private: int b;
public: B() { b = 6; }void print() { cout << b << endl; }friend void A::print( B & b );  //友元成员函数
};/* 被定义为友元成员函数的函数必须在类外(另一个使用该函数的类后面)定义 */
void A::print( B & b ) {cout << "b = " << b.b << endl;
}int main() {A a;B b;a.print( b );return 0;
}/*输出结果:
b = 6*/

需要注意的是:
(1)类的前向声明。由于在A中的print函数需要使用B,如果不进行B的前向声明,编译器就不知道B是一个类,会报错。
(2)类的排列顺序。在类B中会用到A的方法print(),因此需要先定义A,再定义B。
(3)友元成员函数的定义位置。友元成员函数不能使用内联代码,类中只能有函数声明。函数定义需要放到类之后,在类外进行定义,而且必须放到另一个类定义的后面。(对上面代码来说,若将A::print()的定义放在类B定义之前——示例位置1处,也会报错,提示类B未完成)

对于友元的位置在何处生明,可以简单记为friend在哪,哪个就可以被外面直接访问。(friend在类A,A就可以被其他特定位置访问)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uva 120——Stacks of Flapjacks

题意&#xff1a;一个非常有趣的问题&#xff0c;就是给一摞煎饼&#xff0c;然后从下面拿起来一张&#xff0c;然后把该张上面的所有馅饼反转&#xff0c;求最后使得馅饼从小到大的最小的步数。 思路&#xff1a;贪心。每次都把没排好序的最大数反转到最上面&#xff0c;然后在…

[Diary]我也要向菁儿检讨一下

看到了CS版&#xff0c;angel 因为没能按时参加聚会发的检讨贴&#xff0c;觉得我也有必要检讨一下。&#xff08;一&#xff09; 菁儿昨天大概很生气吧&#xff0c;前天下午本来答应和她昨天下午一起去参加CS版版聚的&#xff0c;因为学校里难得有一些聚会可以认识一些朋友&am…

继承与动态内存分配

继承与动态内存分配 在基类或派生类中含有指针时&#xff0c;要考虑内存分配情况&#xff08;new与delete&#xff09;&#xff0c;还要考虑在进行对象间赋值时指针隐藏的问题&#xff08;使用默认复制构造函数在析构时会造成原对象中的指针指向的内存空间被释放&#xff0c;为…

再谈VC++中ListControl排序[原创]

2005.01.05发表于blog.csdn.net/zxub  昨天做了ListControl中的排序功能&#xff0c;但是使用后&#xff0c;发现只有在第一次数据完全没排序的时候&#xff0c;排序才是正确的&#xff0c;仔细看了下排序用到的回调函数&#xff1a;  int CALLBACK CStaMDiag::CompareFunc…

uva 11572 ——Unique Snowflakes

题意&#xff1a;给定一个序列&#xff0c;然后在这个序列找到一个连续的串&#xff0c;使得串中没有重复的元素。 思路&#xff1a;单调队列。每次都把该在序列没出现的数加入到序列中&#xff0c;然后向后扫描找到最大的ans。 code&#xff1a; //#incllude <bits/stdc.h&…

使用.NET类库操作CSV文件

CSV文件&#xff0c;是指使用逗号对数据进行分割的文本数据文件。昨天有人提出了一个问题&#xff0c;就是怎么对CSV文件进行操作&#xff0c;并且给出了一个类的定义。我根据这个类定义实现了一个能够读些CSV文件的类。由于涉及到了字符串操作&#xff0c;为了提高查询、替换性…

uva 11054——Wine trading in Gergovia

题意&#xff1a;有n个村庄&#xff0c;每个村庄要么买酒&#xff08;&#xff09;&#xff0c;要么卖酒&#xff08;-&#xff09;&#xff0c;要求供需平衡&#xff0c;求最小代价&#xff08;代价k为把k个单位的酒运到相邻的村庄&#xff09;。 思路&#xff1a;贪心。可以把…

uva 1312——Cricket Field

题意&#xff1a;在w*h的方格内&#xff0c;找出一个最大的正方形&#xff0c;使得正方形内没有点&#xff08;可以在边界有点&#xff09;。 思路&#xff1a;枚举。正方形可以看作是矩形&#xff0c;只不过在取的时候取最短的那条边作为边长&#xff0c;那么枚举出短边最大的…

【操作系统】页面置换算法

页面置换算法 在进程运行过程中&#xff0c;若需要访问的物理块不在内存中&#xff0c;就需要通过一定的方式来将页面载入内存&#xff0c;而此时内存很可能已无空闲空间&#xff0c;因此就需要一定的算法来选择内存中要被置换的页面&#xff0c;这种算法就被称为页面置换算法。…

uva 1617——Laptop

题意&#xff1a;有n个长度为1的线段&#xff0c;确定它们的起点&#xff0c;使得第i个线段在【ri&#xff0c;di】之间&#xff0c;输出空隙数目的最小值。 思路&#xff1a;贪心。首先对区间进行排序&#xff0c;然后扫描一遍&#xff0c;当上一个线段最右边加1《当前最左的点…

ubuntu18.04安装、配置dosbox

1 安装dosbox&#xff1a;打开终端&#xff0c;输入&#xff1a; sudo apt install dosbox 2 安装完成后&#xff0c;启动dosbox&#xff0c;在终端输入&#xff1a; dosbox 3 设置自动挂载 退出dosbox&#xff0c;在终端中输入&#xff1a; vim .dosbox/dosbox-0.74.con…

关于 SENDKEYS 的代码

sendkeys 的用法&#xff08;MSDN&#xff09;&#xff1a; SendKeys 语句 将一个或多个按键消息发送到活动窗口&#xff0c;就如同在键盘上进行输入一样。 语法 SendKeys string[, wait] SendKeys 语句的语法具有以下几个命名参数&#xff1a; 部分描述string必需的。字符串表…

uva 1615——Highway

题意&#xff1a; 给定平面上n个点&#xff0c;和一个值D&#xff0c;要求在x轴上选出尽量少的点&#xff0c;使得对给定的点&#xff0c;都有一个点离他的欧几里德距离步超过D。 思路&#xff1a;区间覆盖问题。以平面上的点为圆心&#xff0c;以D为半径&#xff0c;求出来一个…

解决linux写入ntfs盘时报错:只读文件系统

[2018.10.28 更新] 可能因为在挂载wimdows盘后&#xff0c;强制关机造成的&#xff0c;可使用 sudo ntfsfix /dev/*** 来修复。其中&#xff0c;***为具体哪个盘&#xff0c;例如sudo ntfsfix /dev/sda4 之前一直可以对windows盘进行读写操作&#xff0c;但今天突然不能用了&am…

家里装AD了

通过关系&#xff0c;家里终于装上了ADSL&#xff0c;而且还是130包月的&#xff0c;还免了调测费转载于:https://www.cnblogs.com/d9394/archive/2005/09/28/10611828.html

uva 1613——K-Graph Oddity

题意&#xff1a;输入n个点m条边的联通图&#xff0c;n为奇数&#xff0c;设k为最小的奇数&#xff0c;使得每个点的度数不超过k&#xff0c;要求把节点都涂上颜色&#xff0c;使得相邻节点颜色不一样。 思路&#xff1a;dfs。k的值为奇数&#xff0c;所以k为节点最大度数&…

应用ADO.net得到表

----------------------------------------------------------开发者&#xff1a;开发时间&#xff1a;2004.9.9功能&#xff1a;应用ADO.net得到表----------------------------------------------------------Imports Zy_DataAccessImports SystemImports System.DataImports…

uva 11093——Just Finish it up

题意&#xff1a;环形跑道上有n个加油站&#xff0c;每个站可以加pi单位的油&#xff0c;从当前站开到下一站需要qi的油&#xff0c;问是否能够环游一圈。 思路&#xff1a;枚举。首先如果总需求量>总供给量&#xff0c;那么不可能。否则就枚举起点&#xff0c;如果油箱里的…

【计算机网络】TCP IP通信处理过程

1.数据包首部 每个分层中都会对所发送的数据附加一个首部&#xff0c;其中包含了该层必要的信息&#xff0c;如发送端地址、接收端地址以及协议等相关信息。 2.发送数据包 1&#xff09;应用程序处理 进行编码处理&#xff08;相当于表示层功能&#xff09;&#xff0c;管…

感觉自己越来越浮躁

重新审视自己的技术走向&#xff0c;不得不承认&#xff0c;越来越向上层迈进。但是这不是我喜欢的&#xff0c;一味的追求快速开发&#xff0c;希望自己的开发速度能一个人顶10个人&#xff0c;但是往往容易在项目中迷失自己&#xff0c;很希望能快点结束这段噩梦般的项目&…