友元概述(需快速查阅看文末总结)

友元:顾名思义,就像朋友一样的元素

  • 好比一个人个房屋内,有客厅和卧室,卧室比较私人(private),一般客人无法访问,只能在客厅这个公有环境(public)里面移动.
  • 而友元的出现,就好比是自己的好基友来到了家里,可以让好基友进入自己的私人卧室.

友元让private修饰的变量属性不再绝对的私有.在必要的时候可以使用friend关键字进行修饰访问.
具体用法如下:

全局函数做友元

全局函数是指在类外以及main函数之外的函数叫全局函数,作用域是全局.

bedroom是私有属性,但是可以通过让全局函数变成友元函数来进行访问.

/* 客厅public,卧室 private
但是有特殊权限的,访问私有的内容
要用到友元技术关键字为friend三种实现:
- 全局函数做友元
- 类做友元
- 成员函数做友元 */
#include <iostream>
using namespace std;
#include <string>
class Building
{// goodgay这个函数是Building的一个好朋友,可以访问里面的私有成员.friend void goodgay(Building *buliding);
public:// 建筑物Building(){sittingRoom = "客厅";bedroom = "卧室";}public:string sittingRoom;private:string bedroom;
};
// 全局函数
void goodgay(Building *buliding)
{cout << "好基友的全局函数正在访问: " << buliding->sittingRoom << endl;cout << "好基友的全局函数正在访问: " << buliding->bedroom << endl;
}
void test01()
{Building building;goodgay(&building);
}
int main()
{test01();system("pause");return 0;
}

友元类

在这个例子中

  • GoodGay类创建了一个Building类的指针,那么在GooGay类里面就可以访问Building类的元素
  • 但是Building类中的私有成员变量bedroom访问不到
  • 在Building类中声明加上friend关键字的GoodGay类就可以让类称为友元类,就可以访问Building类中的私有成员.

此外,在类外写构造函数和方法的时候,一定要加上作用域: 类名::函数体

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

成员函数做友元

  • 刚刚说明了全局函数来访问私有属性,通过其他类的类内指针来访问私有属性
  • 现在还可以通过成员函数来访问私有属性.

我们先创建两个成员函数: visit()和visit2()来进行比较.
这两个成员函数都是GoodGay的成员函数,一开始他们都没有权限去访问Building的私有属性
但是,在Building类中声明了 GoodGay作用域下的visit()函数是"朋友",可以访问私有属性,于是visit()函数就可以访问卧室了

一定要记住声明作用域!

#include <iostream>
using namespace std;
#include <string>
class Building;
class GoodGay
{public:GoodGay();void visit();  //让visit函数可以访问building中私有成员的内容void visit2(); //让visit2函数不可以访问building中私有成员的内容.Building *building;
};
class Building
{friend void GoodGay::visit();// 告诉编译器,GoodGay下的visit函数作为本类的好朋友,可以访问私有的成员.
public:Building();
public:string sittingRoom;private:string beadroom;
};Building::Building()
{sittingRoom = "客厅";beadroom = "卧室";
}GoodGay::GoodGay()
{building = new Building;
}void GoodGay::visit()
{cout << "visit 函数正在访问" << building->sittingRoom << endl;cout << "visit 函数正在访问" << building->beadroom << endl;
}
void GoodGay::visit2()
{cout << "visit2 函数正在访问" << building->sittingRoom << endl;//  cout << "visit2 函数正在访问" << building->beadroom << endl; 报错
}
void test01()
{GoodGay gg;gg.visit();gg.visit2();
}int main()
{test01();system("pause");return 0;
}

总结

方式 代码
全局函数做友元 friend 函数类型 函数名(参数);,如 friend void test(int a);
类做友元 friend class 类名,如 friend class Test;
成员函数做友元 friend 函数类型 类名::函数名(参数); 如 friend void Test::test(int a );

