【C++札记】友元
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++札记】友元的更多相关文章
- C++的友元类和友元函数实例
#include <math.h> #include<iostream> using namespace std; class Point { public: Point(do ...
- C++学习笔记 构造&析构 友元 new&delete
构造&析构函数 构造函数 定义:与类同名,可以有参可以无参,主要功能用于在类的对象创建时定义初始化的状态,无返回值,也不能用void修饰,构造函数不能被直接调用,必须通过new运算符在创建对象 ...
- c++友元函数
c++友元函数分两类: 一://友员全居函数 /*#include <iostream>using namespace std;class aaa{ friend void prin ...
- 重载运算符:类成员函数or友元函数
类成员函数: bool operator ==(const point &a)const { return x==a.x; } 友元函数: friend bool operator ==(co ...
- C++之友元
友元提供了不同类的成员函数之间.类的成员函数与一般函数之间进行数据共享的机制.通过友元,一个不同函数或另一个类中的成员函数可以访问类中的私有成员和保护成员.C++中的友元为封装隐藏这堵不透明的墙开了一 ...
- Python札记 -- 装饰器补充
本随笔是对Python札记 -- 装饰器的一些补充. 使用装饰器的时候,被装饰函数的一些属性会丢失,比如如下代码: #!/usr/bin/env python def deco(func): def ...
- 不可或缺 Windows Native (20) - C++: 友元函数, 友元类
[源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...
- InternalsVisibleToAttribute——把internal成员暴露给指定的友元程序集
友元程序集简介 我们知道一个类中被定义为internal的成员(包括类型.方法.属性.变量.事件)是只能在同一个程序集中被访问到的(当然了,我这里说的是正常的方式,不包括通过反射来访问).这个规则在. ...
- c++ 操作符重载和友元
操作符重载(operator overloading)是C++中的一种多态,C++允许用户自定义函数名称相同但参数列表不同的函数,这被称为函数重载或函数多态.操作符重载函数的格式一般为: operat ...
随机推荐
- Jupyter notebook 自动补全
Jupyter notebook 自动补全 Jupyter notebook使用默认的自动补全是关掉的.要打开自动补全,需修改默认配置. ipython profile create 以上命令会 ...
- AJax的三种响应
AJax的响应 1.普通文本方式(字符串) resp.getWriter().print("你好"); 2.JSON格式当要给前台页面传输 集合或者对象时 使用普通文本传输的时St ...
- 71: libreoj #10151 区间dp
$des$ https://loj.ac/problem/10151 $sol$ 区间dp $f_{i, j}$ 表示区间 $[l, r]$ 合并的最大值 枚举中间点 $k$ $f_{i, j} =m ...
- nuxt如何处理用户登录状态持久化:nuxtServerInit 页面渲染前的store处理
vue-cli项目中,我们可以用vuex-persistedstate,它可以使vuex的状态持久化,页面刷新都不会丢失,原理当然是localStorage啦!当然也可以使用vue-cookies进行 ...
- PHP全栈学习笔记33
javascript能做什么? 语句与注解,标识符,字面量,变量命名规范 JavaScript中的数据类型,其它类型如何转为数据型,操作符 字符方法,数组方法,函数与对象,函数表达式,变量作用域,对象 ...
- Bacteria(优先队列)
题目链接:http://codeforces.com/gym/101911/problem/C 问题简述:给定n个细胞以及每个细胞的大小,相同的细胞能进行融合,如果能融合到只剩1个细胞则输出需要额外增 ...
- springboot2.0整合redis作为缓存以json格式存储对象
步骤1 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr ...
- avalon数据已更新,视图未更新的bug修复
$computed: { pinlei() { var key = this.currentProduct.key || 'youpin'; console.log(key, "我是key& ...
- OpenFOAM——气泡上升
计算域的顶部为大气,其余部分为壁面 流体的物性参数为: 首先进行建模操作,任何建模软件均可,本算例采用ICEM直接建模,生成网格,然后利用OpenFOAM下转化网格,划分完成的网格如下: 网格比较密集 ...
- Confd+Consul 动态生成配置文件
一.Consul安装和配置 1.consul是什么? consul是HashiCorp公司推出的一款工具,主要用于实现分布式系统的服务发现与配置,它提供了以下几个关键特性: 服务发现:Consul客户 ...