目录

友 元

 全 局 函 数 做 友 元

        语法

友元类

        语法

        类内声明函数,类外实现函数

成员函数做友元

        语法


友 元

程序中,有些私有属性想让类外特殊的一些函数或者类进行访问,就需要友元技术

-

友元的目的:让一个函数或者类访问另一个类中私有成员

-

友元关键字: friend 

-

友元的三种实现

  • 全局函数做友元
  • 类做友元
  • 成员函数做友元

 全 局 函 数 做 友 元

#include<iostream>
using namespace std;class Building {
public:// 默认构造Building(){m_SittingRoom = "客厅";m_BedRoom     = "卧室";}
public:string m_SittingRoom; // 公共客厅private:string m_BedRoom;     // 私有卧室
};// 全局函数
void goodFriend(Building& building){cout << building.m_SittingRoom << endl;cout << building.m_BedRoom     << endl; // 类外无法访问私有成员
}void test01(){Building building;goodFriend(building);
}int main(){test01();system("pause");return 0;
}

 全局函数做友元

语法:

friend void goodFriend(Building& building);

-

在类中最上面加上(就像是声明一样),友元不是类的成员,不受所在区域访问控制级别的约束,所以可以写在类中任何位置,实际中最好写在类定义的开始或者结尾处,集中声明。

class Building {friend void goodFriend(Building& building);
public:// 默认构造Building(){m_SittingRoom = "客厅";m_BedRoom     = "卧室";}
public:string m_SittingRoom; // 公共客厅
private:string m_BedRoom;     // 私有卧室
};

goodFriend 全局函数是 Building 类的朋友,可以访问类中私有属性

#include<iostream>
using namespace std;class Building {friend void goodFriend(Building& building);
public:// 默认构造Building(){m_SittingRoom = "客厅";m_BedRoom     = "卧室";}
public:string m_SittingRoom; // 公共客厅private:string m_BedRoom;     // 私有卧室
};// 全局函数
void goodFriend(Building& building){cout << building.m_SittingRoom << endl;cout << building.m_BedRoom     << endl; // 允许访问
}void test01(){Building building;goodFriend(building);
}int main(){test01();system("pause");return 0;
}

友元类

有 A 类 和 B 类,想让 A 类访问 B 类的私有成员,就将 A 类作为 B 类的友元,在 B 类中用:

语法:

friend class A;

这样 A 类就可以访问 B 类的私有成员

实例: 

#include<iostream>
#include<string>
using namespace std;class Building; // 类声明class GoodFriend{
public:// 构造函数声明GoodFriend();// 参观函数声明void visit(); Building* building;
};class Building{// GoodFriend 是 Building 的朋友,可以访问本类中私有成岩// GoodFriend 要访问 Building ,就要在 Building 内建立友元GoodFriendfriend class GoodFriend;
public:// 构造函数声明Building();
public:string m_SittingRoom; // 公共客厅
private:string m_BedRoom;     // 私有卧室
};// 类外写成员函数,加上作用域
// Building 作用域下的构造函数实现
Building::Building()
{m_SittingRoom = "客厅";m_BedRoom     = "卧室";
}// GoodFirend 作用域下的构造函数实现
GoodFriend::GoodFriend(){// 创建一个建筑物对象building = new Building;
}// GoodFirend 作用于下的成员函数实现
// 访问 Building 中的属性
void GoodFriend::visit(){cout << building->m_SittingRoom << endl;cout << building->m_BedRoom     << endl;
}void test01() {// 实例化朋友对象GoodFriend gf;// 让朋友访问 Buildinggf.visit();
}
int main() {test01();system("pause");return 0;
}

Building 类为什么要声明?

-类的声明具有先后顺序,如果不声明,则在 GoodFriend 类找不到 Building 类

class GoodFriend{
public:// 构造函数声明GoodFriend();// 参观函数声明void visit(); Building* building; // Building 需要声明
};

类内声明函数,类外实现函数

类外写成员函数,加上作用域    类名::

加在函数名前面

// Building 作用域下的构造函数实现
Building::Building()
{m_SittingRoom = "客厅";m_BedRoom     = "卧室";
}// GoodFirend 作用域下的构造函数实现
GoodFriend::GoodFriend()
{// 创建一个建筑物对象building = new Building;
}// GoodFirend 作用于下的成员函数
void GoodFriend::visit()
{cout << building->m_SittingRoom << endl;cout << building->m_BedRoom     << endl;
}

成员函数做友元

类A 中的成员函数 visit() 可以访问 类B 中的私有变量,在 类B 中对 类A 的成员函数进行友元声明,要加上作用域  类名::  

语法:

friend void GoodFriend::visit();

这样 类A 中该成员函数 visit() 就可以访问 类B 中的私有变量

-

注意:

类A 中的其他成员函数仍不可以访问 类B 中的私有变量

