1. 将其他类的成员函数声明为友元函数
    friend 函数不仅可以是全局函数(非成员函数),还可以是另外一个类的成员函数。请看下面的例子:
#include <iostream>
using namespace std;
class Address;  //提前声明Address类
//声明Student类
class Student{public:Student(char *name, int age, float score);
public:void show(Address *addr);
private:char *m_name;int m_age;float m_score;
};
//声明Address类
class Address{private:char *m_province;  //省份char *m_city;  //城市char *m_district;  //区(市区)
public:Address(char *province, char *city, char *district);//将Student类中的成员函数show()声明为友元函数friend void Student::show(Address *addr);
};
//实现Student类
Student::Student(char *name, int age, float score): m_name(name), m_age(age), m_score(score){ }
void Student::show(Address *addr){cout<<m_name<<"的年龄是 "<<m_age<<",成绩是 "<<m_score<<endl;cout<<"家庭住址:"<<addr->m_province<<"省"<<addr->m_city<<"市"<<addr->m_district<<"区"<<endl;
}
//实现Address类
Address::Address(char *province, char *city, char *district){m_province = province;m_city = city;m_district = district;
}
int main(){Student stu("小明", 16, 95.5f);Address addr("陕西", "西安", "雁塔");stu.show(&addr);Student *pstu = new Student("李磊", 16, 80.5);Address *paddr = new Address("河北", "衡水", "桃城");pstu -> show(paddr);return 0;
}

运行结果:
小明的年龄是 16,成绩是 95.5
家庭住址:陕西省西安市雁塔区
李磊的年龄是 16,成绩是 80.5
家庭住址:河北省衡水市桃城区

本例定义了两个类 Student 和 Address,程序第 27 行将 Student 类的成员函数 show() 声明为 Address 类的友元函数,由此,show() 就可以访问 Address 类的 private 成员变量了。

几点注意:
① 程序第 4 行对 Address 类进行了提前声明,是因为在 Address 类定义之前、在 Student 类中使用到了它,如果不提前声明,编译器会报错,提示’Address’ has not been declared。类的提前声明和函数的提前声明是一个道理。

② 程序将 Student 类的声明和实现分开了,而将 Address 类的声明放在了中间,这是因为编译器从上到下编译代码,show() 函数体中用到了 Address 的成员 province、city、district,如果提前不知道 Address 的具体声明内容,就不能确定 Address 是否拥有该成员(类的声明中指明了类有哪些成员)。

这里简单介绍一下类的提前声明。一般情况下,类必须在正式声明之后才能使用;但是某些情况下(如上例所示),只要做好提前声明,也可以先使用。

但是应当注意,类的提前声明的使用范围是有限的,只有在正式声明一个类以后才能用它去创建对象。如果在上面程序的第4行之后增加如下所示的一条语句,编译器就会报错:
Address addr; //企图使用不完整的类来创建对象

因为创建对象时要为对象分配内存,在正式声明类之前,编译器无法确定应该为对象分配多大的内存。编译器只有在“见到”类的正式声明后(其实是见到成员变量),才能确定应该为对象预留多大的内存。在对一个类作了提前声明后,可以用该类的名字去定义指向该类型对象的指针变量(本例就定义了 Address 类的指针变量)或引用变量(后续会介绍引用),因为指针变量和引用变量本身的大小是固定的,与它所指向的数据的大小无关。

③ 一个函数可以被多个类声明为友元函数,这样就可以访问多个类中的 private 成员。

