C++之“友元类”学习笔记

【C++】友元函数和友元类(作用及优缺点) 目录 一、友元函数 二、友元类 三、友元的优缺点 一、友元函数 结合着类的特性,可知:类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。 为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但它需 阅读详情

=======================什么是友元类=======================

      当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问。我们就把类B叫做类A的友元。

=======================友元类能做什么=======================

      友元类可以通过自己的方法来访问把它当做朋友的那个类的所有成员。但是我们应该注意的是,我们把类B设置成了类A的友元类,但是这并不会是类A成为类B的友元。说白了就是:甲愿意把甲的秘密告诉乙,但是乙不见得愿意把乙自己的秘密告诉甲。

=======================友元类的声明方法和其用法=======================

      声明友元类的方法其实很简单,只要我们在类A的成员列表中写下如下语句:

 

friend class B;


这样一来,类B就被声明成了类A的友元。注意,类B虽然是类A的友元,但是两者之间不存在继承关系。这也就是说,友元类和原来那个类之间并没有什么继承关系,也不存在包含或者是被包含的关系,友元类和我上一篇博文《谈谈:C++类的“包含”机制》中的包含是完全不一样的!

=======================友元类的一个具体例子=======================

      在这里,我们引用一个我从网上收集到的例子来说明友元类的作用:假设我们要设计一个模拟电视机和遥控器的程序。大家都之道,遥控机类和电视机类是不相包含的,而且,遥控器可以操作电视机,但是电视机无法操作遥控器,这就比较符合友元的特性了。即我们把遥控器类说明成电视机类的友元。下面是这个例子的具体代码:

#include <iostream>

using namespace std;

class TV 

{

    public:

      friend class Tele;

      TV():on_off(off),volume(20),channel(3),mode(tv){}

    private:    

      enum{on,off};

      enum{tv,av};

      enum{minve,maxve=100};

      enum{mincl,maxcl=60};

      bool on_off;

      int  volume;

      int channel;

      int mode;

};

class Tele

{

    public:

       void OnOFF(TV&t){t.on_off=(t.on_off==t.on)?t.off:t.on;}

       void SetMode(TV&t){t.mode=(t.mode==t.tv)?t.av:t.tv;}

       bool VolumeUp(TV&t);

       bool VolumeDown(TV&t);

       bool ChannelUp(TV&t);

       bool ChannelDown(TV&t);

       void show(TV&t)const;    

};

bool Tele::VolumeUp(TV&t)

{

    if (t.volume<t.maxve)

    {

        t.volume++;

        return true;

    } 

    else

    {

        return false;

    }

}

bool Tele::VolumeDown(TV&t)

{

    if (t.volume>t.minve)

    {

        t.volume--;

        return true;

    } 

    else

    {

        return false;

    }

}

bool Tele::ChannelUp(TV&t)

{

    if (t.channel<t.maxcl)

    {

        t.channel++;

        return true;

    } 

    else

    {

        return false;

    }

}

bool Tele::ChannelDown(TV&t)

{

    if (t.channel>t.mincl)

    {

        t.channel--;

        return true;

    } 

    else

    {

        return false;

    }

}

void Tele::show(TV&t)const

{

    if (t.on_off==t.on)

    {

        cout<<"电视现在"<<(t.on_off==t.on?"开启":"关闭")<<endl;

        cout<<"音量大小为:"<<t.volume<<endl;

        cout<<"信号接收模式为:"<<(t.mode==t.av?"AV":"TV")<<endl;

        cout<<"频道为:"<<t.channel<<endl;

 

    } 

    else

    {

        cout<<"电视现在"<<(t.on_off==t.on?"开启":"关闭")<<endl;

    }

     

}

int main()

{

    Tele t1;

    TV t2;

    t1.show(t2);

    t1.OnOFF(t2);

    t1.show(t2);

    cout<<"调大声音"<<endl;

    t1.VolumeUp(t2);

    cout<<"频道+1"<<endl;

    t1.ChannelUp(t2);

    cout<<"转换模式"<<endl;

    t1.SetMode(t2);

    t1.show(t2);

    return 0;

}


我们在程序的第6行定义了一个TV电视机类的友元类Tele。那么程序中就可以来调用TV类中的私有成员。下面,是该程序的输出:

  因为友元类有可能会破坏数据的安全性,我们还是少用。

 

C++学习笔记3 友元 C++学习笔记3 0.概述 友元提供了一种 普通函数或者类成员函数 访问另一个类中的私有或保护成员 的机制。也就是说有两种形式的友元: (1)友元函数:普通函数对一个访问某个类中的私有或保护成员。 (2)友元类:类A中的成员函数访问类B中的私有或保护成员 优点:提高了程序的运行效率。 缺点:破坏了类的封装性和数据的透明性。 总结: - 能访问私有成员 - 破坏封装性 - 友元关系不可传递 - 友元关系的单向性 - 友元声明的形式及数量不受限制 1.友元函数 在类声明的任何区域中声明,而定义则在类的外部。 f 阅读详情

