首页 > 编程语言 >C++--static成员和友元

C++--static成员和友元

时间:2024-09-09 13:22:33浏览次数:11  
标签:友元 函数 -- 成员 定义 static cout

1 static

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化

静态定义的成员变量在类外定义,变量类型 类名::变量名=value的形式。

此外,static还可以在类里面定义函数,这种static修饰的函数在外调用必须加域名才能使用,因为static修饰的函数不会隐含this指针。

2 友元

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多
用。
友元分为:友元函数和友元类

2.1 友元函数

通过实现重载operator<<去理解友元函数

在之前定义的日期类时,我们实例化日期对象然后去打印日期类的年月日定义了打印函数

我们可以这样去实现日期对象成员变量的值打印,但我们是否能利用重载实现通过cout<<的形式将的内容打印出来呢?

这时候我们就需要去定义一个重载函数operator<<。

这样我们就能在主函数去调用重载函数实现打印,其实d1.operator<<(cout)其实等价于d1<<cout。

但是,这样不是很方便也不符合我们常规写法,我们希望的写法是cout<<d1。

由于类里面定义的函数默认都有一个Data *this的指针参数,在外调用的时候都会将对象的地址传入,例如d1.operator(cout)==d1.operator(&d1,cout)。这个顺序是编译器默认的,不允许修改或者交换的,要达到cout<<d1的想法我们无法实现cout.operator<<(&d1),所以我们只能让它不为我们默认传入参数,我们自己定义传入参数,这时就需要用到static去实现。

所以我们的代码就变成了这样:

把函数定义在类外,不让编译器帮我我们默认添加一个Date*this的参数,并且我们自己加入Date*d,并且放到ostream&_cout的后面,但这时由于权限的问题,类外无法访问类内的成员变量,所以我们需要通过友元friend声明一下。

这样就能实现cout<<d1的效果了。

但这只能实现cout<<d1的效果,那如果想要实现cout<<d1<<d2<<endl的效果呢,这时就需要将函数稍微修改一下。

 

这样就能达到每次输出之和都会返回一个cout去输出下一个。

总结

因为cout的输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作数了。但是实际使用中cout需要是第一个形参对象,才能正常使用。所以要将operator<<重载成全局函数。但又会导致类外没办法访问成员,此时就需要友元来解决。operator>>同理。

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。

说明:
友元函数可访问类的私有和保护成员,但不是类的成员函数
友元函数不能用const修饰
友元函数可以在类定义的任何地方声明,不受类访问限定符限制
一个函数可以是多个类的友元函数
友元函数的调用与普通函数的调用原理相同

2.2 友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。

 

友元关系是单向的,不具有交换性。
比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
友元关系不能传递如果B是A的友元,C是B的友元,则不能说明C时A的友元。
友元关系不能继承。

标签:友元,函数,--,成员,定义,static,cout
From: https://blog.csdn.net/m0_63703622/article/details/142025648

相关文章

  • 微盟集团:营收下降、股价暴跌,投资者信心何时归?
    在近日发布的2024年中期业绩报告中,微盟集团(HK:02013)再次向市场展示了其深陷困境的财务现状。这家曾被誉为“SaaS第一股”的云端商业及营销解决方案提供商,如今却面临着收入增长乏力、盈利遥遥无期、市场信心严重受挫的多重困境。报告显示,微盟集团2024年上半年的营业收入仅为8......
  • OPPO市场份额跌跌不休,AI能否成为翻身关键?
    在智能手机市场的新一轮回暖中,众多品牌纷纷抓住了机遇,实现了出货量的显著提升。然而,曾经的市场领头羊OPPO却在这场竞赛中黯然失色,其市场份额和出货量均出现了明显的下滑,甚至在全球市场中的排名也一再跌落。面对如此严峻的形势,OPPO将全部希望寄托在了AI技术上,试图通过这一革命性......
  • 奇瑞车模表演引众怒,低俗营销何时休?上市之路蒙阴影
    在最近的2024成都车展上,奇瑞汽车再次被推上了舆论的风口浪尖。这次,不是因为其车型的创新或技术的突破,而是因为车模的争议性表演。据现场视频显示,奇瑞iCAR展位的一名车模在车展上作出了大尺度的动作,引发了大量围观和拍照,其中不乏儿童的身影。这一幕迅速在网络上引发了广泛争议,不......
  • 数据结构与算法(三)线性表的定义与抽象数据类型
    目录一、感受线性表的存在二、线性表的定义三、考题模拟1、请问公司的组织架构是否属于线性关系?2、那么班级同学的友谊呢?3、那么班级的点名册是不是线性表?四、抽象数据类型1、数据类型的定义:2、抽象数据类型一、感受线性表的存在    从这一篇开始,我们将介......
  • 高并发环境下用户余额系统的优化设计
    引言在高并发环境下,用户余额系统的设计需要特别关注数据的一致性问题。本文将探讨如何通过引入版本号机制来优化CAS乐观锁,解决ABA问题,从而保证系统的数据一致性。同时,我们将通过封装数据库连接和用户余额操作类来提高代码的可维护性和复用性。业务场景描述假设我们有一......
  • MATLAB卡尔曼|卡尔曼滤波的公式【线性】
    卡尔曼滤波卡尔曼滤波(KalmanFilter)是一种用于估计系统状态的数学算法,不是类似于高通、低通滤波器那样的频域滤波。卡尔曼滤波基于线性动态系统的假设,它将系统的状态表示为均值和协方差矩阵,通过递归地更新和预测这些值来实现对系统状态的估计。卡尔曼滤波有两个主要的步......
  • 免费一年期政务版SSL证书申请途径
    免费一年期政务版SSL证书的申请,目前市场上较为有限的选择是JoySSL。JoySSL是一个提供教育版和政务版免费一年期SSL证书的国产自主品牌,其证书被广泛接受和认可,能够满足政务网站的基本安全需求。以下是申请免费一年期政务版SSL证书的具体步骤:一、访问JoySSL官网并注册账号访问......
  • 【待做】【python脚本】使用python脚本解析netflow抓包数据到csv
    一、使用linux自带的tcpdump抓包二、将抓好的包导入wireshark三、将数据导出为json文件四、解析数据到csv五、运行解析脚本原创圈圈网络技术干货圈本文主要讲解了linux下通过tcpdump抓取netflow数据包,并将其导入到wireshark进行解析,然后通过wireshark导出数据为jso......
  • 电动自行车轮胎规格参数图解教程 All In One
    电动自行车轮胎规格参数图解教程AllInOne电动车轮胎参数单位换算1in/1英寸=>2.54cm/2.54厘米https://convertlive.com/zh/u/转换/英寸/自/厘米#10轮胎参数轮胎尺寸(英寸):轮毂尺寸(英寸):10in轮胎宽度/断面宽度(厘米):7.6cm轮胎壁高度(厘米):7.6cm......
  • 更换Linux系统镜像源
    更换Linux系统镜像源切换镜像源通常是为了提高软件包下载的速度和稳定性。以下是CentOS7切换镜像源的一般步骤:一、安装wget(如果尚未安装)首先,需要确保系统中安装了wget工具,因为wget可以用来下载文件。如果系统中没有wget,可以通过以下命令安装:yuminstall-ywget二、选择并......