c/c++教程 - 2.4.4 友元friend用法
目录
4.4 友元
相关教程
4.4 友元
友元:友好的元素,有特殊的访问权限。
在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元。
友元的目的就是让一个函数或者类访问另一个类中私有成员。
友元的关键字为 friend。
友元的三种实现:
- 全局函数做友元
- 类做友元
- 成员函数做友元
1. 全局函数做友元:
// 友元
class Building
{
public:// 全局函数做友元// test01 全局函数是 Building的友元,可以访问Building中的私有成员friend void test01(Building* b);Building(){m_SittingRoom = "客厅";m_BedRoom = "卧室";}string m_SittingRoom;
private:string m_BedRoom;
};// 全局函数
void test01 (Building *b)
{cout << "正在访问: " << b->m_SittingRoom << endl;// test01 全局函数是 Building的友元,可以访问Building中的私有成员cout << "正在访问: " << b->m_BedRoom << endl;
}int main() {Building b1;test01(&b1);system("pause");return 0;
}
------------------------------------------------------------------------
正在访问: 客厅
正在访问: 卧室
请按任意键继续. . .
2. 类做友元:
// 友元
class Building
{friend class GoodGuy;public:Building();string m_SittingRoom;private:string m_BedRoom;
};// 类外写成员函数
Building::Building()
{m_SittingRoom = "客厅";m_BedRoom = "卧室";
}class GoodGuy
{
public:GoodGuy();void visit();Building* building;
};// 类外写成员函数
GoodGuy::GoodGuy()
{// 创建建筑物对象building = new Building;
}void GoodGuy::visit()
{cout << "正在访问: " << building->m_SittingRoom << endl;cout << "正在访问: " << building->m_BedRoom << endl;
}// 全局函数
void test01 (Building *b)
{GoodGuy gg;gg.visit();
}int main() {Building b1;test01(&b1);system("pause");return 0;
}
-------------------------------------------------------------------
正在访问: 客厅
正在访问: 卧室
请按任意键继续. . .
类外写成员函数:见上面
3. 成员函数做友元:
(我的VS2019,必须class GoodGuy定义在class Building前,而且成员函数实现写在类实现后才管用,否则报错)
#include <iostream>
using namespace std;
#include <string>class GoodGuy;
class Building;class GoodGuy
{
public:GoodGuy();void visit(); // 让 visit函数可以访问Building中私有成员void visit2(); // 让 visit2函数不可以访问Building中私有成员Building* building;
};// 友元
class Building
{friend void GoodGuy::visit();public:Building();string m_SittingRoom;private:string m_BedRoom;
};// 类外写成员函数
GoodGuy::GoodGuy()
{// 创建建筑物对象building = new Building;
}void GoodGuy::visit()
{cout << "visit 正在访问: " << building->m_SittingRoom << endl;cout << "visit 正在访问: " << building->m_BedRoom << endl;
}void GoodGuy::visit2()
{cout << "visit2 正在访问: " << building->m_SittingRoom << endl;//cout << "visit2 正在访问: " << building->m_BedRoom << endl;
}// 类外写成员函数
Building::Building()
{m_SittingRoom = "客厅";m_BedRoom = "卧室";
}void test01 (Building *b)
{GoodGuy gg;gg.visit();gg.visit2();
}int main() {Building b1;test01(&b1);system("pause");return 0;
}
--------------------------------------------------------------------------
visit 正在访问: 客厅
visit 正在访问: 卧室
visit2 正在访问: 客厅
请按任意键继续. . .
相关教程
- 开发环境搭建:Visual Studio 2019 C++开发环境搭建
- 推荐视频:https://www.bilibili.com/video/BV1et411b73Z?from=search&seid=4205594350351753444
- 已投币三连,非常细致的视频教程,感谢up主。
c/c++教程 - 2.4.4 友元friend用法相关推荐
- python 包用法_Python 基础教程之包和类的用法
Python 基础教程之包和类的用法 这篇文章主要介绍了 Python 基础教程之包和类的用法的相关资料, 需要的朋友可以参考下 Python 是一种面向对象.解释型计算机程序设计语言,由 Guido ...
- [js高手之路]深入浅出webpack教程系列9-打包图片(file-loader)用法
[js高手之路]深入浅出webpack教程系列索引目录: [js高手之路]深入浅出webpack教程系列1-安装与基本打包用法和命令参数 [js高手之路]深入浅出webpack教程系列2-配置文件we ...
- java提示框easyui风格_[Java教程]jQuery EasyUI 提示框(Messager)用法
[Java教程]jQuery EasyUI 提示框(Messager)用法 0 2013-10-10 19:00:06 jQuery EasyUI 提示框(Messager)不仅强大,而且也不用任何的 ...
- Redux 入门教程(一):基本用法
一年半前,我写了<React 入门实例教程>,介绍了 React 的基本用法. React 只是 DOM 的一个抽象层,并不是 Web 应用的完整解决方案.有两个方面,它没涉及. 代码结构 ...
- python基础教程:startswith()和endswith()的用法
startswith()方法 Python startswith() 方法用于检查字符串是否是以指定子字符串开头 如果是则返回 True,否则返回 False.如果参数 beg 和 end 指定值,则 ...
- 【Python教程】sort 与sorted的用法与区别
1. sort: sort是Python中列表的方法 sort() 方法语法: list.sort(key=None, reverse=False) 有两个参数,这里不讲第一个参数,第二个参数当 re ...
- bat for循环_bat教程[279] reg import命令的用法
古树屋Click to follow us C:\Users\86137>reg import /?REG IMPORT FileName[/reg:32 | /reg:64] FileName ...
- python补充urllib教程,Python爬虫之urllib基础用法教程
综述 本系列文档用于对Python爬虫技术进行简单的教程讲解,巩固自己技术知识的同时,万一一不小心又正好对你有用那就更好了. Python 版本是3.7.4 urllib库介绍 它是 Python 内 ...
- Python 教程:eval()和exac()详细用法以及区别
一.eval() 1. 描述 eval()执行一个字符串,返回表达式的值. 2. 语法 eval(expression[, globals[, locals]]) expression:表达式 glo ...
最新文章
- Azkaban入门(启动一个Simple Example)
- 前线解释多线程《二》
- C#-获取页面源代码
- Ajax基于rest风格上传图片
- 《设计模式》3.结构型模式
- Mysql执行计划含义,mysql执行计划介绍
- python安装pygame无法找到SDL.h文件
- 瑞幸咖啡首席技术官也离职了:并未参加公司财务造假
- 轻量级神经网络ShuffleNet
- java 电子书下载
- U盘装机助理-PE环境
- PHP小白之路1--PHP之简易留言板设计
- libcef(一)编译CEF
- win10关闭windows聚焦_Win10聚焦锁屏壁纸无法自动更换的处理方法
- php 长链接生成短链接
- FusionStorage原理及组件
- 微信小程序手机摇一摇功能
- python Numpy 中的矩阵向量乘法(np.multiply()、np.dot()、np.matmul() 和 星号(*)、@)
- 《思维力:高效的系统思维》读书笔记02 - 深入理解系统化思维
- Android性能优化方法论
热门文章
- Device Tree Usage(转)https://elinux.org/Device_Tree_Usage
- Confluence 6 用户目录图例 - 使用 LDAP 授权,在用户第一次登陆时拷贝用户
- 最大连续区间和的算法总结(转)
- NetBeans+xdebug解决无法连接xdebug问题
- [转]给定单链表,检测是否有环。如果有环,则求出进入环的第一个节点
- 软件研发设计经验总结
- hdu 2594(kmp)
- apache---httpd.conf详解
- 小程序入门学习07--动态设置标题、转发
- Linux操作Oracle(6)——Oracle11g OPatch 打补丁全纪录【Oracle11g windowsX64位环境+OPatch11.2.0.3.28】及资源下载