私有成员对于类外部的所有程序部分而言都是隐藏的,访问它们需要调用一个公共成员函数,但有时也可能会需要创建该规则的一项例外。

友元函数是一个不属于类成员的函数,但它可以访问该类的私有成员。换句话说,友元函数被视为好像是该类的一个成员。友元函数可以是常规的独立函数,也可以是其他类的成员。实际上,整个类都可以声明为另一个类的友元。

为了使一个函数或类成为另一个类的友元,必须由授予它访问权限的类来声明。类保留了它们的朋友的 "名单",只有名字出现在列表中的外部函数或类才被授予访问权限。通过将关键字 friend 放置在函数的原型之前,即可将函数声明为友元。

友元函数的一般格式如下:

friend ();

在 Budget 类的以下声明中,另一个类的 addBudget 函数 Aux 已声明为友元:

class Budget

{

private:

static double corpBudget;

double divBudget;

public:

Budget() { divBudget = 0; }

void addBudget(double b)

{

divBudget += b;

corpBudget += divBudget;

}

double getDivBudget() const { return divBudget; }

static double getCorpBudget() { return corpBudget; }

static void mainOffice(double);

friend void Aux::addBudget (double) ; // 友元

};

假设另一个 Aux 类代表一个分部的附属办公室,也许在另一个国家。附属办公室提出了一个单独的预算要求,该要求必须添加到整个企业的预算中。则 Aux::addBudget 函数的友元声明告诉编译器,该函数己授予访问 Budget 的私有成员的权限。该函数釆用 double 类型的实参,表示要添加到企业预算中的金额:

class Aux

{

private:

double auxBudget;

public:

Aux() { auxBudget =0; }

void addBudget(double);

double getDivBudget() { return auxBudget; }

};

以下是 Aux addBudget 成员函数的定义:

void Aux::addBudget(double b)

{

auxBudget += b;

Budget::corpBudget += auxBudget;

}

形参 b 被添加到企业预算中,这是通过使用表达式 Budget::corpBudget 来访问并实现的。下面的程序演示了这些类在完整程序中的用法。

//auxil.h的内容

#ifndef AUXIL_H

#define AUXIL_H

// Aux class declaration.

class Aux

{

private:

double auxBudget;

public:

Aux() { auxBudget = 0; }

void addBudget(double);

double getDivBudget() const { return auxBudget; }

};

#endif

//budget3.h的内容

#ifndef BUDGET3_H

#define BUDGET3_H

#include "auxil.h" // For Aux class declaration

//Budget class declaration.

class Budget {

private:

static double corpBudget;

double divBudget;

public:

Budget() { divBudget =0; }

void addBudget(double b)

{

divBudget += b;

corpBudget += divBudget;

}

double getDivBudget() const {return divBudget;}

static double getCorpBudget() {return corpBudget;}

static void mainOffice(double);

friend void Aux::addBudget(double);

};

#endif

//budget3.cpp的内容

#include "budget3.h"

//Definition of static member.

double Budget::corpBudget = 0;

void Budget:imainOffice(double budReq)

{

corpBudget += budReq;

}

//auxil.cpp的内容

#include "auxil.h"

#include "budget3.h"

void Aux::addBudget(double b)

{

auxBudget += b;

Budget::corpBudget += auxBudget;

}

//main程序的内容

//This program demonstrates a static class member variable. #include

#include

#include "budget3.h"

using namespace std;

int main()

{

const int N_DIVISIONS = 4;

// Get the budget requests for the divisions and offices

cout << "Enter the main office's budget request:";

double amount;

cin >> amount;

Budget:imainOffice(amount);

// Create the division and auxiliary offices

Budget divisions [N_DIVISIONS];

Aux auxOffices[N_DIVISIONS];

cout << "\nEnter the budget requests for the divisions and" << "\ntheir auxiliary offices as prompted:\n";

for (int count = 0; count < N_DIVISIONS; count++)

{

double bud;

cout << "Division " << (count + 1) << ": ";

cin >> bud;

divisions[count].addBudget(bud);

cout << "Division " << (count + 1) << "'s auxiliary office:";

cin >> bud;

auxOffices[count].addBudget(bud);

}

// Print the budgets

cout << setprecision (2);

cout << showpoint << fixed;

cout << "Here are the division budget requests:\n";

for (int count = 0; count < N_DIVISIONS; count++)

{

cout << "\tDivision: " << (count + 1) << "\t\t\t$ ";

cout << setw(7);

cout << divisions[count].getDivBudget() << endl;

cout << "\tAuxiliary Office of Division " << (count+1);

cout << "\t$ ";

cout << auxOffices[count].getDivBudget() << endl;

}

// Print total requests

cout << "\tTotal Requests (including main office): $ ";

cout << Budget::getCorpBudget() << endl;

return 0;

}

程序输出结果:

Enter the main office's budget request: 100000

Enter the budget requests for the divisions and their auxiliary offices as prompted:

Division 1: 100000

Division 1's auxiliary office: 500000

Division 2: 200000

Division 2's auxiliary office: 40000

Division 3: 300000

Division 3's auxiliary office: 700000

Division 4: 400000

Division 4's auxiliary office: 650000

Here are the division budget requests:

Division: 1    $ 100000.00

Auxiliary Office of Division 1 $ 50000.00

Division: 2    $ 200000.00

Auxiliary Office of Division 2    $ 40000.00

Division: 3    $ 300000.00

