友元函数(friend function)
1. 什么是友元函数?
    一个类的私有数据成员通常只能由类的函数成员来访问,而友元函数可以访问类的私有数据成员,也能访问其保护成员
2. 友元函数的用处体现在哪里?
    2.1 使用友元函数可提高性能,如:用友元函数重载操作符和生成迭代器类
    2.2 用友元函数可以访问两个或多个类的私有数据,较其它方法使人们更容易理解程序的逻辑关系
3. 使用友元函数前应注意:
    3.1 类的友元函数在类作用域之外定义,但可以访问类的私有和保护成员
    3.2 尽管类定义中有友元函数原型,友元函数仍然不是成员函数
    3.3 由于友元函数不是任何类的成员函数,所以不能用句柄(对象)加点操作符来调用
    3.4 public, private, protected成员访问符与友员关系的声明无关,因此友元关系声明可在类定义的任何位置,习惯上在类定义的开始位置
    3.5 友元关系是指定的,不是获取的,如果让类B成为类A的友元类,类A必须显式声明类B为自己的友元类
    3.6 友元关系不满足对称性和传递性
    3.7 如果一个友元函数想与两个或更多类成为友元关系,在每个类中都必须声明为友元函数
4. 注:由于C++属于混合语言,常在同一个程序中采用两种函数调用且这两种函数调用往往是相反的。类C语言的调用将  
    基本数据或对象传递给函数,C++调用则是将函数(或信息)传递给对象

实例1. 友元函数的声明、定义与使用

#include <iostream>
using namespace std;class Car
{friend void display(Car); //类"Car"的朋友display() //友元函数的声明
private:int speed;char color[20];
public:void input( ){cout<<"Enter the color : ";cin>>color;cout<<"Enter the speed : ";cin>>speed;}
};void display(Car x) //友元函数的定义
{cout<<"The color of the car is : "<<x.color<<endl;cout<<"The speed of the car is : "<<x.speed<<endl;
}int main( )
{Car mine;mine.input( ); //访问成员函数display(mine); //友元函数的使用 //将对象"mine"传给友元函数return 0;
}

输出结果:
Enter the color: green 回车
Enter the speed: 100 回车
The color of the car is : green
The speed of the car is : 100

#include <iostream>
using namespace std;class Virus; //类'Virus'未定义前要用到,需事先告诉编译器'Virus'是一个类class Bacteria
{
private:int life;
public:Bacteria() { life=1; }
friend void Check(Bacteria, Virus); //类'Bacteria'中,将Check声明为友元函数
};class Virus
{
private:int life;
public:Virus() : life(0) {}
friend void Check(Bacteria, Virus); //类'Virus'中,将Check声明为友元函数
};void Check (Bacteria b, Virus v) //友元函数的定义
{if (b.life==1 || v.life==1){cout<<"\nSomething is alive.";}if (b.life==1){cout<<"\nA bacteria is alive.";}if (v.life==1){cout<<"\nA virus is alive.";}
}int main()
{Bacteria fever;Virus cholera;Check(fever, cholera); //友元函数的调用return 0;
} 

输出结果:
Something is alive.
A bacteria is alive.

友元类(friend class)
1. 友元类可以访问与之为友元关系的类的所有私有成员
2. 友元类使用较少

实例: 友元类

#include <iostream>
using namespace std;class Add
{
private:int x,y;
public:Add(){x=y=4;}
friend class Support; //类'Support'现在是类'Add'的朋友
};class Support
{
public:void Sum(Add ob)//此函数可访问类'Add'的所有私有成员{cout<<"The sum of the 2 members is : "<<(ob.x+ob.y)<<endl;}
};int main()
{Add ad;Support sup;sup.Sum(ad);return 0;
}

输出结果:
The sum of the 2 members is : 8

转载:https://www.cnblogs.com/JCSU/articles/1044346.html

