C++封装的类增加了对类中数据成员的访问限制,从而保证了安全性。如想访问类中的私有成员需要通过类中提供的公共接口来访问,这样间接的访问方式,无疑使得程序的运行效率有所降低。

友元的提出可以使得类外的函数来访问类中的私有成员,保护成员。

友元的使用分为三类:

1.类外的普通函数声明为该类的友元函数。

格式: friend 类型 函数名(形参)

2.其他类的成员函数声明为该类的友元函数。

格式:friend 类型 类名::函数名(形参)

3.其他类为该类的友元类,这样类中的所有成员函数都是该类的友元函数。

格式:friend class 类名

代码演示:

#include <iostream>

using namespace std;

class A;

class B
{
public:
//类B的成员函数为类A的友元函数
void display(A &a);
}; class C
{
public:
//类C是类A的友元类
void display(A &a);
}; class A
{
public:
A(int i):x(i){} int getX()
{
return x;
} friend void display(A &a);
friend void B::display(A &a);
friend C; private:
int x;
}; //类外普通函数为类A的友元函数
void display(A &a)
{
cout << a.x << endl; //友元函数直接访问类中的私有成员
} void B::display(A &a)
{
cout << a.x << endl;
} void C::display(A &a)
{
cout << a.x << endl;
} int main()
{
A a(18); //无法直接访问类A的私有变量x,需要通过对外提供的函数来访问
cout << a.getX() << endl; //类B的成员函数为类的A的友元函数
B b;
b.display(a); //类C是类A的友元类
C c;
c.display(a); return 0;
}

总结:

1.友元声明在类中,但并不属于该类的成员。

2.友元的关系不能继承。

3.在类的任何位置声明友元都行,不受访问权限限制。

4.友元关系提高了程序效率,但破坏了数据的安全性。慎重使用。

5.友元的关系是单向。如类B是类A的友元,反过来类A不一定是类B的友元,看类B中是否有声明。

【C++札记】友元的更多相关文章

  1. C++的友元类和友元函数实例

    #include <math.h> #include<iostream> using namespace std; class Point { public: Point(do ...

  2. C++学习笔记 构造&析构 友元 new&delete

    构造&析构函数 构造函数 定义:与类同名,可以有参可以无参,主要功能用于在类的对象创建时定义初始化的状态,无返回值,也不能用void修饰,构造函数不能被直接调用,必须通过new运算符在创建对象 ...

  3. c++友元函数

    c++友元函数分两类: 一://友员全居函数 /*#include <iostream>using namespace std;class aaa{    friend void prin ...

  4. 重载运算符:类成员函数or友元函数

    类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...

  5. C++之友元

    友元提供了不同类的成员函数之间.类的成员函数与一般函数之间进行数据共享的机制.通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员.C++中的友元为封装隐藏这堵不透明的墙开了一 ...

  6. Python札记 -- 装饰器补充

    本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...

  7. 不可或缺 Windows Native (20) - C++: 友元函数, 友元类

    [源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...

  8. InternalsVisibleToAttribute——把internal成员暴露给指定的友元程序集

    友元程序集简介 我们知道一个类中被定义为internal的成员(包括类型.方法.属性.变量.事件)是只能在同一个程序集中被访问到的(当然了,我这里说的是正常的方式,不包括通过反射来访问).这个规则在. ...

  9. c++ 操作符重载和友元

    操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...

随机推荐

  1. 如何用okr做好目标规划

    有朋友和我吐槽公司总是规划一个个振奋人心的目标,让大家对工作充满了热情.然而好的开头却缺少追踪反馈没有好的结尾,那些大家所渴望达成的目标随着时间的流逝便逐渐没有了音信,不再有人主动提起,团队成员迎来的 ...

  2. Lightning Web Components 组件生命周期(六)

    组件创建以及渲染流程 组件移除dom 处理流程 组件从dom 移除 组件中的disconnectedCallback() 方法被调用 子组件从dom 移除 每个子组件的disconnectedCall ...

  3. Evaluation of Sampling and Cross-Validation Tuning Strategies for Regional-Scale Machine Learning Classification

    比较了不同抽样方法(随机,分层等比随机,分层不等比随机,人为),不同交叉验证方法(k折,留一法,蒙特卡洛),不同样本范围大小的效果,最后都是用SVM分类 结果是k折验证最好,人为选择样本最差.小范围小 ...

  4. Luogu3379 【模板】最近公共祖先(LCA)

    题面 题解 这里讲一种硬核做法. 首先\(\mathrm{dfs}\)整棵树,求出这棵树的欧拉序,然后\(\mathrm{LCA}\)问题就变成了\(\pm 1\mathrm{RMQ}\)问题. 考虑 ...

  5. 照片放大功能h5

    这里就不放图了,放大的是别人的身份证 <template> <div class="image-cell__wrapper" :style="borde ...

  6. 每天有300W的pv,我们单台机器的QPS为58,大概需要部署几台这样机器?

    每天有300W的pv,我们单台机器的QPS为58,大概需要部署几台这样机器? 一.总结 一句话总结: ( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS) 13 ...

  7. python 文件夹下的图片转PDF

    from PIL import Image import os def rea(path, pdf_name): file_list = os.listdir(path) pic_name = [] ...

  8. iostat参数说明

    一直不太会用这个参数.现在认真研究了一下iostat,因为刚好有台重要的服务器压力高,所以放上来分析一下.下面这台就是IO有压力过大的服务器 # iostat -x 1 10 Linux 2.6.18 ...

  9. beyond compare解决特殊字符无法输出、多sheet页无法对比以及文件太大超出系统内存问题的Excel转txt脚本

    beyond compare解决特殊字符无法输出.多sheet页无法对比以及文件太大超出系统内存问题的Excel转txt脚本 ' XLS_to_CSV.vbs ' ' Converts an Exce ...

  10. tensorflow运行时openssl与boringssl兼容性问题

    tensorflow中,grpc使用boringssl进行加密,boringssl是google基于openssl自行开发的一条分支,有许多相同函数,但底层实现以及支持的加密类型有不同. 且tenso ...