生活中你的家有客厅(Public),有你的卧室(Private)

客厅所有来的客人都可以过去,但是你的卧室是私有的,也就是说只有你能进去

但是呢,你也可以允许你的好闺蜜好基友进去

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

  • 友元的目的就是让一个函数或者类访问另一个类中的私有成员
  • 友元的关键字为 friend

友元的三种实现:

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

1. 全局函数做友元

friend void goodGay(Building *building);

#include <iostream>
#include <string>
using namespace std; class Building{
//告诉编译器goodGay全局函数是Building好朋友,可以访问Building中的私有成员
friend void goodGay(Building *building);
public:
Building(){
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
}
string m_SittingRoom; //客厅 private:
string m_BedRoom; //卧室
}; //全局函数
void goodGay(Building *building){
cout << "好基友的全局函数 正在访问:" << building->m_SittingRoom << endl;
cout << "好基友的全局函数 正在访问:" << building->m_BedRoom << endl;
} void test01(){
Building building;
goodGay(&building);
} int main(){
test01();
return 0;
}

2. 类做友元

friend class GoodGay;

#include <iostream>
#include <string>
using namespace std; class Building{
friend class GoodGay;
public:
Building();
string m_SittingRoom; //客厅 private:
string m_BedRoom; //卧室
}; class GoodGay{
public:
GoodGay();
void visit(); //参观函数,访问Building中的属性
Building *building;
}; //类外写成员函数
Building::Building(){
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
} GoodGay::GoodGay(){
//创建建筑物对象
building = new Building;
} void GoodGay::visit(){
cout << "好基友正在访问:" << building->m_SittingRoom << endl;
cout << "好基友正在访问:" << building->m_BedRoom << endl;
} void test01(){
GoodGay gg;
gg.visit();
} int main(){
test01();
return 0;
}

3. 成员函数做友元

friend void GoodGay::visit();

#include <iostream>
#include <string>
using namespace std; class Building; class GoodGay{
public:
GoodGay();
void visit(); //让visit函数可以访问Building中私有成员
void visit2(); //让visit2函数不可以访问Building中私有成员
Building *building;
}; class Building{
friend void GoodGay::visit();
public:
Building();
string m_SittingRoom; //客厅 private:
string m_BedRoom; //卧室
}; //类外写成员函数
Building::Building(){
m_SittingRoom = "客厅";
m_BedRoom = "卧室";
} GoodGay::GoodGay(){
//创建建筑物对象
building = new Building;
} void GoodGay::visit(){
cout << "visit正在访问:" << building->m_SittingRoom << endl;
cout << "visit正在访问:" << building->m_BedRoom << endl;
} void GoodGay::visit2(){
cout << "visit2正在访问:" << building->m_SittingRoom << endl;
//cout << "visit2正在访问:" << building->m_BedRoom << endl;
} void test01(){
GoodGay gg;
gg.visit();
gg.visit2();
} int main(){
test01();
return 0;
}

C++学习(11)—— 友元的更多相关文章

  1. JavaScript学习11 数组排序实例

    JavaScript学习11 数组排序实例 数组声明 关于数组对象的声明,以前说过:http://www.cnblogs.com/mengdd/p/3680649.html 数组声明的一种方式: va ...

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

    C++学习之友元类和友元函数       模板类声明也可以有友元,模板的友元可以分为以下几类:        1.非模板友元:        2.约束模板友元,即就是友元的类型取决于类被实例化的时候的 ...

  3. ThinkPhp学习11

    原文:ThinkPhp学习11 一.模板的使用        (重点) a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件[i ...

  4. c++学习之友元

    最近工作好累呀,晚上总是失眠,自学c++的步骤都放慢了,本来之前看c++ primer的,结果这本书讲的太细节了,初学者不是很好把握.所以我又重新找了个教程,比较适合初学者.今天学习到友元函数和友元类 ...

  5. C++学习12 友元函数和友元类

    友元函数和友元类在实际开发中较少使用,想快速学习C++的读者可以跳过本节. 一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有 ...

  6. 【Spark深入学习-11】Spark基本概念和运行模式

    ----本节内容------- 1.大数据基础 1.1大数据平台基本框架 1.2学习大数据的基础 1.3学习Spark的Hadoop基础 2.Hadoop生态基本介绍 2.1Hadoop生态组件介绍 ...

  7. springboot实战(汪云飞)学习-1-1

    java EE开发的颠覆者 spring boot 实战 随书学习-1 1.学习案例都是maven项目,首先要在eclipse 中配置 maven,主要修改maven的配置文件:配置文件下载链接: h ...

  8. django学习-11.开发一个简单的醉得意菜单和人均支付金额查询页面

    1.前言 刚好最近跟技术部门的[产品人员+UI人员+测试人员],组成了一桌可以去公司楼下醉得意餐厅吃饭的小team. 所以为了实现这些主要点餐功能: 提高每天中午点餐效率,把点餐时间由20分钟优化为1 ...

  9. python爬虫学习(11) —— 也写个AC自动机

    0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...

  10. ExtJS4.2学习(11)可拖放的表格(转)

    鸣谢:http://www.shuyangyang.com.cn/jishuliangongfang/qianduanjishu/2013-11-18/180.html --------------- ...

随机推荐

  1. QFileInfo().created() 警告 created is deprecated 怎么改?

    有这样一行代码操作: QFileInfo(...).created().toString(...); QtCreator提示警告: 'created' is deprecated 'created' ...

  2. Spring Security教程(一)

    一 概要 Spring Security,这是一种基于 Spring AOP 和 Servlet 过滤器的安全框架.它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权.这 ...

  3. Java基础之十三 字符串

    第十三章 字符串 13.1 不可变String String对象是不可变的.String类中每一个看起来会修改String值得方法,实际上都是创建了一个全新得String对象,以包含修改后得字符串内容 ...

  4. pandas 获取不符合条件的dataframe

    pandas 获取不符合条件的dataframe 或将其过滤掉: df[df["col"].str.contains('this'|'that')==False] >> ...

  5. SourceTree安装

    SourceTree安装教程 作为程序员,不可避免的要在github上查询代码,而在企业项目中,为了使得项目好管理需要使用项目管理客户端,所以接下来详细讲解一下基于git的sourceTree在win ...

  6. HashTable源码

    1. 为什么无法创建更大的数组? Attempts to allocate larger arrays may result in OutOfMemoryError 如果数组长度过大,可能出现的两种错 ...

  7. python实现栈结构

    # -*- coding:utf-8 -*- # __author__ :kusy # __content__:文件说明 # __date__:2018/9/30 17:28 class MyStac ...

  8. 怎么用命令行把apk安装到移动设备上?

    1.移动设备通过USB连接电脑 2.执行命令adb install [apk文件的路径]

  9. Flink基本的API

    Flink使用 DataSet 和 DataStream 代表数据集.DateSet 用于批处理,代表数据是有限的:而 DataStream 用于流数据,代表数据是无界的.数据集中的数据是不可以变的, ...

  10. mvn clean -U -e -B -X的作用 查看详细出错信息

    https://blog.csdn.net/u014515854/article/details/79820497     在持续集成服务器上使用怎样的 mvn 命令集成项目,这个问题乍一看答案很显然 ...