友元函数、友元类、访问私有数据成员、友元关系[C++]相关推荐

  1. C++中访问类的私有数据成员的第三种方法

    我们知道,C++的类是有封装性的,那么对于私有数据成员我们如果想在类外访问,一般而言无外乎这么两种方法: 1.通过公有的成员函数 2.通过友元 这是两种通常的做法,还有一种是比较"反常&qu ...

  2. 3第一周课后练习#183;阅读计划(3)-使用函数来访问私有数据成员

    /** Copyright (c) 2015, 计算机科学学院,烟台大学* All rights reserved.* 文件名:test.cpp* 作 靠:刘畅* 完成日期:2015年 3 一个月 2 ...

  3. C++访问类的私有数据成员的三种方法

    总是忘记C++的私有数据成员到底什么能访问,今天总结下,特此记录. 注:还可以使用指针访问修改private数据成员的值: class Test {private:int x;int y; publi ...

  4. 请编写一个正方体类,类的私有数据成员是边长,要求用公有成员函数实现以下功能:1. 由键盘分别输入正方体的边长2. 计算并输出正方体的体积

    #include <iostream> using namespace std; class aaa { private: int a; public: void Print() { co ...

  5. 如何在类的外部修改类中的私有数据成员

    一般的情况是类中的私有数据成员,只能是类的对象自己可以修改,从外部是不能更改的如下例子 #include<iostream> using namespace std;class Data ...

  6. 类的静态数据成员和静态成员函数

    一.什么是类的静态成员 静态成员变量和全局变量都存储在全局/静态区,它们都是在程序编译时创建,直到编译结束才被收回.所以全局变量和静态成员变量的功能差不多,只是创建的方式不同,类的静态成员创建在类中, ...

  7. 编写一个矩形rectangle 类,有数据成员长len 和宽wid,构造函数rectangle (int,int),和友元函数.

    编写一个矩形rectangle 类,有数据成员长len 和宽wid,构造函数rectangle (int,int),和友元函数float area(rectangle T)和float cret(re ...

  8. 静态数据成员友元函数

    静态数据成员 1. static成员必须在类外定义并初始化 2. static数据成员和函数成员可以通过对象 名引用也可以通过类名引用{Clock c1,c2; c1.count; Clock::co ...

  9. C++:建立Cylinder类,有三个double型私有数据成员:半径、高和体积,构造函数传递两个值:半径和高,计算体积。成员函数showVolume()用来显示每个对象的体积。

    C++:建立Cylinder类,有三个double型私有数据成员:半径.高和体积,构造函数传递两个值:半径和高,计算体积.成员函数showVolume()用来显示每个对象的体积. #include&l ...

最新文章

  1. db2 最近三个月_昙花一现,PA、PC月跌1800,通用料一蹶不振,救不起的塑市!
  2. 十一、深入JavaScript的定时器(七)
  3. ICLR 2021 | 使用CVAE学习干扰集,增强OOD以及对抗防御的能力
  4. Teddy's Knowledge Base--基于.Net 2.0 (C# 2.0, ASP.NET 2.0)的快速开发框架设计NBear V2.0.0 [开源]...
  5. C++map容器-构造和赋值
  6. [剑指offer]面试题第[57]题[Leetcode][第167题][JAVA][和为s的两个数字][两数之和][HashSet][二分][双指针]
  7. python面试总结(二)列表去重与单例
  8. 用哪个版本的基因组和注释文件好?| 亲测
  9. Spread基本知识(一)
  10. js 正则清除html格式
  11. 聚类——谱聚类算法以及Python实现
  12. UEBA案例分析系列之数据泄露检测
  13. 程序员思维僵化_僵化趋势
  14. 摄像模组中光学相关知识(三)
  15. 这些女强人,颠覆了整个世界
  16. FinClip 2021 年 12 月产品大事记
  17. 【深度学习】实验6布置:图像自然语言描述生成(让计算机“看图说话”)
  18. libiec61850探究【5】- Windows下编译Goose发布
  19. php information
  20. 【PaperReading】Toward a gold standard for benchmarking gene set enrichment analysis

热门文章

  1. AcWing_4261
  2. Mac ps 查看进程
  3. Side-Menu源码分析讲解
  4. 【Java2实用教程】160 页 第5题 使用(接口)设计一个动物声音“模拟器“,希望模拟器可以模拟许多动物声音。
  5. MediaRecorder.AudioSource音频来源参数
  6. [地心游记]探讨以大客户为核心的增值体系
  7. csv文件用excel打开是乱码如何处理
  8. 接触电阻导通电阻四线毫欧电阻信号隔离转换器0-500mΩ 0-100mΩ转4-20ma
  9. 【记录】git error:bad signature 解决方法
  10. Python操作阿里云OSS