#include<iostream>
#include<string>
using namespace std;class Building;class GoodFriend{
public:// 构造函数声明GoodFriend();void visit();  // 让 visit 可以访问 Building 中私有成员Building* building;
};class Building
{// 友元声明friend void GoodFriend::visit();
public:// 构造函数声明Building();
public:string m_SittingRoom; // 公共客厅
private:string m_BedRoom;     // 私有卧室
};// 类外实现 GoodFriend 类的构造函数
GoodFriend::GoodFriend(){building = new Building;
}// 类外实现 GoodFriend 类的成员函数 visit
void GoodFriend::visit(){cout << "visit 函数访问:" << building->m_SittingRoom << endl;cout << "visit 函数访问:" << building->m_BedRoom     << endl;
}// 类外实现 Building 类的构造函数
Building::Building(){m_SittingRoom = "客厅";m_BedRoom     = "卧室";
}void test01(){GoodFriend gf;gf.visit();
}int main(){test01();system("pause");return 0;
}

【C++】类和对象-友元相关推荐

  1. 【C++基础】类和对象——友元

    [C++基础]类和对象--友元 友元的概念 在C++中,不能被外部访问的私有属性,通过友元可以访问. 友元的关键字:friend 友元的三种实现 全局函数做友元 类做友元 成员函数做友元 一.全局函数 ...

  2. 「地表最强」C++核心编程(七)类和对象--友元

    环境: 编译器:CLion2021.3:操作系统:macOS Ventura 13.0.1 文章目录 一.全局函数做友元 二.类做友元 三.成员函数做友元 地表最强C++系列传送门: 「地表最强」C+ ...

  3. c++类和对象---友元

    在程序里,有些私有属性,也想让类外的特殊的函数或者类进行访问,需要用 "友元" 友元的目的就是让一个函数或着类访问另一个类中的私有成员 友元的关键字:friend 友元的三种实现: ...

  4. C++学习记录---(6)类和对象-----友元和运算符重载

    1.友元 友元可以让一个函数或者其他类访问一个类中的私有成员. 主要分为,全局函数做友元.其他类做友元和成员函数做友元. (1)友元 在类中声明: friend 函数名(): (2)其他类做友元 在类 ...

  5. 【C++学习】类和对象 | 友元 | 内部类 | 匿名对象 | 内存管理 | new

    目录 1. 友元 1.1 友元函数 1.2 友元类 2. 内部类 3. 匿名对象 4. 内存管理 5. C++的动态内存 写在最后: 1. 友元 1.1 友元函数 来看这段代码: #include & ...

  6. C++类和对象——友元部分

    友元 全局函数做友元 类做友元 成员函数做友元 在C++程序中,有些私有属性也想让类外特殊的一些函数或者类进行访问,就可以使用友元技术. 友元的目的是让一个函数或者类访问另一个类中的私有成员.友元的关 ...

  7. 类和对象—友元—全局函数做友元

    友元的目的是让一个函数或者一个类可以访问另一个类中的私有成员. 友元的关键字为friend 友元的三种实现 全局函数做友元 类做友元 成员函数做友元 1.全局函数做友元 #include <io ...

  8. 【C++学习】类和对象--友元

    客厅,所有客人都可以进,但是卧室是私有的,也就是说只有你和好基友可以进去 在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术 友元的目的就是让一个函数或者类 访问另一 ...

  9. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

最新文章

  1. KVM — 安装部署
  2. leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现
  3. spring调用存储过程
  4. 这里有8个流行的Python可视化工具包,你喜欢哪个?
  5. 关于WEB ServiceWCFWebApi实现身份验证之WebApi篇
  6. CVPR 2021|可操控的GAN——Hijack-GAN
  7. EntityFramework Core进行读写分离最佳实践方式,了解一下(二)?
  8. 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
  9. springboot使用AOP打印日志信息
  10. jinja2模板注入_Flask(Jinja2) 服务端模板注入漏洞
  11. BZOJ 3207: 花神的嘲讽计划Ⅰ
  12. 动手学习数据分析(四)——数据可视化
  13. 【转载】WEB架构师成长之路
  14. 计算机常用英语词汇及读音,e发音的单词有哪些
  15. 八猴渲染器4.0基本使用教程及渲染教程
  16. php 读取docx,PHP怎么获取docx里面内容
  17. 字符画-Python
  18. 百练 2755:神奇的口袋
  19. 对于makefile不支持c++11的处理
  20. RFID固定资产管理系统之茶叶产品资产管理,智能监控防盗管理

热门文章

  1. 【RocketMQ 二十八】RocketMQ 消息堆积
  2. android 系统自带主题和样式
  3. android tv二级菜单,android TV开发:弹出菜单实现
  4. 我忘了你是谁-非主流留言
  5. 暗黑三php是什么东西,暗黑3卡奈魔盒怎么得有什么用_暗黑3卡奈魔盒详细介绍
  6. Disruptor介绍 -- 初识Disruptor框架
  7. LabVIEW 在运行时初始化数组并允许用户编辑值
  8. 还在用笨重的 ELK?这个轻量级开源日志系统真香!
  9. Dlink路由器 CNVD-2018-01084 远程命令执行漏洞 复现分析
  10. 云管家读取服务器配置信息出错,服务器云管家