Auxiliary Office of. Division 3    $ 70000.00

Division: 4    $ 400000.00

Auxiliary Office of Division 4    $ 65000.00

Total Requests (including main    office): $ 1325000.00

注意,如前所述,可以使整个类成为另一个类的友元。Budget 类可以通过以下声明使 Aux 类成为友元:

friend class Aux;

但是,这可能并不是一个好主意,因为这将导致 Aux 的每个成员函数(包括稍后可能添加的函数)都可以访问 Budget 的私有成员。所以,最好的做法是只声明那些必须有权访问类的私有成员的函数作为友元。

java 友元函数_C++友元函数(超详细)相关推荐

  1. Java中的多线程编程(超详细总结)

    文章目录 Java中的多线程编程(超详细总结) 一.线程与多线程的概念 二.线程与进程之间的关系 三.一个线程的生命周期 四.多线程的目的和意义 五.线程的实现的方式 Java中的多线程编程(超详细总 ...

  2. Java Web实现登录注册(超详细附代码)

    Java Web实现登录注册(超详细附代码) 文章目录 Java Web实现登录注册(超详细附代码) 1.前言 2.登录注册设计流程 3.注册的数据流程 4.登录的数据流程 5.部分代码的展示 5.1 ...

  3. java 友元函数_C++ 友元函数用法总结

    C++中的友元机制允许类的非公有成员被一个类或者函数访问,友元按类型分为三种: 普通非类成员函数作为友元.类的成员函数作为友元.类作为友元. 1.友元的内容 友元包括友元的声明以及友元的定义.友元的声 ...

  4. vue函数如何调用其他函数?_C语言函数学习-函数的嵌套调用

    文章logo 函数的嵌套调用 C语言中不允许作嵌套的函数定义.因此各函数之间是平行的,不存在上一级函数和下一级函数的问题.但是C语言允许在一个函数的定义中出现对另一个函数的调用.这样就出现了函数的嵌套 ...

  5. java中的命名规则(超详细~~),变量、类名、方法名

    1.package包名 不推荐大写,按照约定,都是小写 2.class类名 类名都是首字母大写,剩下的就是驼峰写法,比如:ClassHelloWorld,通常类名都是名词 3.函数方法名 函数方法名都 ...

  6. MySQL函数和操作符(超详细,备着查找)

    一.操作符 1.1 操作符优先级 以下列表显示了操作符优先级的由低到高的顺序.排列在同一行的操作符具有相同的优先级. 操作符 优先级 := 1 ||, OR, XOR 2 &&, AN ...

  7. stackedplot 函数_【matlab 基础篇 03】一文带你全面了解 plot 绘图函数的使用(超详细+图文并茂)...

    快速入门matlab,系统地整理一遍,如何你和我一样是一个新手,那么此文很适合你: 1 前言 如果你是和我一样的小白,强烈推荐看看这里,需要合理地利用官方的文档,通常我觉得官方文档是最好的,没有之一, ...

  8. java友元类_C++友元(Friend)用法实例简介

    相对于Java而言,友元是C++中特有的一种元素,很多教材上对其介绍的相对较少,因此初学的时候往往不能很快掌握,本文总结了友元的用法和一些注意的地方,供大家参考借鉴.希望能对初学C++的朋友起到一点帮 ...

  9. 微信小程序云函数使用教程【超详细】

    背景需求 在本人的项目中,需要调用一个http的接口,而微信小程序所有的网络请求都得使用https,因而需要一个中转站,使得在正式发布的时候可以使用http接口.(在调试环境下,只要在本地设置里勾选& ...

最新文章

  1. Centos下 安装和测试kafka
  2. Android--加载大分辨率图片到内存
  3. python中字典的几种定义方式
  4. JS node 后端签名前端文件直传ali-oss解决方案
  5. Times33算法与最快的Hash表
  6. 成功申请MVP,晒晒来自微软的奖品
  7. Javascript游戏,街头霸王
  8. VMware虚拟机、centos以及securecrt的安装
  9. OpenEuler编译、安装与挂载f2fs文件系统
  10. C语言学习——if语句
  11. JavaWeb在线刷题系统
  12. 浅析部分物化以及冰山立方体的计算方法Star-Cubing
  13. 妙控鼠标灵敏度太低怎么办
  14. Android性能优化之图片压缩综合解决方案
  15. Win10桌面我的电脑怎么调出来?最简单方法教学
  16. java web电脑网站微信扫码支付(Servlet+JSP)
  17. Android切换语言程序闪退及无效果
  18. Java学习路线之并发编程(五)
  19. PHP环境搭建(phpStudy)与集成开发工具(phpStorm)的安装
  20. 计算机实训安全考试答案,(实验室安全在线测试题答案.doc

热门文章

  1. 20200727总结
  2. typora 分割线_大脑放不下的知识,我放到这里——Typora
  3. vue中当图片地址无效的时候,显示默认图片的方法
  4. Android代码打包一个apk,Android Studio 打包生成apk(示例代码)
  5. Python爬虫爬取静态网页实例一:爬取内涵段子吧上的段子
  6. 敏捷,路在何方?最新完整敏捷状态报告(专业点评版)出炉
  7. C语言_求两个整数中的较大者
  8. ubuntu——cat和输出命令详解
  9. conda create新建环境失败报错:An unexpected error has occurred. Conda has prepared the above report.
  10. 传奇手游:冰雪复古游神魔点多少钱 神魔之体怎么点到10级