类允许其他类或者函数访问它的非公有成员,但我们需要将访问类非公有成员的其他类或者函数成为它的友元。

一、友元函数

如果类想要把一个函数作为他的友元,只需要增加一条以 friend 关键字开始的函数声明语句即可。

例如:

class A{

friend void fri_fun(A);

private:

int a=9;

};

void fri_fun(A aa){

cout<

}

在代码中,我们在类 A 中声明了函数 fri_fun ,并以 friend 关键字加以说明,此时我们可以在函数 fri_fun 中访问 A 类的私有成员。

友元的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明。如果我们希望类的用户能过调用某个友元函数,那么我们就必须在友元声明之外再专门对函数进行声明。

一些编译器允许在尚无友元函数的初始声明的情况下就调用它。即使这样,也最好还是提供一个独立的函数声明。

二、友元类

友元类也需要 friend 关键字加以说明。

例如:

class B{

friend class A;

int s=9;

};

class A {

public:

void aa(B c) {

cout << c.s << endl;

}

};

类 A 的成员函数可以访问类 B 的私有成员。

注意:如果我们把类 A 放在类 B 的前边,此时编译会出错,因为在编译类 A 时,我们并没有定义类 B。

我们也可以将成员函数作为另一个类的友元,我们将上一个代码更改,仅仅让类 A 的成员函数 aa 可以访问类 B 的私有成员:

class B;

class A{

public:

void aa(B c);

};

class B{

friend void A::aa(B);

int s=9;

};

void A::aa(B c){

std::cout << c.ss << std::endl;

}

我们将类 A 的成员函数 aa 作为类 B 的友元函数,这是我们必须在类 B 之前声明函数 aa (我们的代码,在类 A 中已经声明),在类 B 之后定义(如果用到类 B 的成员),在友元声明中我们必须指明该函数属于哪一个类。

在类 A 中,成员函数 aa 的形参包含 B 类类型元素,所以在类 A 之前,必须有类 B 的前向声明。

友元是c还是java_[C++]【类】友元的三种声明及注意事项相关推荐

  1. java反射获取实体类_java 反射获取类对象的三种方式

    Java反射经常用到的就是获取对象中的属性,那么Java获取类对象就是必不可少的啦! Java实体类: public class ReflexModel { private String code; ...

  2. 模板类中使用友元函数的方式,派生类友元函数对基类的成员使用情况

    在一般友元函数的前面加上 template<typename T),注意在函数的声明和定义处都要加这个模板 例如: //模板类,长方体类 template <typename Elemen ...

  3. Android:按键响应方式第一种onClick属性,第二种方法接口类,第三种方式匿名内部类,第四种方式Activity

    一.在xml 中设置按键的onClick 绑定的函数 新建一个工程 然后在相关的页面添加一个Button 运行一下 实际上,现在这个按键一,我们去运行的时候,他是没有任何的反馈的,我们按完它,他没有任 ...

  4. 获取Class类对象的三种方式

    三种方式分类 类名.class属性 对象名.getClass()方法 Class.forName(全类名)方法 示例代码 public class ReflectDemo {public static ...

  5. 多线程—Thread类及线程三种创建方式及对比

    线程创建的3种方法: 1.继承Thread类并重写run方法 Thread类方法: Thread Thread.currentThread() :获得当前线程的引用.获得当前线程后对其进行操作. Th ...

  6. 面试题,反射创建类实例的三种方式是什么

    1.获得Class:主要有三种方法: (1)Object-->getClass (2)任何数据类型(包括基本的数据类型)都有一个"静态"的class属性 (3)通过class ...

  7. C++类模板的三种特化类型

    From: http://blog.sina.com.cn/s/blog_65d069c601010fb3.html 说起C++的模板及模板特化, 相信很多人都很熟悉 ,但是说到模板特化的几种类型,相 ...

  8. Eclipse中移除未使用的类引用的三种办法

    前言 是对源码进行修改的过程中,经常遇到修改.删除之后产生大量未使用的类应用,通过以下快捷操作可直接移除. 第一种:移除Java中未使用类 在Java类中按键[Ctrl+Shift+O] 第二种:移除 ...

  9. 短链接的生成之工具类的编写--三种方式(亲测可用)

    在很多时候我们都需要使用到短链接,比较常见的是在生成微信二维码的时候,长的url不能生成二维码,必须使用短链接.所以短链接的生成就尤其重要,废话不多说,下面直接介绍三种生成短链接的工具类 一.使用百度 ...

最新文章

  1. 盒模型,块状元素,行内元素
  2. 【指导]如何编译完整建立开发环境和编译Android 4.0.1 on Ubuntu 11.04 (64 bit)
  3. key可以重复的map集合:IdentityHashMap
  4. centos7 network网络服务重启报错failed to start lsb
  5. 我的编辑器能玩贪吃蛇,一起玩不?
  6. 当前没有可用的服务器_调研Redis高可用两种方案
  7. mysql表 spid program_SQL Server 表,记录 死锁解决办法
  8. python+tkinter出现错误
  9. python备份文件
  10. 各种数据结构优缺点分析
  11. HGO工具CoordTool坐标七参数转换
  12. java分页 添加序号_java 分页
  13. 裴礼文数学分析中的典型问题与方法第2章一元函数的连续性练习
  14. 解析几何:第六章 二次曲面(2)抛物面 二次锥面 柱面 一般二次曲面
  15. 汽车电工及电子技术基础【2】
  16. 高斯日记python实现
  17. 一个小工具就能帮我清理 30GB 微信文件,也太好用了!
  18. 赶紧收藏!41个Web UI工具包资源免费及付费下载
  19. 图像处理——使用模板对矩阵进行中值滤波(中值滤波模板)
  20. gateway网关调用报 reactor.netty.http.client.HttpClient.chunkedTransfer(Z)Lreactor/netty/http/client/HttpC

热门文章

  1. JDBC最基本CRUD操作工具类
  2. EntityFramework进阶——数据编辑与维护
  3. java面向对象基础代码_JAVA基础知识点之Java面向对象
  4. git status清空_本地删除文件后,git status会显示红色的那个文件。
  5. jquery设置video的宽度_jquery html5 视频播放控制代码
  6. 鸿蒙电脑操作系统最新消息,5G专家预测:7年后鸿蒙将成全球第一大操作系统
  7. C语言非常大的数组,关于最大子数组问题
  8. syslog打印不带等级_linux下syslog使用说明
  9. 手机360浏览器怎么清空历史记录 手机360浏览器历史记录清空方法分享
  10. 谷歌浏览器怎么更新升级