【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 ...
随机推荐
- MySQL server has gone away && Lost connection to MySQL server during query
问题一.MySQL server has gone away ##### peewee from peewee import * from peewee import __exception_wrap ...
- CSS块元素
一.典型代表: Div h1-h6 p ul li 二.特点: 独占一行 可以设置宽高 嵌套(包含)下,子块元素宽度(没有定义情况下)和父块元素宽度默认一致. <style type=" ...
- CSS文本元素
一.属性 font-size:16px; 文字大小 Font-weight: 700 ; 值从100-900,文字粗细,不推荐使用font-weight:bold; Font-family:微软 ...
- 暂时性死区TDZ理解与总结
为什么会出现暂时性死区? 先来看看 ES6 标准中对 let/const 声明中的解释 第13章,有如下一段文字:The variables are created when their contai ...
- Noip2019暑期训练2 反思
经过两次测试,通过深刻的反思,我主要发现了以下易犯错误: 1.做题目时过于追求速度,导致好几处代码都出现手误打错的现象!而且,千万不要图快.图方便就复制粘贴,非常容易出错!(例如T3-party中直接 ...
- 东站七雄保C位!论三线楼市网红板块的自我修养
不对!东站板块才是伍家岗的C位.这里有东站七雄! 前些天发了一篇城东C位之路的文章,居然引发了诸葛说房聊天群内大佬的激烈纷争.公说公有理婆说婆有理,一时争的是不可开交,大有约架之势.所以我决定提前写& ...
- go -- go 程序 启动docker容器
package main import ( "io" "log" "os" "time" "github.co ...
- Unity 现代室内环境场景高效流程视频教程 附源文件 中文字幕
大小1.83G,中文字幕 章节内容:1.项目介绍2.准备maya工程文件3.素材资产(assets)结构4.管理unity中的maya资产5.整合场景6.unity游戏对象及材质7.第一人称控制器8. ...
- 文件数据库sqlite3 C++ 线程安全和并发
转载:https://www.cnblogs.com/feng9exe/p/10682567.html(线程安全和并发) 转载:https://juejin.im/post/5b7d8522e51d4 ...
- HttpUtils(2)
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; impo ...