C++面向对象:友元关键字friend的使用相关推荐

  1. JAVA面向对象-----final关键字

    JAVA面向对象-–final关键字 1:定义静态方法求圆的面积 2:定义静态方法求圆的周长 3:发现方法中有重复的代码,就是PI,圆周率.1:如果需要提高计算精度,就需要修改每个方法中圆周率. 4: ...

  2. php声明对象的关键字是,PHP面向对象this关键字!

    原标题:PHP面向对象this关键字! 如果想在对象内部,让对象里的方法访问本对象的属性,或对象中的方法去调用本对象的其他方法呢? PHP提供了一个本对象的引用$this,每一个对象里都 有一个对象的 ...

  3. java面向对象三个关键字_Java_面向对象_this关键字

    面向对象_this关键字 1.1 this调用构造方法 在之前学习方法之间调用时,可以通过方法名进行调用.可是针对构造方法,无法通过构造方法名来相互调用. 构造方法之间的调用,可以通过this关键字来 ...

  4. 面向对象之关键字 this

    面向对象之关键字 this 在java 中this可以完成三件事:表示本类属性,表示本类方法,表示当前对象 1.通过this关键字可以明确的去访问一个程用变量 class Hero { //新建一个H ...

  5. javascript 面向对象 new 关键字 原型链 构造函数

    JavaScript面向对象 JavaScript 语言使用构造函数(constructor)作为对象的模板.所谓"构造函数",就是专门用来生成实例对象的函数.它就是对象的模板,描 ...

  6. Python入门(四)- 面向对象及关键字

    读者肯定听过 Python 中"一切皆对象"的说法,但可能并不了解它的具体含义,只是在学习的时候听说 Python 是面向对象的编程语言,本节将向大家详细介绍 Python 面向对 ...

  7. java面向对象:关键字 —(16)

    static:静态的 1.可以用来修饰的结构:主要用来修饰类的内部结构 属性.方法.代码块.内部类 2.static修饰属性:静态变量(或类变量) 2.1 属性,是否使用static修饰,又分为:静态 ...

  8. JAVA面向对象-----instanceof 关键字

    instanceof 关键字 1:快速演示instanceof Person p=new Person();System.out.println( p instanceof Person); 2:in ...

  9. 《java入门第一季》之面向对象this关键字

    /*起名字要做到见名知意.this:是当前类的对象引用.简单的记,它就代表当前类的一个对象.注意:谁调用这个方法,在该方法内部的this就代表谁.this的场景:解决局部变量隐藏成员变量 */ //定 ...

最新文章

  1. 浪潮的加班标语炸了,这是顶风作案?网传:1月加班87小时还要扣工资?
  2. SQL Server 个人手册
  3. ubuntu下vim的命令及使用方法
  4. python旅游推荐系统_如何用Python搭建一个简单的推荐系统?
  5. TFS中的迭代(五)
  6. python获得当前目录_python如何获取当前工程根目录
  7. init,service和systemctl的区别
  8. 【华为云技术分享】网络场景AI模型训练效率实践
  9. 2021-07-25 野火板子25MHz晶振改为正点原子8MH晶振
  10. 分享一下最近看的东西
  11. Win7删除不常用的自带应用程序
  12. Makefile:include和-include
  13. 机器人植入情感芯片利与弊_马斯克活猪脑机接口试验成功!多芯片植入,硬币大小,实时读取脑电波,已被批准人脑实验...
  14. Pandas处理缺失数据
  15. python按键精灵找图教程_按键精灵如何找图 按键精灵找图教程
  16. Air202学习(4)官方例程(luat版)
  17. 开源录屏软件Captura安装和使用
  18. c语言调用c 的库,C语言程序调用C库函数方法
  19. anaconda安装软件包
  20. 【花雕动手做】有趣好玩的音乐可视化系列小项目(19)--通体光纤灯

热门文章

  1. Python探索四大名著【红楼梦】人物之间的关系,红学家十级
  2. MTK Camera 开机启动流程
  3. 圣杯布局、双飞翼布局的理解及对比
  4. Bluehost主机同一站点绑定多个顶级域名的方法
  5. JAVA-什么是 Java?
  6. vue单页面应用和多页面应用
  7. Docker启动Tomcat容器
  8. groovy语言单元测试(spock)
  9. 520 | 机器人竟然对我表白了?!用Python假装自己有女朋友(附代码)
  10. Win7 系统原服务恢复