相关推荐

电视机与遥控器(友元类)

电视机与遥控器(友元类)题目描述有如下的电视类和遥控器类,遥控器可以控制电视。要求如下:1.     实现并完善Tv类;2.     将Remote设为Tv的友元类,以支持在Remote类中对Tv方法的调用。3.     在main函数中,通过Remote实例对TV实例进行操作。输入第一行,电视初始状态,依次为state,volume,channel,mode,input的初始值。第二行,利用遥控...

Xindolia_Ring的博客 3321

【C++】友元类 ( 友元类简介 | 友元类声明 | 友元类单向性 | 友元类继承性 | 友元类作用 | 友元类和友元函数由来 | Java 反射机制 | C / C++ 编译过程 )

一、友元类简介 1、友元类引入 2、友元类声明 3、友元类单向性 4、友元类继承性 5、友元类作用 二、友元类和友元函数由来 1、友元类和友元函数引入 2、Java 反射机制 3、C / C++ 编译过程 三、友元类代码示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 6724

在Redroid容器中构建Frida RPC服务:自动化生成淘宝X-Sign签名参数

本文详细介绍了在Redroid容器中构建Frida RPC服务,实现自动化生成淘宝X-Sign等签名参数的完整方案。通过逆向分析定位关键方法,定制Redroid系统使Frida-Server常驻运行,并编写Frida脚本将签名方法暴露为RPC接口,最终封装为可远程调用的微服务,解决了签名生成的可移植性与工程化难题。

ice55的博客 645

C++ 友元类

1.在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义为私有成员,成员函数一般都定义为公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。 2.友元类 : 友元类的所有成员函数都是另一个类的友

weixin_43107240的博客 4万+

手把手教你用内核远程call实现64位进程注入(附完整ShellCode示例)

本文深入探讨了在Windows 64位环境下,通过内核态直接操作线程TrapFrame结构实现进程注入的高级技术。文章提供了从驱动框架设计、用户态-内核态通信,到定位修改TrapFrame、编写Shellcode及执行环境恢复的完整实战指南,并附有详细的代码示例,为安全研究人员和开发者提供了绕过用户态检测、实现底层远程代码执行的新思路。

weixin_28396629的博客 346

基于Python的Booking酒店数据爬虫实战:最新技术与完整代码解析

本文将详细介绍如何使用Python构建一个高效的Booking酒店数据爬虫,涵盖从基础爬取到高级反反爬技术的完整实现。我们将使用最新的Python爬虫技术栈,包括requests-html、Playwright、智能代理轮换等技术,并提供完整的可运行代码示例。文章将深入探讨爬虫的各个组成部分,包括数据提取、存储、反反爬策略以及性能优化等方面。关键词:Python爬虫、Booking数据采集、反反爬技术、Playwright、数据存储。

2201_76125261的博客 936

C++ 之“友元类”学习笔记

=======================什么是友元类=======================       当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问。我们就把类B叫做类A的友元。 =======================友元类能做什么=======================       友元类可以通过自己的方法来访问把它当

永久指针 786

深入理解SQL注入中的union select 1,2,3....

UNION 用于合并两个查询的结果集

渗透之路,攻防之间皆学问 2万+

C++友元类

友元类 不仅可以将一个函数声明为一个类的“朋友”,还可以将一个类(例如 B类)声明为另一个类(例如 A类)的“朋友”。这时B类就是A类的友元类。友元类B中的所有函数都是A类的友元函数,可以访问A类中的所有成员。 声明友元类的一般形式为: friend class 类名; 所以,可以在A类的定义体中,可以使用如下语句声明B类为其友元类: friend class B; 那么,类B是类A的友元类。所以,类B的成员函数就可以访问类A的私有成员。 ...

LC的专栏 7399

Hermes 教程 03:Skills 系统

摘要:Hermes Skills是一种自我改进机制,可将解决问题的经验保存为可复用技能文档。v0.13.0版本遵循agentskills.io开放标准,与Claude Skills互通。技能创建流程包括发现问题、创建技能文件、加载使用和优化更新四个阶段。系统提供技能检索和自维护机制(Curator),支持技能媒体路由和多种管理命令。内置技能涵盖开发调试、创意头脑风暴等场景,通过积累技能使Hermes更适应用户需求。

程序猿_三产 732

图机器学习(7)——图神经网络 (Graph Neural Network, GNN)

图神经网络 (Graph Neural Network, GNN) 是一类专门处理图结构数据的深度学习方法。这类方法也被称为几何深度学习 (geometric deep learning),在社交网络分析、计算机图形学等众多领域正受到日益广泛的关注。在本节中,我们介绍了 GNN 的核心原理,将卷积等经典深度学习范式拓展至非欧几里得图空间,实现了局部结构与全局特征的层次化提取。

盼小辉丶的博客 1万+
上一篇: C++类的“包含”机制
下一篇: #define #ifndef #endif
p_m_notes
博客等级 码龄14年 3粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值