目录

一、概念

二、全局函数做友元

三、类做友元

四、成员函数做友元


一、概念

在C++的类中,有些私有属性想要类外的特殊函数或者类进行访问,就用到友元

分类:

①全局函数做友元

②类做友元

③成员函数做友元


二、全局函数做友元

创建home类与测试函数test01;类中加上私有属性bed_room并赋值为卧室,加上公共属性sitting_room并赋值为客厅,尝试打印输出

class home
{
public:home(){sitting_room = "客厅";bed_room = "卧室";}public:string sitting_room;
private:string bed_room;
};
void test01(home room)
{cout << "正在访问->" << room.sitting_room << endl;
}

不过,若是想访问bed_room;会发现不可访问,因为卧室是私有属性

这时,就可以用到友元将函数名整个放到类中,并在最前面加上friend

由此便可以访问私有属性bed_room;


三、类做友元

首先创建Guy类和Room类,Guy类中有函数Guy和函数visit以及roomRoom类中有构造房屋函数Room以及私有房屋bed_room/公共房屋sitting_room

class Room;
class Guy
{
public:Guy();void visit(); // 访问Room中的属性Room* room;
};
class Room
{
public:Room();string sitting_room;
private:string bed_room;
};
Room::Room()
{bed_room = "卧室";sitting_room = "客厅";
}
Guy::Guy()
{room = new Room; // 创建屋子对象
}
void Guy::visit()
{cout << "正在访问" << room->sitting_room << endl;cout << "正在访问" << room->bed_room << endl;
}
void test()
{Guy f;f.visit();
}

在test中使用Guy函数创建对象f(创建时调用Guy函数,会new一个Room出来,又调用了Room函数,初始化了sitting_room和bed_room),再使用对象f调用函数visit,visit函数则会访问sitting_room

尝试访问私有权限bed_room

私有权限,目前不能访问

同样的,将整个类名放在类中,并在前面加上friend,表明其可以访问Room的私有属性


四、成员函数做友元

同样的,与上面三相同的创建代码

class Room;
class Guy
{
public:Guy();void visit();Room* room;
};
class Room
{friend void Guy::visit();
public:Room();
public:string sitting_room;
private:string bed_room;
};
Room::Room()
{this->bed_room = "卧室";this->sitting_room = "客厅";
}Guy::Guy()
{room = new Room;
}
void Guy::visit()
{cout << "正在访问 " << room->sitting_room << endl;cout << "正在访问 " << room->bed_room << endl;
}
void test()
{Guy g;g.visit();
}

此时能输出公共权限的sitting_room;

 无法访问私有权限的bed_room;

我们将整个函数名放在类中,记得前面加friend,中间要加Guy::表明是Guy的函数

成功访问并输出

C++之 友元(friend)相关推荐

  1. C++ 笔记(30)— 友元函数与友元类

    我们知道类的私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行.这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦. ...

  2. C++ primer 第七章之 友元函数与友元类

    1.为什么需要友元函数?  类具有封装和信息隐藏的特性: 只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的 ; 非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公 ...

  3. 友元函数、类的非静态成员函数、静态成员函数的区别

    类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...

  4. C++——运算符的重载---以成员函数方式重载---以友元函数方式重载

    一.运算符的重载 1.运算符的重载 允许把标准运算符(如+ - * /等运算符)应用于自定义数据类型的对象,可以提高程序的可读性,运算符的重载本质上还是函数重载.运算符仅仅是语法上的方便,它是另一种函 ...

  5. C++运算符重载形式--成员函数or友元函数?

    1.C++操作符重载形式-成员函数or友元函数 1.对运算符重载,需要坚持四项基本原则: 不可臆造运算符: 运算符原有操作数的个数.优先级和结合性不能改变: 操作数中至少一个是自定义类型: 保持重载运 ...

  6. C++中的友元函数friend

    1.C++中的友元函数 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员.尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数.友 ...

  7. 友元类实例:日期类 学生类

    1.定义Date类 : Date类中定义了三个私有数据成员(year ,month,day) 2.定义Student类: 在Student类中定义了两个私有数据成员(name[] ,birthday) ...

  8. C++中友元类使用场合

    在C++中我们可以將函数定义成类的友元函数,这样在函数中就可以访问类的私有成员.与函数相同,类也可以作为另一个类的友元类,在友元类中可以访问另外一个类的所有成员. 声明友元类的方法很简单,只需在类中写 ...

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

    友元函数 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下: frien ...

  10. 运算符中的二元重载,为什么要调用友元函数而不是全局函数的问题

    #include <iostream>using namespace std; //实现运算符的重载 class A { public:A(int real=0,int imaginary ...

最新文章

  1. flume taildir 启动异常LifecycleSupervisor$MonitorRunnable.run
  2. (转)三大博弈定义+结论
  3. mysql for mac中文_mysql for Mac 下创建数据表中文显示为?的解决方法
  4. 高并发用redis还是mysql_高并发架构系列:Redis缓存和MySQL数据一致性方案详解
  5. 2018-12-21 作业
  6. epel安装第三方扩展源后,运行yum报错的解决方案
  7. Android Studio升级到3.0,抛出Aapt2Exception异常
  8. Ubuntu系统死机解决办法
  9. 究竟什么是嵌入式? 嵌入式开发是什么意思?
  10. html 中各种鼠标手势
  11. 一位acm过来人的心得
  12. chm电子书字体大小的调整
  13. 软件版本中的Alpha,Beta,RC,Trial是什么意思?
  14. uni-app知识点整理
  15. [RPI]关于树莓派3B+的AV接口(RCV)
  16. opensuse下安装网易云音乐netease-cloud-music
  17. ABBYY FastML:一种用于大型文档流处理的客户端机器学习新方案。
  18. MySql 如何将一维表变成二维表
  19. u盘计算机软件,电脑U盘管理工具 计算机U盘管理软件的使用
  20. 【Excel VBA】VBE

热门文章

  1. LuatOS | 全新在线模拟器,随时随地发挥创意
  2. 生产任务计划单,金蝶KIS旗舰版专业版K3WISE,生产管理软件ERP,金蝶生产任务管理,生产计划管理,自动下推生产领料单
  3. Redis Client UI工具
  4. 蚂蚁电竞ANT27VQ评测
  5. 获取一个网址http://www.veryyx.com/......中的www.veryyx.com
  6. (41)Decal [ 贴花] Actor
  7. 终于还是对闲鱼下手了。闲鱼爬虫,idlefish spider来了
  8. 瓷砖铺贴方法_12种最好看的瓷砖铺贴方式!
  9. 一款非常方便简单的Mac个人理财软件:Moneydance
  10. Python之字符编码与文件操作