C++友元函数和友元类(二)相关推荐

  1. C++语言基础(15)-友元函数和友元类

    一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来介绍一种例外情 ...

  2. c++远征之模板篇——友元函数、友元类

    以下内容源于慕课网的学习整理,如有侵权,请告知删除. 一.友元函数 1.分类 全局函数-->友元全局函数 成员函数-->友元成员函数 2.关键字friend 友元全局函数 如下,利用fri ...

  3. C++友元函数、友元类与类模板

    文章目录 一.普通函数声明为友元涵数 二.声明类的成员函数为其他类的友元函数 三.类模板的使用 一.普通函数声明为友元涵数 #include <iostream> using namesp ...

  4. 友元函数,友元类,类模板

    C++提供友元机制,允许外部类和函数访问类的私有成员和保护成员的辅助方法,即将它们声明为一个给定类的友元类(或友元函数),使其具有类成员函数的访问权限.但友元本身不是类的成员,它不属于任何类. 优点: ...

  5. 友元(友元函数、友元类、类成员函数的友元)

    友元(友元函数.友元类.类成员函数的友元) (friend)友元机制:允许一个类将对其非公有成员的访问权限授予指定的函数或者类. 我们可以将友元大致分为3类: 友元函数 友元类 类成员函数的友元 一: ...

  6. Th3.9:友元函数、友元类、友元成员函数详述

     本博客将记录:类的相关知识点的第9节的笔记! (这个在学习C++基础课程时已经学习过一次了,这里再次简单地回顾一下而已) 今天总结的知识分为以下3个点:   一.友元函数(对于非成员函数而言)   ...

  7. C++学习之友元函数和友元类

    目录 一.前言 二.友元函数 1. 介绍 2. 示例代码 三.友元类 1. 介绍 2. 示例代码 一.前言 主要介绍C++中的友元函数和友元类. 二.友元函数 1. 介绍 友元函数定义在类的外部,通过 ...

  8. C++学习1:C++友元函数和友元类

    前言 类中的成员通过权限控制符实现了数据的封装,若对象要访问类中的私有数据,则只能通过成员函数实现.这种方式实现了数据的封装却增加了开销,有时候需要通过外部函数或类直接访问其他类的私有成员,为此C++ ...

  9. C++友元函数和友元类

    文章目录 一.友元的概念 二.友元函数的关键字介绍 三.友元类介绍 3.1友元类总结: 3.2友元类不能继承 3.3 友元关系不能继承 3.4.友元重载 一.友元的概念 1. 类的友元函数是定义在类外 ...

  10. c语言的友元函数的用法,C++友元函数和友元类概念解析

    一.友元函数 友元函数是一种特殊的函数,它需要在类体内进行说明,可以访问类的私有成员和保护成员,但又不是类的成员函数.友元函数的说明如下: friend 数据类型函数名(参数) 其中,friend是说 ...

最新文章

  1. opencv-python将一个视频切成n份视频
  2. telnet命令的使用
  3. 实战SSM_O2O商铺_41【前端展示】店铺列表页面Dao+Service+Controller层的实现
  4. 线性Frequency Principle动力学:定量理解深度学习的一种有效模型
  5. Java发邮件-QQ服务器认证
  6. C++ 包含目录、库目录、附加依赖项总结
  7. JavaScript 实现 GriwView 单列全选
  8. [转]linux之top命令
  9. windows服务器上安装的有mysql环境怎么创建数据库_Windows环境MySQL数据库安装方法...
  10. BZOJ1085:[SCOI2005]骑士精神——题解+IDA*粗略讲解
  11. VAssistX的卸载方法
  12. 使用Spider提取数据(爬取起点中文网)
  13. xp计算机怎样看ip地址,XP电脑ip地址怎么查看?XP系统怎么样查看电脑的IP地址?...
  14. mac虚拟摄像头开发
  15. 哪个一键重装电脑系统工具好用些?
  16. Web2.0的系统架构与六大关键问题
  17. 《异常检测——从经典算法到深度学习》15 通过无监督和主动学习进行实用的白盒异常检测
  18. githup 提交项目及分支 遇到的问题
  19. Paxos 与拜占庭将军问题
  20. 同事喜欢、领导器重的是哪类人?

热门文章

  1. 通讯线路物理层编码类型总结(NRZ,MLT-3,4B/5B,8B/10B,64B/66B...)
  2. C++派生类构造函数调用规则
  3. 组件生命周期管理和通信方案
  4. python 入门第六课 class面向对象OOP
  5. 利用腾讯云为你的域名申请并配置免费SSL一年
  6. mysql分区方案的研究
  7. IOS热更新-JSPatch实现原理+Patch现场恢复
  8. eclipse下3种安装插件的方式及缺点比较
  9. PHP上传图片到数据库和存储到本地文件夹的方法
  10. 网管软件——Net Meter V3.3中文版