友元函数

如果在本类以外的其他地方定义了一个函数(这个函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数),在对本类进行声明时,在类体中用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. 最强大,最简洁的【禁止输入中文】
  2. Windows mobile UI
  3. 医疗信息化、医学、医院管理、医疗器械资料下载
  4. 苹果App Icon的问题
  5. 4.ClassLink - 一种新型的VPC 经典网络的连接方式
  6. mysql数据库英文句子翻译_MySQL文档翻译(八)附英文原文---性能优化概览
  7. RabbitMQ 的延时队列和镜像队列原理与实战
  8. 苹果cms V10模板 仿优酷网PC模板+wap模板
  9. 华为路由器http诊断失败_高端家庭的标配,华为路由Q2 Pro是路由器中的吴彦祖...
  10. 查询MySQL中某个数据库中有多少张表
  11. 让博客园博客自动生成章节目录索引
  12. C语言基础选择题100道(附答案)02
  13. sass和compass学习笔记
  14. excel切换sheet的快捷键
  15. 1020 月饼 (25 分)
  16. 解决u盘图标显示异常
  17. golang实现图片颜色反转、图片灰度、缩放、转为字符画
  18. 玩南红的男人具备这几点,一般都不会太差
  19. Verilog实现超前进位加法器
  20. 虚拟机中CentOS 7安装过程

热门文章

  1. 宿舍管理系统(包括开发设计文档)
  2. hmailserver操作教程
  3. 说说这半年做的一个项目,并分享给各位
  4. 极客时间《从零开始学大数据》学习总结
  5. 单片机入门:LED双向流水灯(原理图+程序+仿真)
  6. 5、Docker 的四种网络模式
  7. 【Win10】系统,手动设置静态IP后出现两个IPv4地址解决方法
  8. 出生率大跌,母婴企业在“内卷”大战中该如何突破?
  9. 高斯消元法python编程_Python基于高斯消元法计算线性方程组示例
  10. 【Qt学习之行】相机和音频录制