友元函数

如果在本类以外的其他地方定义了一个函数(这个函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数),在对本类进行声明时,在类体中用friend对该函数进行声明,此函数就称为本类的“友元函数”。一个类的友元函数可以访问这个类中的私有成员。

例如,定义一个func()函数,在C++的TestA类中声明func()函数是当前类的“友元”函数,那么,这个func()函数就可以访问TestA类的私有成员。

2.1 普通函数声明为友元函数

我们可以定义一个普通的函数,希望这个函数能够访问一个类中的成员变量,那么,我们就在定义类的时候,声明这个函数是该类的友元函数,相当是说:在定义类的时候,把该普通函数声明为自己的一个朋友,允许这个朋友访问自己的成员变量。

这样,一个函数可以被多个类声明为“朋友”,它可以访问多个类中的成员变量。

通过下面的例子,可以理解友元函数的性质和作用。如下是一个友元函数的测试例子:

程序运行结果如下:

可以看到,在print()函数中可以引用stud对象的private私有成员。是因为,print()函数在student类中声明为友元。

请注意print()是一个在类外定义的函数,它不是属于student类的一个函数,所以,在定义的时候,并没有使用类前缀。它是非成员函数,不属于任何类。但是,我们把它声明为student类的一个“朋友”,让它可以访问student类的私有成员变量。

所以,使用 friend 关键字,在student类中声明定义在别处的print() 函数为student类的一个友元,这样,print() 是student类的朋友,就可以访问它的私有成员变量。

注意:在print() 中访问私有成员变量的时候,必须加上“对象名”,不能够如下:

void print(student& s)//定义友元函数

{

cout << "name = " << name << endl;

cout << "addr = " << addr << endl;

cout << "number = " << number << endl;

}

因为,print() 不是student类中的一个成员函数,它只是student类的一个朋友。不能够默认引用student类的成员变量,必须指定要访问的对象。

C++友元函数 普通函数声明为友元函数相关推荐

  1. c语言中被调用函数只需在主调函数中声明,其他函数中不用声明,求助,函数在其他函数中使用时要先声明后调用,这个没声明就用了...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如题,程序如下: #include #include //malloc,calloc,free,realloc头文件 #define LEN sizeof ...

  2. C++ 哪些函数不能声明成虚函数

    在C++,有五种函数不能被声明成虚函数,分别是:非成员函数.构造函数.静态成员函数.内联成员函数.友元函数这五种,下面分别解释为什么这五种函数不能被声明成虚函数. 1. 非成员函数 非成员函数只能被重 ...

  3. C++不能被声明为虚函数

    虚函数是为了实现多态,但是显然并不是所有函数都可以声明为虚函数的. 不能被声明为虚函数的函数有两类: 不能被继承的函数 不能被重写的函数 因此,这些函数都不能被声明为虚函数 普通函数 构造函数 如果构 ...

  4. 为什么基类的析构函数要声明成虚函数

    记得以后基类(父类) 的析构函数最好是声明为 虚函数 即:virtual 开发中遇到了一个比较傻逼的bug,也证明了理论与实际之间的差距. 在基类中没有声明其析构函数为虚函数,导致delete 释放操 ...

  5. 友元函数、类的非静态成员函数、静态成员函数的区别

    类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...

  6. 普通函数被类引用为友元函数

    #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; cl ...

  7. 【C++ 基础篇:21】:friend 友元四连问:什么是友元?友元类?友元函数?什么时候用友元?

    本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇.STL 篇.高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C++的三大特 ...

  8. 模板 (函数模板语法 ,类模板与函数模板的区别,:函数模板案例,普通函数与函数模板的区别,普通函数与函数模板调用规则,模板的局限性,类模板分文件编写.cpp,Person.hpp,类模板与友元)

    **01:函数模板语法: #include<iostream> using namespace std;//交换两个整型函数 void swapInt(int &a ,int &a ...

  9. C++ - 模板函数须要类型转换时使用友元(friend)模板函数

    模板函数须要类型转换时使用友元(friend)模板函数 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24357301 非模板函数 ...

最新文章

  1. 群同态基本定理证明_近世代数(3)——群的基本性质
  2. 《3ds Max疯狂设计学院》——1.5节怎样才能学好3ds Max,你要听好
  3. Cronet android 设计与实现分析——备选服务机制
  4. 理论基础 —— 排序 —— 桶排序
  5. cactiez v11使用配置mysql_cactiez应用监控部署手册.doc
  6. 1106 Lowest Price in Supply Chain (25 分) 静态树vector+DFS
  7. 荐书丨《哥德尔、艾舍尔、巴赫书:集异璧之大成》:机器人与音乐的次元壁破了
  8. 算法竞赛入门经典(刘汝佳)——常用STL数据结构总结
  9. python柱状图颜色_Python 绘制 柱状图
  10. 【量化笔记】时间序列--ARCH模型及GARCH模型
  11. Gboard导入简体中文词库,详细操作教程。
  12. 计算机控制技术课程配套教材习题解答(第4、5章)
  13. ICC tie cells
  14. c语言的七大查找算法,非常值得学习
  15. Flutter 功能最全的JsonToDart工具(桌面Web海陆空支持)
  16. h5分页样式 css,【前端技术】Quasar Table: 自定义分页样式
  17. 自然语言理解(Natural Language Understanding)
  18. 单摆matlab建模,用matlab求解单摆模型
  19. 大内高手--对内存的认识与使用
  20. iphone怎么使用排水功能?这项功能在哪

热门文章

  1. 如果人生是一场戏,那笑得最后的为什么不能是我?
  2. 深度调查:政府采购根本喂不饱国产软件
  3. Django应用程序实例,login()
  4. MySQL CAST与CONVERT 函数的用法:产生另一个类型的值
  5. .net core 封装文件服务操作——分布式文件服务之OSS
  6. 高等代数_证明_不同特征值的特征向量线性无关
  7. 在Keil C51下生成LIB库文件以及如何使用LIB库文件
  8. dlopen动态装载共享库
  9. 《中国制造业ERP研究报告》发布,带你看懂ERP行业最新发展趋势
  10. #创新应用#小红帽-Ebo互动动画书:儿童的电子书!